claude-mpm 4.1.12__tar.gz → 4.1.13__tar.gz
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.
- claude_mpm-4.1.13/BUILD_NUMBER +1 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/PKG-INFO +1 -1
- claude_mpm-4.1.13/VERSION +1 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/pyproject.toml +2 -2
- claude_mpm-4.1.13/src/claude_mpm/VERSION +1 -0
- claude_mpm-4.1.13/src/claude_mpm/cli/commands/monitor.py +156 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mpm_init.py +7 -2
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/built/dashboard.js +2 -0
- {claude_mpm-4.1.12/src/claude_mpm/dashboard/static/dist → claude_mpm-4.1.13/src/claude_mpm/dashboard/static/built}/socket-client.js +1 -1
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/css/activity.css +1521 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/css/dashboard.css +511 -0
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- {claude_mpm-4.1.12/src/claude_mpm/dashboard/static/built → claude_mpm-4.1.13/src/claude_mpm/dashboard/static/dist}/socket-client.js +1 -1
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/js/components/activity-tree.js +1639 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/code-tree.js +0 -17
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/module-viewer.js +21 -7
- claude_mpm-4.1.13/src/claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1066 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/connection-manager.js +1 -1
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/dashboard.js +196 -43
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/socket-client.js +2 -2
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/templates/index.html +95 -25
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/socketio_manager.py +1 -1
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring.py +1 -1
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm.egg-info/PKG-INFO +1 -1
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm.egg-info/SOURCES.txt +1 -0
- claude_mpm-4.1.12/BUILD_NUMBER +0 -1
- claude_mpm-4.1.12/VERSION +0 -1
- claude_mpm-4.1.12/src/claude_mpm/VERSION +0 -1
- claude_mpm-4.1.12/src/claude_mpm/cli/commands/monitor.py +0 -695
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/css/activity.css +0 -549
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2593
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm-4.1.12/src/claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1338
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/CLAUDE.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/LICENSE +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/MANIFEST.in +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/README.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/scripts/ticket +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/setup.cfg +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/BUILD_NUMBER +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/__main__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/BASE_PM.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/INSTRUCTIONS.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/MEMORY.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/OUTPUT_STYLE.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/WORKFLOW.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/agent-template.yaml +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/agent_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/agent_loader_integration.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/agents_metadata.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/async_agent_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/base_agent.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/base_agent_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/frontmatter_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/system_agent_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/agent-manager.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/agent-manager.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/api_qa.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/code_analyzer.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/data_engineer.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/documentation.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/engineer.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/imagemagick.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/memory_manager.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/ops.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/project_organizer.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/qa.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/refactoring_engineer.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/research.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/security.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/ticketing.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/vercel_ops_agent.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/version_control.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/web_qa.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/agents/templates/web_ui.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/__main__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/agent_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/agents.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/aggregate.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/analyze.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/analyze_code.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/cleanup.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/cleanup_orphaned_agents.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/configure.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/configure_tui.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/dashboard.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/debug.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/doctor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/info.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp_command_router.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp_config_commands.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp_install_commands.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp_pipx_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp_server_commands.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mcp_tool_commands.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/memory.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/mpm_init_handler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/run.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/socketio_monitor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/commands/tickets.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/agent_manager_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/agents_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/analyze_code_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/analyze_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/base_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/config_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/configure_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/dashboard_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/debug_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/mcp_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/memory_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/monitor_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/mpm_init_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/run_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/parsers/tickets_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/shared/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/shared/argument_patterns.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/shared/base_command.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/shared/error_handling.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/shared/output_formatters.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/startup_logging.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/ticket_cli.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli/utils.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli_module/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli_module/args.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli_module/commands.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/cli_module/migration_example.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/config/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/config/agent_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/config/experimental_features.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/config/paths.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/config/socketio_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/constants.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/agent_name_normalizer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/agent_registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/agent_session_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/base_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/cache.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/claude_runner.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/config_aliases.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/config_constants.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/constants.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/container.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/exceptions.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/factories.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/framework_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/hook_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/hook_performance_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/injectable_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/instruction_reinforcement_hook.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/interactive_session.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/interfaces.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/lazy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/log_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/logger.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/logging_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/minimal_framework_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/mixins.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/oneshot_session.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/optimized_agent_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/optimized_startup.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/output_style_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/pm_hook_interceptor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/service_registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/session_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/shared/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/shared/config_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/shared/path_resolver.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/shared/singleton_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/socketio_pool.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/tool_access_control.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/types.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/typing_utils.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/unified_agent_registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/unified_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/core/unified_paths.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/analysis_runner.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/index.html +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/open_dashboard.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/agent-inference.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/code-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/event-processor.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/event-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/export-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/hud-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/module-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/session-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/socket-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/built/components/working-directory.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/css/code-tree.css +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/css/connection-status.css +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/event-processor.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/export-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/session-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/dist/components/working-directory.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/agent-inference.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/build-tracker.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/code-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/connection-debug.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/event-processor.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/event-viewer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/export-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/hud-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/session-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/socket-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/components/working-directory.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/static/js/extension-error-handler.js +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/dashboard/test_dashboard.html +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/experimental/cli_enhancements.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/generators/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/generators/agent_profile_generator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/base_hook.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/connection_pool.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/event_handlers.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/hook_handler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/hook_wrapper.sh +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/installer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/memory_integration.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/response_tracking.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/services/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/services/connection_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/services/state_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/services/subagent_processor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/claude_hooks/tool_analysis.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/memory_integration_hook.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/tool_call_interceptor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/hooks/validation_hooks.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/init.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/models/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/models/agent_definition.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/models/agent_session.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/claude-hook-handler.sh +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/mcp_server.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/mcp_wrapper.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/mpm_doctor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/socketio_daemon.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/socketio_daemon_hardened.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/socketio_server_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/scripts/start_activity_logging.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agent_capabilities_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/agent_builder.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_config_provider.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_configuration_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_definition_factory.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_deployment.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_discovery_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_environment_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_filesystem_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_format_converter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_metrics_collector.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_operation_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_record_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_state_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_template_builder.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_version_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agent_versioning.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/agents_directory_resolver.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/async_agent_deployment.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/base_agent_locator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/config/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/config/deployment_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/config/deployment_config_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/deployment_config_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/deployment_results_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/deployment_type_detector.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/deployment_wrapper.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/facade/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/facade/deployment_facade.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/interface_adapter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/lifecycle_health_checker.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/multi_source_deployment_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/processors/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/processors/agent_processor.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/results/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/results/deployment_metrics.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/results/deployment_result_builder.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/single_agent_deployer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/strategies/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/strategies/base_strategy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/strategies/project_strategy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/strategies/strategy_selector.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/strategies/system_strategy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/strategies/user_strategy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/system_instructions_deployer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/validation/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/validation/agent_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/validation/deployment_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/validation/template_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/deployment/validation/validation_result.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/loading/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/loading/agent_profile_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/loading/base_agent_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/loading/framework_agent_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/management/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/management/agent_capabilities_generator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/management/agent_management_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/agent_memory_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/agent_persistence_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/content_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/memory_categorization_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/memory_file_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/memory_format_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/memory_limits_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/memory/template_generator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/registry/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/registry/deployed_agent_discovery.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/agents/registry/modification_tracker.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/async_session_logger.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/claude_session_logger.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/agent_cleanup_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/agent_dependency_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/agent_listing_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/agent_output_formatter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/agent_validation_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/dashboard_launcher.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/memory_crud_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/memory_output_formatter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/session_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/cli/startup_checker.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/command_deployment_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/command_handler_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/communication/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/cache_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/interfaces/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/interfaces/agent.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/interfaces/communication.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/interfaces/infrastructure.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/interfaces/service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/interfaces.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/memory_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/path_resolver.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/service_container.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/core/service_interfaces.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/agent_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/base_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/common_issues_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/configuration_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/filesystem_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/installation_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/instructions_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/mcp_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/monitor_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/checks/startup_log_check.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/diagnostic_runner.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/doctor_reporter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/diagnostics/models.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/event_aggregator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/event_bus/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/event_bus/config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/event_bus/direct_relay.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/event_bus/event_bus.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/event_bus/relay.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/consumers/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/consumers/dead_letter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/consumers/logging.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/consumers/metrics.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/consumers/socketio.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/core.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/interfaces.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/producers/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/producers/hook.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/events/producers/system.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/exceptions.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/content_assembler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/content_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/deployment_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/header.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/section_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/framework_claude_md_generator/version_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/hook_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/context_preservation.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/daemon_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/logging.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/aggregator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/legacy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/network.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/process.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/resources.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/infrastructure/monitoring/service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/auto_configure.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/config/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/config/config_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/config/config_schema.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/config/configuration.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/exceptions.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/interfaces.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/process_pool.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/main.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/registry/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/server/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/builder.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/cache/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/cache/shared_prompt_cache.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/cache/simple_cache.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/indexed_memory.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/optimizer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory/router.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/memory_hook_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/monitor_build_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/port_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/analyzer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/analyzer_refactored.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/analyzer_v2.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/architecture_analyzer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/dependency_analyzer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/language_analyzer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/metrics_collector.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/project/registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/recovery_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/response_tracker.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/runner_configuration_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/session_management_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/shared/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/shared/async_service_base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/shared/config_service_base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/shared/lifecycle_service_base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/shared/manager_base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/shared/service_factory.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/client_proxy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/event_normalizer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/base.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/code_analysis.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/connection.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/connection_handler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/file.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/git.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/hook.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/memory.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/project.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/handlers/registry.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/migration_utils.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/server/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/server/broadcaster.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/server/connection_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/server/core.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/server/eventbus_integration.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio/server/main.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio_client_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/socketio_server.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/subprocess_launcher_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/system_instructions_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_services/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_services/crud_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_services/formatter_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_services/search_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_services/validation_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/ticket_services/workflow_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/utility_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_control/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_control/branch_strategy.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_control/conflict_resolution.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_control/git_operations.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_control/semantic_versioning.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_control/version_parser.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/version_service.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/visualization/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/services/visualization/mermaid_generator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/storage/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/storage/state_storage.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/ticket_wrapper.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/tools/__main__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/tools/code_tree_analyzer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/tools/code_tree_builder.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/tools/code_tree_events.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/tools/socketio_debug.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/agent_dependency_loader.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/config_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/console.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/dependency_cache.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/dependency_manager.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/dependency_strategies.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/environment_context.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/error_handler.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/file_utils.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/framework_detection.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/import_migration_example.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/imports.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/path_operations.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/robust_installer.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/session_logging.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/utils/subprocess_utils.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/validation/__init__.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/validation/agent_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm/validation/frontmatter_validator.py +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm.egg-info/dependency_links.txt +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm.egg-info/entry_points.txt +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm.egg-info/requires.txt +0 -0
- {claude_mpm-4.1.12 → claude_mpm-4.1.13}/src/claude_mpm.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
311
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.1.13
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "claude-mpm"
|
|
7
|
-
version = "4.1.
|
|
7
|
+
version = "4.1.13"
|
|
8
8
|
description = "Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.8"
|
|
@@ -247,7 +247,7 @@ ignore-imports = false
|
|
|
247
247
|
|
|
248
248
|
[tool.commitizen]
|
|
249
249
|
name = "cz_conventional_commits"
|
|
250
|
-
version = "4.1.
|
|
250
|
+
version = "4.1.13"
|
|
251
251
|
version_files = [
|
|
252
252
|
"VERSION",
|
|
253
253
|
"src/claude_mpm/VERSION",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.1.13
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Monitor command implementation for claude-mpm.
|
|
3
|
+
|
|
4
|
+
WHY: This module provides CLI commands for managing the Socket.IO monitoring server,
|
|
5
|
+
allowing users to start, stop, restart, and check status of the monitoring infrastructure.
|
|
6
|
+
The monitor command now delegates to the unified dashboard service for consolidated operation.
|
|
7
|
+
|
|
8
|
+
DESIGN DECISIONS:
|
|
9
|
+
- Delegate to dashboard command for unified service architecture
|
|
10
|
+
- Use BaseCommand for consistent CLI patterns
|
|
11
|
+
- Maintain backward compatibility with existing Socket.IO server management
|
|
12
|
+
- Support multiple output formats (json, yaml, table, text)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from ...constants import MonitorCommands
|
|
18
|
+
from ..shared import BaseCommand, CommandResult
|
|
19
|
+
from .dashboard import DashboardCommand
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MonitorCommand(BaseCommand):
|
|
23
|
+
"""Monitor command that delegates to the unified dashboard service."""
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
super().__init__("monitor")
|
|
27
|
+
# Create dashboard command instance for delegation
|
|
28
|
+
self.dashboard_command = DashboardCommand()
|
|
29
|
+
|
|
30
|
+
def validate_args(self, args) -> Optional[str]:
|
|
31
|
+
"""Validate command arguments."""
|
|
32
|
+
# Monitor command allows no subcommand (defaults to status)
|
|
33
|
+
if hasattr(args, "monitor_command") and args.monitor_command:
|
|
34
|
+
valid_commands = [cmd.value for cmd in MonitorCommands]
|
|
35
|
+
if args.monitor_command not in valid_commands:
|
|
36
|
+
return f"Unknown monitor command: {args.monitor_command}. Valid commands: {', '.join(valid_commands)}"
|
|
37
|
+
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
def run(self, args) -> CommandResult:
|
|
41
|
+
"""Execute the monitor command by delegating to dashboard service."""
|
|
42
|
+
try:
|
|
43
|
+
self.logger.info("Monitor command delegating to unified dashboard service")
|
|
44
|
+
|
|
45
|
+
# Handle default case (no subcommand) - default to status
|
|
46
|
+
if not hasattr(args, "monitor_command") or not args.monitor_command:
|
|
47
|
+
return self._status_dashboard(args)
|
|
48
|
+
|
|
49
|
+
# Map monitor commands to dashboard commands
|
|
50
|
+
if args.monitor_command == MonitorCommands.START.value:
|
|
51
|
+
return self._start_dashboard(args)
|
|
52
|
+
if args.monitor_command == MonitorCommands.STOP.value:
|
|
53
|
+
return self._stop_dashboard(args)
|
|
54
|
+
if args.monitor_command == MonitorCommands.RESTART.value:
|
|
55
|
+
return self._restart_dashboard(args)
|
|
56
|
+
if args.monitor_command == MonitorCommands.STATUS.value:
|
|
57
|
+
return self._status_dashboard(args)
|
|
58
|
+
if args.monitor_command == MonitorCommands.PORT.value:
|
|
59
|
+
return self._start_dashboard_on_port(args)
|
|
60
|
+
|
|
61
|
+
return CommandResult.error_result(
|
|
62
|
+
f"Unknown monitor command: {args.monitor_command}"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
except Exception as e:
|
|
66
|
+
self.logger.error(f"Error executing monitor command: {e}", exc_info=True)
|
|
67
|
+
return CommandResult.error_result(f"Error executing monitor command: {e}")
|
|
68
|
+
|
|
69
|
+
def _start_dashboard(self, args) -> CommandResult:
|
|
70
|
+
"""Start the dashboard service (unified HTTP + Socket.IO)."""
|
|
71
|
+
self.logger.info("Starting unified dashboard service (HTTP + Socket.IO)")
|
|
72
|
+
# Set default port to 8765 for unified service and background mode
|
|
73
|
+
if not hasattr(args, "port") or args.port is None:
|
|
74
|
+
args.port = 8765
|
|
75
|
+
# Monitor command defaults to background mode for better UX
|
|
76
|
+
if not hasattr(args, "background"):
|
|
77
|
+
args.background = True
|
|
78
|
+
|
|
79
|
+
return self.dashboard_command._start_dashboard(args)
|
|
80
|
+
|
|
81
|
+
def _stop_dashboard(self, args) -> CommandResult:
|
|
82
|
+
"""Stop the dashboard service."""
|
|
83
|
+
self.logger.info("Stopping unified dashboard service")
|
|
84
|
+
# Use default port if not specified
|
|
85
|
+
if not hasattr(args, "port") or args.port is None:
|
|
86
|
+
args.port = 8765
|
|
87
|
+
|
|
88
|
+
return self.dashboard_command._stop_dashboard(args)
|
|
89
|
+
|
|
90
|
+
def _restart_dashboard(self, args) -> CommandResult:
|
|
91
|
+
"""Restart the dashboard service."""
|
|
92
|
+
self.logger.info("Restarting unified dashboard service")
|
|
93
|
+
|
|
94
|
+
# Stop first
|
|
95
|
+
stop_result = self._stop_dashboard(args)
|
|
96
|
+
if not stop_result.success:
|
|
97
|
+
self.logger.warning("Failed to stop service for restart, proceeding anyway")
|
|
98
|
+
|
|
99
|
+
# Wait a moment
|
|
100
|
+
import time
|
|
101
|
+
|
|
102
|
+
time.sleep(1)
|
|
103
|
+
|
|
104
|
+
# Start again
|
|
105
|
+
return self._start_dashboard(args)
|
|
106
|
+
|
|
107
|
+
def _status_dashboard(self, args) -> CommandResult:
|
|
108
|
+
"""Get dashboard service status."""
|
|
109
|
+
return self.dashboard_command._status_dashboard(args)
|
|
110
|
+
|
|
111
|
+
def _start_dashboard_on_port(self, args) -> CommandResult:
|
|
112
|
+
"""Start dashboard service on specific port."""
|
|
113
|
+
self.logger.info(
|
|
114
|
+
f"Starting dashboard service on port {getattr(args, 'port', 8765)}"
|
|
115
|
+
)
|
|
116
|
+
# Ensure background mode for port-specific starts
|
|
117
|
+
if not hasattr(args, "background"):
|
|
118
|
+
args.background = True
|
|
119
|
+
|
|
120
|
+
return self.dashboard_command._start_dashboard(args)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def manage_monitor(args):
|
|
124
|
+
"""
|
|
125
|
+
Main entry point for monitor command.
|
|
126
|
+
|
|
127
|
+
The monitor command now delegates to the unified dashboard service for consolidated operation.
|
|
128
|
+
Both dashboard and monitor commands now use the same underlying service on port 8765.
|
|
129
|
+
"""
|
|
130
|
+
command = MonitorCommand()
|
|
131
|
+
error = command.validate_args(args)
|
|
132
|
+
|
|
133
|
+
if error:
|
|
134
|
+
command.logger.error(error)
|
|
135
|
+
print(f"Error: {error}")
|
|
136
|
+
return 1
|
|
137
|
+
|
|
138
|
+
result = command.run(args)
|
|
139
|
+
|
|
140
|
+
if result.success:
|
|
141
|
+
if result.message:
|
|
142
|
+
print(result.message)
|
|
143
|
+
if result.data and getattr(args, "verbose", False):
|
|
144
|
+
import json
|
|
145
|
+
|
|
146
|
+
print(json.dumps(result.data, indent=2))
|
|
147
|
+
return 0
|
|
148
|
+
if result.message:
|
|
149
|
+
print(f"Error: {result.message}")
|
|
150
|
+
return 1
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# All legacy functions have been removed.
|
|
154
|
+
# The monitor command now delegates to the unified dashboard service.
|
|
155
|
+
# This consolidation provides a single service that handles both HTTP (port 8765)
|
|
156
|
+
# and Socket.IO (also on port 8765) rather than separate services on different ports.
|
|
@@ -234,7 +234,11 @@ Focus on establishing ONE clear way to do ANYTHING in the project.
|
|
|
234
234
|
|
|
235
235
|
# Execute the command
|
|
236
236
|
result = subprocess.run(
|
|
237
|
-
cmd,
|
|
237
|
+
cmd,
|
|
238
|
+
capture_output=True,
|
|
239
|
+
text=True,
|
|
240
|
+
cwd=str(self.project_path),
|
|
241
|
+
check=False,
|
|
238
242
|
)
|
|
239
243
|
|
|
240
244
|
# Check for environment-specific errors
|
|
@@ -257,7 +261,8 @@ Focus on establishing ONE clear way to do ANYTHING in the project.
|
|
|
257
261
|
cmd_venv,
|
|
258
262
|
capture_output=not verbose,
|
|
259
263
|
text=True,
|
|
260
|
-
cwd=str(self.project_path),
|
|
264
|
+
cwd=str(self.project_path),
|
|
265
|
+
check=False,
|
|
261
266
|
)
|
|
262
267
|
finally:
|
|
263
268
|
# Clean up temporary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
class e{constructor(){this.container=null,this.events=[],this.sessions=new Map,this.currentSession=null,this.selectedSessionFilter="all",this.timeRange="30min",this.searchTerm="",this.initialized=!1,this.expandedSessions=new Set,this.expandedAgents=new Set,this.expandedTools=new Set,this.selectedItem=null}initialize(){if(console.log("ActivityTree.initialize() called, initialized:",this.initialized),this.initialized)return void console.log("Activity tree already initialized, skipping");if(this.container=document.getElementById("activity-tree-container"),!this.container&&(this.container=document.getElementById("activity-tree"),!this.container))return void console.error("Activity tree container not found in DOM");const e=document.getElementById("activity-tab");if(e){if(!e.classList.contains("active"))return console.log("Activity tab not active, initializing but deferring render"),this.setupControls(),this.subscribeToEvents(),void(this.initialized=!0);this.setupControls(),this.createLinearTreeView(),this.subscribeToEvents(),this.initialized=!0,console.log("Activity tree initialization complete")}else console.error("Activity tab panel (#activity-tab) not found in DOM")}forceShow(){console.log("ActivityTree.forceShow() called"),this.container||(this.container=document.getElementById("activity-tree-container")||document.getElementById("activity-tree"),this.container)?(this.createLinearTreeView(),this.renderTree()):console.error("Cannot find activity tree container")}renderWhenVisible(){if(console.log("ActivityTree.renderWhenVisible() called"),!this.initialized)return console.log("Not initialized yet, calling initialize..."),void this.initialize();this.createLinearTreeView(),this.renderTree()}setupControls(){const e=document.getElementById("time-range");e&&e.addEventListener("change",e=>{this.timeRange=e.target.value,console.log(`ActivityTree: Time range changed to: ${this.timeRange}`),this.renderTree()}),document.addEventListener("sessionFilterChanged",e=>{this.selectedSessionFilter=e.detail.sessionId||"all",console.log(`ActivityTree: Session filter changed to: ${this.selectedSessionFilter} (from SessionManager)`),this.renderTree()}),document.addEventListener("sessionChanged",e=>{this.selectedSessionFilter=e.detail.sessionId||"all",console.log(`ActivityTree: Session changed to: ${this.selectedSessionFilter} (from SessionManager - backward compat)`),this.renderTree()}),setTimeout(()=>{if(window.sessionManager){const e=window.sessionManager.getCurrentFilter();e!==this.selectedSessionFilter&&(this.selectedSessionFilter=e||"all",console.log(`ActivityTree: Initialized with current session filter: ${this.selectedSessionFilter}`),this.renderTree())}},100);const t=document.getElementById("expand-all");t&&t.addEventListener("click",()=>this.expandAllSessions());const s=document.getElementById("collapse-all");s&&s.addEventListener("click",()=>this.collapseAllSessions());const n=document.getElementById("reset-zoom");n&&(n.style.display="inline-block",n.addEventListener("click",()=>this.resetZoom()));const i=document.getElementById("activity-search");i&&i.addEventListener("input",e=>{this.searchTerm=e.target.value.toLowerCase(),this.renderTree()})}createLinearTreeView(){console.log("Creating linear tree view"),this.container.innerHTML="";const e=document.createElement("div");e.id="linear-tree",e.className="linear-tree",this.container.appendChild(e),console.log("Linear tree view created")}subscribeToEvents(){if(!window.socketClient)return console.warn("Socket client not available for activity tree"),void setTimeout(()=>this.subscribeToEvents(),1e3);console.log("ActivityTree: Setting up event subscription"),window.socketClient.onEventUpdate((e,t)=>{console.log(`ActivityTree: onEventUpdate called with ${e.length} total events and ${t.size} sessions`),this.sessions.clear();for(const[n,i]of t.entries()){const e={id:n,timestamp:new Date(i.lastActivity||i.startTime||new Date),expanded:this.expandedSessions.has(n)||!0,agents:new Map,todos:[],userInstructions:[],tools:[],status:"active",currentTodoTool:null,working_directory:i.working_directory,git_branch:i.git_branch,eventCount:i.eventCount};this.sessions.set(n,e)}const s=e.length-this.events.length;if(s>0){const t=e.slice(this.events.length);console.log(`ActivityTree: Processing ${s} new events`,t),t.forEach(e=>{this.processEvent(e)})}this.events=[...e],this.renderTree(),console.log("ActivityTree: Sessions after sync with socket client:",Array.from(this.sessions.entries()))});const e=window.socketClient?.getState();if(e&&e.events.length>0){console.log(`ActivityTree: Loading existing data - ${e.events.length} events, ${e.sessions.size} sessions`),this.sessions.clear();for(const[t,s]of e.sessions.entries()){const e={id:t,timestamp:new Date(s.lastActivity||s.startTime||new Date),expanded:this.expandedSessions.has(t)||!0,agents:new Map,todos:[],userInstructions:[],tools:[],status:"active",currentTodoTool:null,working_directory:s.working_directory,git_branch:s.git_branch,eventCount:s.eventCount};this.sessions.set(t,e)}e.events.forEach(e=>{this.processEvent(e)}),this.events=[...e.events],this.renderTree(),console.log("ActivityTree: Initial sessions state:",Array.from(this.sessions.entries()))}else console.log("ActivityTree: No existing events found"),this.events=[],this.sessions.clear(),this.renderTree()}processEvent(e){if(!e)return void console.log("ActivityTree: Ignoring null event");let t,s=this.getEventType(e);if(!s)return;console.log(`ActivityTree: Processing event: ${s}`,e),e.timestamp?(t=new Date(e.timestamp),isNaN(t.getTime())&&(console.warn("ActivityTree: Invalid timestamp, using current time:",e.timestamp),t=new Date)):(console.warn("ActivityTree: No timestamp found, using current time"),t=new Date);const n=e.session_id||e.data?.session_id;if(!n)return void console.log(`ActivityTree: Skipping event without session_id: ${s}`);if(!this.sessions.has(n))return void console.warn(`ActivityTree: Session ${n} not found in authoritative sessions - skipping event`);const i=this.sessions.get(n);switch(s){case"Start":this.currentSession=i;break;case"user_prompt":this.processUserInstruction(e,i);break;case"TodoWrite":this.processTodoWrite(e,i);break;case"SubagentStart":this.processSubagentStart(e,i);break;case"SubagentStop":this.processSubagentStop(e,i);break;case"PreToolUse":this.processToolUse(e,i);break;case"PostToolUse":this.updateToolStatus(e,i,"completed")}this.updateStats()}getEventType(e){if(e.hook_event_name)return e.hook_event_name;if("hook"===e.type&&e.subtype){return{pre_tool:"PreToolUse",post_tool:"PostToolUse",subagent_start:"SubagentStart",subagent_stop:"SubagentStop",todo_write:"TodoWrite"}[e.subtype]}if("todo"===e.type&&"updated"===e.subtype)return"TodoWrite";if("subagent"===e.type){if("started"===e.subtype)return"SubagentStart";if("stopped"===e.subtype)return"SubagentStop"}return"start"===e.type?"Start":"user_prompt"===e.type||"user_prompt"===e.subtype?"user_prompt":null}processUserInstruction(e,t){const s=e.prompt_text||e.data?.prompt_text||e.prompt||"";if(!s)return;const n={id:`instruction-${t.id}-${Date.now()}`,text:s,preview:s.length>100?s.substring(0,100)+"...":s,timestamp:e.timestamp||(new Date).toISOString(),type:"user_instruction"};t.userInstructions.push(n),t.userInstructions.length>5&&(t.userInstructions=t.userInstructions.slice(-5))}processTodoWrite(e,t){let s=e.todos||e.data?.todos||e.data||[];if(s&&"object"==typeof s&&s.todos&&(s=s.todos),!Array.isArray(s)||0===s.length)return;t.todos=s.map(t=>({content:t.content,activeForm:t.activeForm,status:t.status,timestamp:e.timestamp}));const n={id:`todo-session-${t.id}-${Date.now()}`,name:"TodoWrite",type:"tool",icon:"📝",timestamp:e.timestamp,status:"active",params:{todos:s},isPrioritizedTool:!0};t.tools=t.tools.filter(e=>"TodoWrite"!==e.name),t.tools.unshift(n),t.currentTodoTool=n;const i=e.session_id||e.data?.session_id;let a=null;if(i&&t.agents.has(i))a=t.agents.get(i);else{const e=Array.from(t.agents.values()).filter(e=>"active"===e.status||"in_progress"===e.status).sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));if(e.length>0)a=e[0];else{const e=Array.from(t.agents.values()).sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));e.length>0&&(a=e[0])}}if(a){const t={id:`todo-agent-${a.id}-${Date.now()}`,name:"TodoWrite",type:"tool",icon:"📝",timestamp:e.timestamp,status:"active",params:{todos:s},isPrioritizedTool:!0};a.tools=a.tools.filter(e=>"TodoWrite"!==e.name),a.tools.unshift(t)}}processSubagentStart(e,t){const s=e.agent_name||e.data?.agent_name||e.data?.agent_type||e.agent_type||e.agent||"unknown",n=e.session_id||e.data?.session_id,i=n||`agent-${Date.now()}-${Math.random()}`;if(t.agents.has(i)){const s=t.agents.get(i);s.status="active",s.timestamp=e.timestamp}else{const a={id:i,name:s,type:"agent",icon:this.getAgentIcon(s),timestamp:e.timestamp,status:"active",tools:[],sessionId:n,isPM:!1};t.agents.set(i,a)}}processSubagentStop(e,t){const s=e.session_id||e.data?.session_id;if(s&&t.agents.has(s)){t.agents.get(s).status="completed"}}processToolUse(e,t){const s=e.tool_name||e.data?.tool_name||e.tool||e.data?.tool||"unknown",n=e.tool_parameters||e.data?.tool_parameters||e.parameters||e.data?.parameters||{},i=e.session_id||e.data?.session_id,a={id:`tool-${Date.now()}-${Math.random()}`,name:s,type:"tool",icon:this.getToolIcon(s),timestamp:e.timestamp,status:"in_progress",params:n,eventId:e.id};let o=null;if(i&&t.agents.has(i))o=t.agents.get(i);else{const e=Array.from(t.agents.values()).filter(e=>"active"===e.status).sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));if(!(e.length>0))return void t.tools.push(a);o=e[0]}o&&o.tools.push(a)}updateToolStatus(e,t,s){const n=t=>{if(t.tools){const n=t.tools.find(t=>t.eventId===e.id);if(n)return n.status=s,!0}return!1};for(let i of t.agents.values())if(n(i))return;!t.tools||n(t)}renderTree(){const e=document.getElementById("linear-tree");if(!e)return;e.innerHTML="";const t=Array.from(this.sessions.values()).sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));for(let s of t){if("all"!==this.selectedSessionFilter&&this.selectedSessionFilter!==s.id)continue;const t=this.createSessionElement(s);e.appendChild(t)}}createSessionElement(e){const t=this.expandedSessions.has(e.id)||e.expanded;let s;try{const t=e.timestamp instanceof Date?e.timestamp:new Date(e.timestamp);isNaN(t.getTime())?(s="Invalid Date",console.warn("ActivityTree: Invalid session timestamp:",e.timestamp)):s=t.toLocaleString()}catch(l){s="Invalid Date",console.error("ActivityTree: Error formatting session timestamp:",l,e.timestamp)}const n=document.createElement("div");n.className="tree-node session",n.dataset.sessionId=e.id;const i=t?"▼":"▶",a=e.agents?e.agents.size:0,o=e.todos?e.todos.length:0,r=e.userInstructions?e.userInstructions.length:0;return console.log(`ActivityTree: Rendering session ${e.id}: ${a} agents, ${r} instructions, ${o} todos at ${s}`),n.innerHTML=`\n <div class="tree-node-content" onclick="window.activityTreeInstance.toggleSession('${e.id}')">\n <span class="tree-expand-icon">${i}</span>\n <span class="tree-icon">🎯</span>\n <span class="tree-label">PM Session</span>\n <span class="tree-meta">${s} • ${a} agent(s) • ${r} instruction(s) • ${o} todo(s)</span>\n </div>\n <div class="tree-children" style="display: ${t?"block":"none"}">\n ${this.renderSessionContent(e)}\n </div>\n `,n}renderSessionContent(e){let t="";if(e.userInstructions&&e.userInstructions.length>0)for(let n of e.userInstructions.slice(-3))t+=this.renderUserInstructionElement(n,1);if(e.todos&&e.todos.length>0&&(t+=this.renderTodoChecklistElement(e.todos,1)),e.tools&&e.tools.length>0)for(let n of e.tools)t+=this.renderToolElement(n,1);const s=Array.from(e.agents.values()).sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));for(let n of s)t+=this.renderAgentElement(n,1);return t}renderUserInstructionElement(e,t){return`\n <div class="tree-node user-instruction ${this.selectedItem&&"instruction"===this.selectedItem.type&&this.selectedItem.data.id===e.id?"selected":""}" data-level="${t}">\n <div class="tree-node-content">\n <span class="tree-expand-icon"></span>\n <span class="tree-icon">💬</span>\n <span class="tree-label clickable" onclick="window.activityTreeInstance.selectItem(${this.escapeJson(e)}, 'instruction', event)">User: "${this.escapeHtml(e.preview)}"</span>\n <span class="tree-status status-active">instruction</span>\n </div>\n </div>\n `}renderTodoChecklistElement(e,t){const s=`checklist-${Date.now()}`,n=!1!==this.expandedTools.has(s),i=n?"▼":"▶";let a=0,o=0;e.forEach(e=>{"completed"===e.status?a++:"in_progress"===e.status&&o++});let r="";r=o>0?`${o} in progress, ${a} completed`:a===e.length&&e.length>0?`All ${e.length} completed`:`${e.length} todo(s)`;let l=`\n <div class="tree-node todo-checklist" data-level="${t}">\n <div class="tree-node-content">\n <span class="tree-expand-icon" onclick="window.activityTreeInstance.toggleTodoChecklist('${s}'); event.stopPropagation();">${i}</span>\n <span class="tree-icon">☑️</span>\n <span class="tree-label">TODOs</span>\n <span class="tree-params">${r}</span>\n <span class="tree-status status-active">checklist</span>\n </div>\n `;if(n){l+='<div class="tree-children">';for(let s of e){const e=this.getCheckboxIcon(s.status),n=`status-${s.status}`,i="in_progress"===s.status?s.activeForm:s.content;l+=`\n <div class="tree-node todo-item ${n}" data-level="${t+1}">\n <div class="tree-node-content">\n <span class="tree-expand-icon"></span>\n <span class="tree-icon">${e}</span>\n <span class="tree-label">${this.escapeHtml(i)}</span>\n <span class="tree-status ${n}">${s.status.replace("_"," ")}</span>\n </div>\n </div>\n `}l+="</div>"}return l+="</div>",l}renderAgentElement(e,t){const s="active"===e.status?"status-active":"status-completed",n=this.expandedAgents.has(e.id),i=e.tools&&e.tools.length>0,a=i?n?"▼":"▶":"";let o=`\n <div class="tree-node agent ${s} ${this.selectedItem&&"agent"===this.selectedItem.type&&this.selectedItem.data.id===e.id?"selected":""}" data-level="${t}">\n <div class="tree-node-content">\n ${a?`<span class="tree-expand-icon" onclick="window.activityTreeInstance.toggleAgent('${e.id}'); event.stopPropagation();">${a}</span>`:'<span class="tree-expand-icon"></span>'}\n <span class="tree-icon">${e.icon}</span>\n <span class="tree-label clickable" onclick="window.activityTreeInstance.selectItem(${this.escapeJson(e)}, 'agent', event)">${e.name}</span>\n <span class="tree-status ${s}">${e.status}</span>\n </div>\n `;if(i&&n){o+='<div class="tree-children">';for(let s of e.tools)o+=this.renderToolElement(s,t+1);o+="</div>"}return o+="</div>",o}renderToolElement(e,t){const s=`status-${e.status}`,n=this.getToolParams(e);return`\n <div class="tree-node tool ${s} ${this.selectedItem&&"tool"===this.selectedItem.type&&this.selectedItem.data.id===e.id?"selected":""}" data-level="${t}">\n <div class="tree-node-content">\n <span class="tree-expand-icon"></span>\n <span class="tree-icon">${e.icon}</span>\n <span class="tree-label clickable" onclick="window.activityTreeInstance.selectItem(${this.escapeJson(e)}, 'tool', event)">${e.name} (click to view details)</span>\n <span class="tree-params">${n}</span>\n <span class="tree-status ${s}">${e.status}</span>\n </div>\n </div>\n `}getToolParams(e){if(!e.params)return"";if("Read"===e.name&&e.params.file_path)return e.params.file_path;if("Edit"===e.name&&e.params.file_path)return e.params.file_path;if("Write"===e.name&&e.params.file_path)return e.params.file_path;if("Bash"===e.name&&e.params.command){const t=e.params.command;return t.length>50?t.substring(0,50)+"...":t}return"WebFetch"===e.name&&e.params.url?e.params.url:""}getStatusIcon(e){return{pending:"⏸️",in_progress:"🔄",completed:"✅"}[e]||"❓"}getCheckboxIcon(e){return{pending:"⏳",in_progress:"🔄",completed:"✅"}[e]||"❓"}getAgentIcon(e){return{engineer:"👷",research:"🔬",qa:"🧪",ops:"⚙️",pm:"📊",architect:"🏗️"}[e.toLowerCase()]||"🤖"}getToolIcon(e){return{read:"👁️",write:"✍️",edit:"✏️",bash:"💻",webfetch:"🌐",grep:"🔍",glob:"📂",todowrite:"📝"}[e.toLowerCase()]||"🔧"}toggleSession(e){this.expandedSessions.has(e)?this.expandedSessions.delete(e):this.expandedSessions.add(e);const t=this.sessions.get(e);t&&(t.expanded=this.expandedSessions.has(e)),this.renderTree()}expandAllSessions(){for(let e of this.sessions.keys()){this.expandedSessions.add(e);const t=this.sessions.get(e);t&&(t.expanded=!0)}this.renderTree()}collapseAllSessions(){this.expandedSessions.clear();for(let e of this.sessions.values())e.expanded=!1;this.renderTree()}updateStats(){const e=this.countTotalNodes(),t=this.countActiveNodes(),s=this.calculateMaxDepth(),n=document.getElementById("node-count"),i=document.getElementById("active-count"),a=document.getElementById("tree-depth");n&&(n.textContent=e),i&&(i.textContent=t),a&&(a.textContent=s),console.log(`ActivityTree: Stats updated - Nodes: ${e}, Active: ${t}, Depth: ${s}`)}countTotalNodes(){let e=0;for(let t of this.sessions.values()){e+=1,e+=t.agents.size,t.userInstructions&&(e+=t.userInstructions.length),t.todos&&(e+=t.todos.length),t.tools&&(e+=t.tools.length);for(let s of t.agents.values())s.tools&&(e+=s.tools.length)}return e}countActiveNodes(){let e=0;for(let t of this.sessions.values()){if("active"===t.status&&e++,t.todos)for(let s of t.todos)"in_progress"===s.status&&e++;if(t.tools)for(let s of t.tools)"in_progress"===s.status&&e++;for(let s of t.agents.values())if("active"===s.status&&e++,s.tools)for(let t of s.tools)"in_progress"===t.status&&e++}return e}calculateMaxDepth(){let e=0;for(let t of this.sessions.values()){let s=1;t.userInstructions&&t.userInstructions.length>0&&(s=Math.max(s,2)),t.todos&&t.todos.length>0&&(s=Math.max(s,3)),t.tools&&t.tools.length>0&&(s=Math.max(s,2));for(let e of t.agents.values())e.tools&&e.tools.length>0&&(s=Math.max(s,3));e=Math.max(e,s)}return e}toggleAgent(e){this.expandedAgents.has(e)?this.expandedAgents.delete(e):this.expandedAgents.add(e),this.renderTree()}toggleTool(e){console.log("Tool expansion is disabled. Tools now show data in the left pane when clicked.")}toggleTodoChecklist(e){this.expandedTools.has(e)?this.expandedTools.delete(e):this.expandedTools.add(e),this.renderTree()}selectItem(e,t,s){s&&s.stopPropagation(),this.selectedItem={data:e,type:t},this.displayItemData(e,t),this.renderTree()}displayItemData(e,t){const s=document.getElementById("module-data-content");if(!s)return;let n="",i="";switch(t){case"agent":i=`🤖 Agent: ${e.name}`,n=this.formatAgentData(e);break;case"tool":i=`🔧 Tool: ${e.name}`,n=this.formatToolData(e);break;case"instruction":i="💬 User Instruction",n=this.formatInstructionData(e);break;default:i="📊 Item Details",n=this.formatGenericData(e)}s.innerHTML=`\n <div class="module-item-details">\n <div class="module-item-header">\n <h6>${i}</h6>\n <span class="module-item-timestamp">${new Date(e.timestamp).toLocaleString()}</span>\n </div>\n <div class="module-item-content">\n ${n}\n </div>\n </div>\n `;const a=document.querySelector(".module-data-header h5");a&&(a.textContent=i)}formatAgentData(e){return`\n <div class="agent-details">\n <div class="detail-row">\n <span class="detail-label">Name:</span>\n <span class="detail-value">${e.name}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Status:</span>\n <span class="detail-value status-${e.status}">${e.status}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Session ID:</span>\n <span class="detail-value">${e.sessionId||"N/A"}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Tools Used:</span>\n <span class="detail-value">${e.tools?e.tools.length:0}</span>\n </div>\n ${e.tools&&e.tools.length>0?`\n <div class="detail-section">\n <span class="detail-section-title">Tools:</span>\n <div class="tools-list">\n ${e.tools.map(e=>`\n <div class="tool-summary">\n <span class="tool-icon">${this.getToolIcon(e.name)}</span>\n <span class="tool-name">${e.name}</span>\n <span class="tool-status status-${e.status}">${e.status}</span>\n </div>\n `).join("")}\n </div>\n </div>\n `:""}\n </div>\n `}formatToolData(e){const t=e.params?Object.keys(e.params):[];return`\n <div class="tool-details">\n <div class="detail-row">\n <span class="detail-label">Tool:</span>\n <span class="detail-value">${e.icon} ${e.name}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Status:</span>\n <span class="detail-value">\n <span class="status-badge status-${e.status}">${e.status.replace("_"," ")}</span>\n </span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Timestamp:</span>\n <span class="detail-value">${new Date(e.timestamp).toLocaleString()}</span>\n </div>\n ${t.length>0?`\n <div class="detail-section">\n <span class="detail-section-title">Parameters (${t.length}):</span>\n <div class="params-list">\n ${t.map(t=>{const s=e.params[t];return`\n <div class="param-item">\n <div class="param-key">${t}:</div>\n <div class="param-value">${this.formatDetailedParamValue(s)}</div>\n </div>\n `}).join("")}\n </div>\n </div>\n `:'\n <div class="detail-section">\n <span class="detail-section-title">Parameters:</span>\n <div class="params-list">\n <div class="param-item">\n <div class="param-value">No parameters</div>\n </div>\n </div>\n </div>\n '}\n ${e.result?`\n <div class="detail-section">\n <span class="detail-section-title">Result:</span>\n <pre class="tool-result">${this.escapeHtml(JSON.stringify(e.result,null,2))}</pre>\n </div>\n `:""}\n </div>\n `}formatParamValue(e){return"string"==typeof e&&e.length>100?e.substring(0,100)+"...":"object"==typeof e?JSON.stringify(e):String(e)}formatDetailedParamValue(e){if("string"==typeof e)return e.length>500?`<pre class="param-text-long">${this.escapeHtml(e.substring(0,500)+"...\n\n[Content truncated - "+e.length+" total characters]")}</pre>`:e.length>100?`<pre class="param-text">${this.escapeHtml(e)}</pre>`:`<span class="param-text-short">${this.escapeHtml(e)}</span>`;if("object"!=typeof e)return`<span class="param-primitive">${this.escapeHtml(String(e))}</span>`;try{return`<pre class="param-json">${this.escapeHtml(JSON.stringify(e,null,2))}</pre>`}catch(t){return'<span class="param-error">Error displaying object</span>'}}formatInstructionData(e){return`\n <div class="instruction-details">\n <div class="detail-row">\n <span class="detail-label">Text:</span>\n <span class="detail-value">${this.escapeHtml(e.text)}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Timestamp:</span>\n <span class="detail-value">${new Date(e.timestamp).toLocaleString()}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Length:</span>\n <span class="detail-value">${e.text.length} characters</span>\n </div>\n </div>\n `}formatGenericData(e){if("object"==typeof e){let t='<div class="generic-details">';const s=["id","name","type","status","timestamp","text","content"];for(let n of s)if(void 0!==e[n]){let s=e[n];"string"==typeof s&&s.length>200&&(s=s.substring(0,200)+"..."),t+=`\n <div class="detail-row">\n <span class="detail-label">${n}:</span>\n <span class="detail-value">${this.escapeHtml(String(s))}</span>\n </div>\n `}return t+="</div>",t}return`<div class="simple-value">${this.escapeHtml(String(e))}</div>`}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}resetZoom(){this.svg&&this.zoom&&this.svg.transition().duration(this.duration).call(this.zoom.transform,d3.zoomIdentity)}escapeJson(e){return JSON.stringify(e).replace(/'/g,"'").replace(/"/g,""")}}window.ActivityTree=e;const t=()=>{let t=null;const s=()=>{t||(console.log("Creating new Activity Tree instance..."),t=new e,window.activityTreeInstance=t,window.activityTree=()=>t),setTimeout(()=>{console.log("Attempting to initialize Activity Tree visualization..."),t.initialize()},100)};document.querySelectorAll(".tab-button").forEach(e=>{e.addEventListener("click",e=>{"activity"===e.target.getAttribute("data-tab")&&(console.log("Activity tab button clicked, initializing tree..."),s(),t&&setTimeout(()=>{t.renderWhenVisible(),t.forceShow()},150))})}),document.addEventListener("tabChanged",e=>{e.detail&&"activity"===e.detail.newTab&&(console.log("Tab changed to activity, initializing tree..."),s(),t&&setTimeout(()=>{t.renderWhenVisible(),t.forceShow()},150))});const n=document.querySelector(".tab-button.active");n&&"activity"===n.getAttribute("data-tab")&&(console.log("Activity tab is active on load, initializing tree..."),s());const i=document.getElementById("activity-tab");i&&i.classList.contains("active")&&(console.log("Activity panel is active on load, initializing tree..."),t||s())};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t();
|
|
2
|
+
//# sourceMappingURL=activity-tree.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
class t{constructor(){this.container=null,this.svg=null,this.treeData=null,this.root=null,this.treeLayout=null,this.treeGroup=null,this.nodes=new Map,this.stats={files:0,classes:0,functions:0,methods:0,lines:0},this.isRadialLayout=!0,this.margin={top:20,right:20,bottom:20,left:20},this.width=960-this.margin.left-this.margin.right,this.height=600-this.margin.top-this.margin.bottom,this.radius=Math.min(this.width,this.height)/2,this.nodeId=0,this.duration=750,this.languageFilter="all",this.searchTerm="",this.tooltip=null,this.initialized=!1,this.analyzing=!1,this.selectedNode=null,this.socket=null,this.autoDiscovered=!1,this.zoom=null,this.activeNode=null,this.loadingNodes=new Set}initialize(){if(this.initialized)return;if(this.container=document.getElementById("code-tree-container"),!this.container)return void console.error("Code tree container not found");const t=document.getElementById("code-tab");if(!t)return void console.error("Code tab panel not found");const e=this.getWorkingDirectory();if(!e||"Loading..."===e||"Not selected"===e)return this.showNoWorkingDirectoryMessage(),void(this.initialized=!0);this.setupControls(),this.initializeTreeData(),this.subscribeToEvents();document.getElementById("breadcrumb-content")&&!this.analyzing&&this.updateActivityTicker("Loading project structure...","info"),t.classList.contains("active")&&(this.createVisualization(),this.root&&this.svg&&this.update(this.root),this.autoDiscoverRootLevel()),this.initialized=!0}renderWhenVisible(){const t=this.getWorkingDirectory();t&&"Loading..."!==t&&"Not selected"!==t?(this.removeNoWorkingDirectoryMessage(),this.initialized?(this.svg?this.root&&this.svg&&this.update(this.root):(this.createVisualization(),this.svg&&this.treeGroup&&this.update(this.root)),this.autoDiscovered||this.autoDiscoverRootLevel()):this.initialize()):this.showNoWorkingDirectoryMessage()}setupControls(){const t=document.getElementById("language-filter");t&&t.addEventListener("change",t=>{this.languageFilter=t.target.value,this.filterTree()});const e=document.getElementById("code-search");e&&e.addEventListener("input",t=>{this.searchTerm=t.target.value.toLowerCase(),this.filterTree()});const i=document.getElementById("code-expand-all");i&&i.addEventListener("click",()=>this.expandAll());const s=document.getElementById("code-collapse-all");s&&s.addEventListener("click",()=>this.collapseAll());const o=document.getElementById("code-reset-zoom");o&&o.addEventListener("click",()=>this.resetZoom());const n=document.getElementById("code-toggle-legend");n&&n.addEventListener("click",()=>this.toggleLegend()),document.addEventListener("workingDirectoryChanged",t=>{this.onWorkingDirectoryChanged(t.detail.directory)})}onWorkingDirectoryChanged(t){if(!t||"Loading..."===t||"Not selected"===t)return this.showNoWorkingDirectoryMessage(),this.autoDiscovered=!1,this.analyzing=!1,this.nodes.clear(),this.stats={files:0,classes:0,functions:0,methods:0,lines:0},void this.updateStats();this.removeNoWorkingDirectoryMessage(),this.autoDiscovered=!1,this.analyzing=!1,this.nodes.clear(),this.stats={files:0,classes:0,functions:0,methods:0,lines:0},this.initializeTreeData(),this.svg&&this.update(this.root);const e=document.getElementById("code-tab");e&&e.classList.contains("active")&&this.autoDiscoverRootLevel(),this.updateStats()}showLoading(){let t=document.getElementById("code-tree-loading");if(!t){const e=document.getElementById("code-tree-container");e&&(t=document.createElement("div"),t.id="code-tree-loading",t.innerHTML='\n <div class="code-tree-spinner"></div>\n <div class="code-tree-loading-text">Analyzing code structure...</div>\n ',e.appendChild(t))}t&&t.classList.remove("hidden")}hideLoading(){const t=document.getElementById("code-tree-loading");t&&t.classList.add("hidden")}createVisualization(){if("undefined"==typeof d3)return void console.error("D3.js is not loaded");const t=d3.select("#code-tree-container");if(t.selectAll("*").remove(),!t||!t.node())return void console.error("Code tree container not found");const e=t.node(),i=e.clientWidth||960,s=e.clientHeight||600;this.width=i-this.margin.left-this.margin.right,this.height=s-this.margin.top-this.margin.bottom,this.radius=Math.min(this.width,this.height)/2,this.svg=t.append("svg").attr("width",i).attr("height",s);const o=i/2,n=s/2;this.isRadialLayout?this.treeGroup=this.svg.append("g").attr("transform",`translate(${o},${n})`):this.treeGroup=this.svg.append("g").attr("transform",`translate(${this.margin.left+100},${n})`),this.isRadialLayout?this.treeLayout=d3.cluster().size([2*Math.PI,this.radius-100]).separation((t,e)=>{if(t.parent==e.parent){const e=Math.max(1,4-t.depth),i=t.parent&&t.parent.children?.length||1,s=i>5?2:i>3?1.5:1,o=1+.2*t.depth;return e*s/(t.depth||1)*o}return 4/(t.depth||1)}):this.treeLayout=d3.tree().nodeSize([30,200]).separation((t,e)=>t.parent==e.parent?1:1.5),this.zoom=d3.zoom().scaleExtent([.1,10]).on("zoom",t=>{this.isRadialLayout?this.treeGroup.attr("transform",`translate(${o+t.transform.x},${n+t.transform.y}) scale(${t.transform.k})`):this.treeGroup.attr("transform",`translate(${this.margin.left+100+t.transform.x},${n+t.transform.y}) scale(${t.transform.k})`)}),this.svg.call(this.zoom),this.addVisualizationControls(),this.tooltip=d3.select("body").append("div").attr("class","code-tree-tooltip").style("opacity",0).style("position","absolute").style("background","rgba(0, 0, 0, 0.8)").style("color","white").style("padding","8px").style("border-radius","4px").style("font-size","12px").style("pointer-events","none")}clearD3Visualization(){this.treeGroup&&(this.treeGroup.selectAll("g.node").remove(),this.treeGroup.selectAll("path.link").remove()),this.nodeId=0}initializeTreeData(){const t=this.getWorkingDirectory(),e=t&&t.split("/").pop()||"Project Root";this.treeData={name:e,path:".",type:"root",children:[],loaded:!1,expanded:!0},"undefined"!=typeof d3&&(this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0)}subscribeToEvents(){this.socket||(window.socket?(this.socket=window.socket,this.setupEventHandlers()):window.dashboard?.socketClient?.socket?(this.socket=window.dashboard.socketClient.socket,this.setupEventHandlers()):window.socketClient?.socket&&(this.socket=window.socketClient.socket,this.setupEventHandlers()))}autoDiscoverRootLevel(){if(this.autoDiscovered||this.analyzing)return;this.updateActivityTicker("🔍 Discovering project structure...","info");const t=this.getWorkingDirectory();if(!t||"Loading..."===t||"Not selected"===t)return console.warn("Cannot auto-discover: no working directory set"),void this.showNoWorkingDirectoryMessage();if(!t.startsWith("/")&&!t.match(/^[A-Z]:\\/))return console.error("Working directory is not absolute:",t),void this.showNotification("Invalid working directory path","error");this.autoDiscovered=!0,this.analyzing=!0,this.nodes.clear(),this.stats={files:0,classes:0,functions:0,methods:0,lines:0},this.socket&&!this.socket.hasListeners("code:node:found")&&this.setupEventHandlers();const e=t.split("/").pop()||"Project Root";this.treeData={name:e,path:".",type:"root",children:[],loaded:!1,expanded:!0},"undefined"!=typeof d3&&(this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0),this.showLoading(),this.updateBreadcrumb(`Discovering structure in ${e}...`,"info");const i=[];document.querySelectorAll(".language-checkbox:checked").forEach(t=>{i.push(t.value)});const s=document.getElementById("ignore-patterns")?.value||"",o={path:t,depth:"top_level",languages:i,ignore_patterns:s,request_id:`discover_${Date.now()}`};this.socket&&this.socket.emit("code:discover:top_level",o),this.updateStats()}analyzeCode(){this.analyzing||this.autoDiscoverRootLevel()}cancelAnalysis(){this.analyzing=!1,this.hideLoading(),this.socket&&this.socket.emit("code:analysis:cancel"),this.updateBreadcrumb("Analysis cancelled","warning"),this.showNotification("Analysis cancelled","warning"),this.addEventToDisplay("Analysis cancelled","warning")}createEventsDisplay(){let t=document.getElementById("analysis-events");if(!t){const e=document.getElementById("code-tree-container");e&&(t=document.createElement("div"),t.id="analysis-events",t.className="analysis-events",t.style.display="none",e.appendChild(t))}}clearEventsDisplay(){const t=document.getElementById("analysis-events");t&&(t.innerHTML="",t.style.display="block")}addEventToDisplay(t,e="info"){const i=document.getElementById("analysis-events");if(i){const s=document.createElement("div");s.className="analysis-event",s.style.borderLeftColor="warning"===e?"#f59e0b":"error"===e?"#ef4444":"#3b82f6";const o=(new Date).toLocaleTimeString();s.innerHTML=`<span style="color: #718096;">[${o}]</span> ${t}`,i.appendChild(s),i.scrollTop=i.scrollHeight}}setupEventHandlers(){this.socket&&(this.socket.on("code:analysis:accepted",t=>this.onAnalysisAccepted(t)),this.socket.on("code:analysis:queued",t=>this.onAnalysisQueued(t)),this.socket.on("code:analysis:start",t=>this.onAnalysisStart(t)),this.socket.on("code:analysis:complete",t=>this.onAnalysisComplete(t)),this.socket.on("code:analysis:cancelled",t=>this.onAnalysisCancelled(t)),this.socket.on("code:analysis:error",t=>this.onAnalysisError(t)),this.socket.on("code:top_level:discovered",t=>this.onTopLevelDiscovered(t)),this.socket.on("code:directory:discovered",t=>this.onDirectoryDiscovered(t)),this.socket.on("code:file:discovered",t=>this.onFileDiscovered(t)),this.socket.on("code:file:analyzed",t=>this.onFileAnalyzed(t)),this.socket.on("code:node:found",t=>this.onNodeFound(t)),this.socket.on("code:analysis:progress",t=>this.onProgressUpdate(t)),this.socket.on("code:directory:contents",t=>{if(t.path){let e=t.path;const i=this.getWorkingDirectory();i&&e.startsWith(i)&&(e=e.substring(i.length).replace(/^\//,""),e||(e="."));const s=this.findNodeByPath(e);if(s&&t.children){const i=this.findD3NodeByPath(e);if(i&&this.loadingNodes.has(e)&&this.removeLoadingPulse(i),s.children=t.children.map(t=>{let i;if("."===e||""===e)i=t.name||t.path;else{const s=t.name||t.path;i=`${e}/${s}`}return{...t,path:i,loaded:"directory"!==t.type&&void 0,analyzed:"file"!==t.type&&void 0,expanded:!1,children:[]}}),s.loaded=!0,s.expanded=!0,this.root&&this.svg){const t=this.root;this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0,this.preserveExpansionState(t,this.root);const i=this.findD3NodeByPath(e);i&&(i.children=i._children||i.children,i._children=null,i.data.expanded=!0),this.update(this.root)}t.stats&&(this.stats.files+=t.stats.files||0,this.stats.directories+=t.stats.directories||0,this.updateStats()),this.updateBreadcrumb(`Loaded ${t.path}`,"success"),this.hideLoading()}}}),this.socket.on("code:top_level:discovered",t=>{t.items&&Array.isArray(t.items)&&(this.treeData.children=t.items.map(t=>({name:t.name,path:t.path,type:t.type,language:"file"===t.type?this.detectLanguage(t.path):void 0,size:t.size,lines:t.lines,loaded:"directory"!==t.type&&void 0,analyzed:"file"!==t.type&&void 0,expanded:!1,children:[]})),this.treeData.loaded=!0,t.stats&&(this.stats={...this.stats,...t.stats},this.updateStats()),"undefined"!=typeof d3&&(this.clearD3Visualization(),this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0,this.svg&&this.update(this.root)),this.analyzing=!1,this.hideLoading(),this.updateBreadcrumb(`Discovered ${t.items.length} root items`,"success"),this.showNotification(`Found ${t.items.length} items in project root`,"success"))}))}onAnalysisStart(t){this.analyzing=!0;const e=t.message||"Starting code analysis...";this.updateActivityTicker("🚀 Starting analysis...","info"),this.updateBreadcrumb(e,"info"),this.addEventToDisplay(`🚀 ${e}`,"info"),this.treeData&&0!==this.treeData.children.length||this.initializeTreeData(),this.stats={files:0,classes:0,functions:0,methods:0,lines:0},this.updateStats()}onTopLevelDiscovered(t){this.updateActivityTicker(`📁 Discovered ${(t.items||[]).length} top-level items`,"success"),this.addEventToDisplay(`📁 Found ${(t.items||[]).length} top-level items in project root`,"info");const e=this.findNodeByPath(".");console.log('🔎 Looking for root node with path ".", found:',e?{name:e.name,path:e.path,currentChildren:e.children?e.children.length:0}:"NOT FOUND"),e&&t.items?(console.log("🌳 Populating root node with children"),e.children=t.items.map(t=>{const e=t.name;return console.log(` Adding child: ${t.name} with path: ${e}`),{name:t.name,path:e,type:t.type,loaded:"directory"!==t.type&&void 0,analyzed:"file"!==t.type&&void 0,expanded:!1,children:"directory"===t.type?[]:void 0,size:t.size,has_code:t.has_code}}),e.loaded=!0,e.expanded=!0,this.root&&this.svg&&(this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0,this.update(this.root)),this.hideLoading(),this.updateBreadcrumb(`Discovered ${t.items.length} items`,"success"),this.showNotification(`Found ${t.items.length} top-level items`,"success")):(console.error("❌ Could not find root node to populate"),this.showNotification("Failed to populate root directory","error")),this.analyzing=!1}onDirectoryDiscovered(t){this.updateActivityTicker(`📁 Discovered: ${t.name||"directory"}`),this.addEventToDisplay(`📁 Found ${(t.children||[]).length} items in: ${t.name||t.path}`,"info"),console.log("📥 Received directory discovery:",{path:t.path,name:t.name,childrenCount:(t.children||[]).length,children:(t.children||[]).map(t=>({name:t.name,type:t.type})),workingDir:this.getWorkingDirectory()});let e=t.path;const i=this.getWorkingDirectory();i&&e.startsWith(i)&&(e=e.substring(i.length).replace(/^\//,""),e||(e=".")),console.log("🔎 Searching for node with path:",e);const s=this.findNodeByPath(e);if(s&&t.children){s.children=t.children.map(t=>{let i;if("."===e||""===e)i=t.name||t.path;else{const s=t.name||t.path;i=`${e}/${s}`}return{name:t.name,path:i,type:t.type,loaded:"directory"!==t.type&&void 0,analyzed:"file"!==t.type&&void 0,expanded:!1,children:"directory"===t.type?[]:void 0,size:t.size,has_code:t.has_code}}),s.loaded=!0,s.expanded=!0;const i=this.findD3NodeByPath(e);if(i&&this.loadingNodes.has(e)&&this.removeLoadingPulse(i),this.root&&this.svg){const t=this.root;this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0,this.preserveExpansionState(t,this.root);const i=this.findD3NodeByPath(e);i&&i.data.children&&i.data.children.length>0&&(i.children=i._children||i.children,i._children=null,i.data.expanded=!0),this.update(this.root)}this.updateBreadcrumb(`Loaded ${s.children.length} items from ${s.name}`,"success"),this.updateStats()}else if(s){if(s&&!t.children){const e=t.path?t.path.split("/").filter(t=>t):[];if(1===e.length||t.forceAdd){const i={name:t.name||e[e.length-1]||"Unknown",path:t.path,type:"directory",children:[],loaded:!1,expanded:!1,stats:t.stats||{}};this.addNodeToTree(i,t.parent||""),this.updateBreadcrumb(`Discovered: ${t.path}`,"info")}}}else this.logAllPaths(this.treeData)}onFileDiscovered(t){const e=t.name||(t.path?t.path.split("/").pop():"file");this.updateActivityTicker(`📄 Found: ${e}`),this.addEventToDisplay(`📄 Discovered: ${t.path||"Unknown file"}`,"info");const i=t.path?t.path.split("/").filter(t=>t):[],s=i.slice(0,-1).join("/"),o={name:t.name||i[i.length-1]||"Unknown",path:t.path,type:"file",language:t.language||this.detectLanguage(t.path),size:t.size||0,lines:t.lines||0,children:[],analyzed:!1};this.addNodeToTree(o,s),this.stats.files++,this.updateStats(),this.updateBreadcrumb(`Found: ${t.path}`,"info")}onFileAnalyzed(t){const e=this.findD3NodeByPath(t.path);if(e&&this.loadingNodes.has(t.path)&&this.removeLoadingPulse(e),t.path){const e=t.path.split("/").pop();this.updateActivityTicker(`🔍 Analyzed: ${e}`)}const i=this.findNodeByPath(t.path);i&&(i.analyzed=!0,i.complexity=t.complexity||0,i.lines=t.lines||0,t.elements&&Array.isArray(t.elements)&&(i.children=t.elements.map(e=>({name:e.name,type:e.type.toLowerCase(),path:`${t.path}#${e.name}`,line:e.line,complexity:e.complexity||1,docstring:e.docstring||"",children:e.methods?e.methods.map(i=>({name:i.name,type:"method",path:`${t.path}#${e.name}.${i.name}`,line:i.line,complexity:i.complexity||1,docstring:i.docstring||""})):[]}))),t.stats&&(this.stats.classes+=t.stats.classes||0,this.stats.functions+=t.stats.functions||0,this.stats.methods+=t.stats.methods||0,this.stats.lines+=t.stats.lines||0),this.updateStats(),this.root&&this.update(this.root),this.updateBreadcrumb(`Analyzed: ${t.path}`,"success"))}onNodeFound(t){const e="class"===t.type?"🏛️":"function"===t.type?"⚡":"method"===t.type?"🔧":"📦";this.addEventToDisplay(`${e} Found ${t.type||"node"}: ${t.name||"Unknown"}`);const i={name:t.name||"Unknown",type:(t.type||"unknown").toLowerCase(),path:t.path||"",line:t.line||0,complexity:t.complexity||1,docstring:t.docstring||""};i.type={class:"class",function:"function",method:"method",module:"module",file:"file",directory:"directory"}[i.type]||i.type;let s="";if(t.parent_path)s=t.parent_path;else if(t.file_path)s=t.file_path;else if(i.path.includes("/")){const t=i.path.split("/");t.pop(),s=t.join("/")}switch(i.type){case"class":this.stats.classes++;break;case"function":this.stats.functions++;break;case"method":this.stats.methods++;break;case"file":this.stats.files++}this.addNodeToTree(i,s),this.updateStats();const o=i.type.charAt(0).toUpperCase()+i.type.slice(1);this.updateBreadcrumb(`Found ${o}: ${i.name}`,"info")}onProgressUpdate(t){const e=t.progress||0,i=t.message||`Processing... ${e}%`;this.updateBreadcrumb(i,"info");const s=document.querySelector(".code-tree-progress");s&&(s.style.width=`${e}%`)}onAnalysisComplete(t){this.analyzing=!1,this.hideLoading(),this.updateActivityTicker("✅ Ready","success"),this.addEventToDisplay("✅ Analysis complete!","success"),this.root&&this.svg&&this.update(this.root),t.stats&&(this.stats={...this.stats,...t.stats},this.updateStats());const e=t.message||`Analysis complete: ${this.stats.files} files, ${this.stats.classes} classes, ${this.stats.functions} functions`;this.updateBreadcrumb(e,"success"),this.showNotification(e,"success")}onAnalysisError(t){this.analyzing=!1,this.hideLoading();const e=t.message||t.error||"Analysis failed";this.updateBreadcrumb(e,"error"),this.showNotification(e,"error")}onAnalysisAccepted(t){const e=t.message||"Analysis request accepted";this.updateBreadcrumb(e,"info")}onAnalysisQueued(t){const e=`Analysis queued (position ${t.position||0})`;this.updateBreadcrumb(e,"warning"),this.showNotification(e,"info")}onInfoEvent(t){t.type&&t.type.startsWith("discovery.")?"discovery.start"===t.type?this.updateBreadcrumb(t.message,"info"):"discovery.complete"===t.type?(this.updateBreadcrumb(t.message,"success"),t.stats):"discovery.directory"!==t.type&&"discovery.file"!==t.type||this.updateBreadcrumb(t.message,"info"):t.type&&t.type.startsWith("analysis.")?"analysis.start"===t.type?this.updateBreadcrumb(t.message,"info"):"analysis.complete"===t.type?(this.updateBreadcrumb(t.message,"success"),t.stats&&(t.stats.classes,t.stats.functions,t.stats.methods)):("analysis.class"===t.type||"analysis.function"===t.type||"analysis.method"===t.type||"analysis.parse"===t.type)&&this.updateBreadcrumb(t.message,"info"):t.type&&t.type.startsWith("filter.")?(window.debugMode||this.showFilterEvents)&&(console.debug("[FILTER]",t.type,t.path,t.reason),this.showFilterEvents&&this.updateBreadcrumb(t.message,"warning")):t.type&&t.type.startsWith("cache.")&&("cache.hit"===t.type?(console.debug("[CACHE HIT]",t.file),this.showCacheEvents&&this.updateBreadcrumb(t.message,"info")):"cache.miss"===t.type&&console.debug("[CACHE MISS]",t.file)),this.eventLogEnabled&&t.message&&this.addEventToDisplay(t)}addEventToDisplay(t){this.recentEvents||(this.recentEvents=[]),this.recentEvents.unshift({timestamp:t.timestamp||(new Date).toISOString(),type:t.type,message:t.message,data:t}),this.recentEvents.length>100&&this.recentEvents.pop()}onAnalysisCancelled(t){this.analyzing=!1,this.hideLoading();const e=t.message||"Analysis cancelled";this.updateBreadcrumb(e,"warning")}showNotification(t,e="info"){const i=document.createElement("div");i.className=`code-tree-notification ${e}`,i.textContent=t;const s=document.getElementById("code-tree-container");s&&(i.style.position="absolute",i.style.top="10px",i.style.right="10px",i.style.zIndex="1000",s.style.position&&"static"!==s.style.position||(s.style.position="relative"),s.appendChild(i),setTimeout(()=>{i.style.animation="slideOutRight 0.3s ease",setTimeout(()=>i.remove(),300)},3e3))}addNodeToTree(t,e=""){if(t.path&&t.path.startsWith("/"))return void console.error("Absolute path detected in node, skipping:",t.path);if(e&&e.startsWith("/"))return void console.error("Absolute path detected in parent, skipping:",e);let i=this.treeData;if(e&&(i=this.findNodeByPath(e),!i))return console.warn("Parent node not found, skipping node creation:",e),void console.warn("Attempted to add node:",t);const s=i.children?.find(e=>e.path===t.path||e.name===t.name&&e.type===t.type);s?Object.assign(s,t):(i.children||(i.children=[]),t.children||(t.children=[]),i.children.push(t),this.nodes.set(t.path,t),this.root&&this.svg&&(this.root=d3.hierarchy(this.treeData),this.root.x0=this.height/2,this.root.y0=0,(this.nodes.size<1e3||this.nodes.size%100==0)&&this.update(this.root)))}findNodeByPath(t,e=null){if(e||(e=this.treeData),e.path===t)return e;if(e.children)for(const i of e.children){const e=this.findNodeByPath(t,i);if(e)return e}return e.parent,null}logAllPaths(t,e=""){if(console.log(`${e}${t.path} (${t.name})`),t.children)for(const i of t.children)this.logAllPaths(i,e+" ")}findD3NodeByPath(t){return this.root?this.root.descendants().find(e=>e.data.path===t):null}preserveExpansionState(t,e){if(!t||!e)return;const i=new Map;t.descendants().forEach(t=>{(t.data.expanded||t.children&&!t._children)&&i.set(t.data.path,!0)}),e.descendants().forEach(t=>{i.has(t.data.path)&&(t.children=t._children||t.children,t._children=null,t.data.expanded=!0)})}updateStats(){const t={"file-count":this.stats.files,"class-count":this.stats.classes,"function-count":this.stats.functions,"line-count":this.stats.lines};for(const[i,s]of Object.entries(t)){const t=document.getElementById(i);t&&(t.textContent=s.toLocaleString())}const e=document.getElementById("code-progress-text");if(e){const t=this.analyzing?`Analyzing... ${this.stats.files} files processed`:`Ready - ${this.stats.files} files in tree`;e.textContent=t}}updateBreadcrumb(t,e="info"){const i=document.getElementById("breadcrumb-content");i&&(i.textContent=t,i.className=`breadcrumb-${e}`)}detectLanguage(t){return{py:"python",js:"javascript",ts:"typescript",jsx:"javascript",tsx:"typescript",java:"java",cpp:"cpp",c:"c",cs:"csharp",rb:"ruby",go:"go",rs:"rust",php:"php",swift:"swift",kt:"kotlin",scala:"scala",r:"r",sh:"bash",ps1:"powershell"}[t.split(".").pop().toLowerCase()]||"unknown"}addVisualizationControls(){const t=this.svg.append("g").attr("class","viz-controls").attr("transform","translate(10, 10)").append("g").attr("class","layout-toggle").style("cursor","pointer").on("click",()=>this.toggleLayout());t.append("rect").attr("width",120).attr("height",30).attr("rx",5).attr("fill","#3b82f6").attr("opacity",.8),t.append("text").attr("x",60).attr("y",20).attr("text-anchor","middle").attr("fill","white").style("font-size","12px").text(this.isRadialLayout?"Switch to Linear":"Switch to Radial")}toggleLayout(){this.isRadialLayout=!this.isRadialLayout,this.createVisualization(),this.root&&this.update(this.root),this.showNotification(this.isRadialLayout?"Switched to radial layout":"Switched to linear layout","info")}radialPoint(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]}update(t){if(!this.treeLayout||!this.treeGroup||!t)return;const e=this.treeLayout(this.root),i=e.descendants(),s=e.descendants().slice(1);this.isRadialLayout&&i.forEach(t=>{void 0===t.x0&&(t.x0=t.x,t.y0=t.y)});const o=this.treeGroup.selectAll("g.node").data(i,t=>t.id||(t.id=++this.nodeId)),n=o.enter().append("g").attr("class","node").attr("transform",e=>{if(this.isRadialLayout){const[e,i]=this.radialPoint(t.x0||0,t.y0||0);return`translate(${e},${i})`}return`translate(${t.y0},${t.x0})`}).on("click",(t,e)=>this.onNodeClick(t,e));n.append("circle").attr("class","node-circle").attr("r",1e-6).style("fill",t=>this.getNodeColor(t)).style("stroke",t=>this.getNodeStrokeColor(t)).style("stroke-width",2).on("mouseover",(t,e)=>this.showTooltip(t,e)).on("mouseout",()=>this.hideTooltip()),n.append("text").attr("class","node-label").attr("dy",".35em").attr("x",t=>this.isRadialLayout?0:t.children||t._children?-13:13).attr("text-anchor",t=>this.isRadialLayout?"start":t.children||t._children?"end":"start").text(t=>{const e=t.data.name||"";return e.length>20?e.substring(0,17)+"...":e}).style("fill-opacity",1e-6).style("font-size","12px").style("font-family",'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif').style("text-shadow","1px 1px 2px rgba(255,255,255,0.8), -1px -1px 2px rgba(255,255,255,0.8)"),n.append("text").attr("class","node-icon").attr("dy",".35em").attr("x",0).attr("text-anchor","middle").text(t=>this.getNodeIcon(t)).style("font-size","10px").style("fill","white");const a=n.merge(o);a.transition().duration(this.duration).attr("transform",t=>{if(this.isRadialLayout){const[e,i]=this.radialPoint(t.x,t.y);return`translate(${e},${i})`}return`translate(${t.y},${t.x})`}),a.select("circle.node-circle").attr("r",8).style("fill",t=>this.getNodeColor(t)).style("stroke",t=>this.getNodeStrokeColor(t)).attr("cursor","pointer");const r=this.isRadialLayout;a.select("text.node-label").style("fill-opacity",1).style("fill","#333").each(function(t){const e=d3.select(this);if(r){const i=180*t.x/Math.PI-90;i>90||i<-90?e.attr("transform",`rotate(${i+180})`).attr("x",-15).attr("text-anchor","end").attr("dy",".35em"):e.attr("transform",`rotate(${i})`).attr("x",15).attr("text-anchor","start").attr("dy",".35em")}else e.attr("transform",null).attr("x",t.children||t._children?-13:13).attr("text-anchor",t.children||t._children?"end":"start").attr("dy",".35em")});const d=o.exit().transition().duration(this.duration).attr("transform",e=>{if(this.isRadialLayout){const[e,i]=this.radialPoint(t.x,t.y);return`translate(${e},${i})`}return`translate(${t.y},${t.x})`}).remove();d.select("circle").attr("r",1e-6),d.select("text.node-label").style("fill-opacity",1e-6),d.select("text.node-icon").style("fill-opacity",1e-6);const l=this.treeGroup.selectAll("path.link").data(s,t=>t.id);l.enter().insert("path","g").attr("class","link").attr("d",e=>{const i={x:t.x0,y:t.y0};return this.isRadialLayout?this.radialDiagonal(i,i):this.diagonal(i,i)}).style("fill","none").style("stroke","#ccc").style("stroke-width",2).merge(l).transition().duration(this.duration).attr("d",t=>this.isRadialLayout?this.radialDiagonal(t,t.parent):this.diagonal(t,t.parent)),l.exit().transition().duration(this.duration).attr("d",e=>{const i={x:t.x,y:t.y};return this.isRadialLayout?this.radialDiagonal(i,i):this.diagonal(i,i)}).remove(),i.forEach(t=>{t.x0=t.x,t.y0=t.y})}centerOnNode(t){if(!this.svg||!this.zoom)return;const e=d3.zoomTransform(this.svg.node()),i=e.k<2?2:e.k,s=this.margin.left+100,o=this.height/2,n=s-t.y*i+this.width/2,a=o-t.x*i+this.height/2;this.svg.transition().duration(750).call(this.zoom.transform,d3.zoomIdentity.translate(n,a).scale(i))}centerOnNodeRadial(t){if(!this.svg||!this.zoom)return;const[e,i]=this.radialPoint(t.x,t.y),s=d3.zoomTransform(this.svg.node()),o=s.k<2?2:s.k,n=this.width/2-e*o,a=this.height/2-i*o;this.svg.transition().duration(750).call(this.zoom.transform,d3.zoomIdentity.translate(n,a).scale(o))}highlightActiveNode(t){const e=this.treeGroup.selectAll("circle.node-circle");e.classed("active",!1).classed("parent-context",!1),e.transition().duration(300).attr("r",8).style("stroke",null).style("stroke-width",null).style("opacity",null),this.treeGroup.selectAll("text.node-label").style("font-weight","normal").style("font-size","12px");const i=this.treeGroup.selectAll("g.node").filter(e=>e===t).select("circle.node-circle");i.classed("active",!0),i.transition().duration(300).attr("r",20).style("stroke","#3b82f6").style("stroke-width",5).style("filter","drop-shadow(0 0 15px rgba(59, 130, 246, 0.6))"),this.treeGroup.selectAll("g.node").filter(e=>e===t).select("text.node-label").style("font-weight","bold").style("font-size","14px"),this.activeNode=t}addLoadingPulse(t){const e=this.treeGroup.selectAll("g.node").filter(e=>e===t).select("circle.node-circle");this.loadingNodes.add(t.data.path),e.classed("loading-pulse",!0),e.style("fill","#fb923c");const i=()=>{this.loadingNodes.has(t.data.path)&&e.transition().duration(600).attr("r",14).style("opacity",.6).transition().duration(600).attr("r",10).style("opacity",1).on("end",()=>{this.loadingNodes.has(t.data.path)&&i()})};i()}removeLoadingPulse(t){this.loadingNodes.delete(t.data.path);const e=this.treeGroup.selectAll("g.node").filter(e=>e===t).select("circle.node-circle");e.classed("loading-pulse",!1),e.interrupt().transition().duration(300).attr("r",this.activeNode===t?20:8).style("opacity",1).style("fill",t=>this.getNodeColor(t))}showWithParent(t){if(!t.parent)return;const e=this.treeGroup.selectAll("g.node").filter(e=>e===t.parent).select("circle.node-circle");if(e.classed("parent-context",!0),e.style("stroke","#10b981").style("stroke-width",3).style("opacity",.8),this.isRadialLayout&&t.parent){const e=[t,t.parent];t.children?e.push(...t.children):t._children&&e.push(...t._children);const i=e.map(t=>t.x),s=e.map(t=>t.y),o=Math.min(...i),n=Math.max(...i),a=Math.max(...s),r=n-o,d=Math.min(r>0?2*Math.PI/(2*r):2.5,this.width/(2*a),2.5),l=(o+n)/2,c=a/2,h=c*Math.cos(l-Math.PI/2),p=c*Math.sin(l-Math.PI/2);this.svg.transition().duration(750).call(this.zoom.transform,d3.zoomIdentity.translate(this.width/2-h*d,this.height/2-p*d).scale(d))}}onNodeClick(t,e){if(t)try{"function"==typeof t.stopPropagation&&t.stopPropagation()}catch(n){console.error("[CodeTree] ERROR calling stopPropagation:",n)}if(!e)return void console.error("[CodeTree] ERROR: d is null/undefined, cannot continue");if(!e.data)return void console.error("[CodeTree] ERROR: d.data is null/undefined, cannot continue");try{this.isRadialLayout?"function"==typeof this.centerOnNodeRadial?this.centerOnNodeRadial(e):console.error("[CodeTree] centerOnNodeRadial is not a function!"):"function"==typeof this.centerOnNode?this.centerOnNode(e):console.error("[CodeTree] centerOnNode is not a function!")}catch(n){console.error("[CodeTree] ERROR during centering:",n,n.stack)}try{"function"==typeof this.highlightActiveNode?this.highlightActiveNode(e):console.error("[CodeTree] highlightActiveNode is not a function!")}catch(n){console.error("[CodeTree] ERROR during highlightActiveNode:",n,n.stack)}try{"function"==typeof this.showWithParent?this.showWithParent(e):console.error("[CodeTree] showWithParent is not a function!")}catch(n){console.error("[CodeTree] ERROR during showWithParent:",n,n.stack)}if("directory"===e.data.type&&!e.data.loaded)try{"function"==typeof this.addLoadingPulse?this.addLoadingPulse(e):console.error("[CodeTree] addLoadingPulse is not a function!")}catch(n){console.error("[CodeTree] ERROR during addLoadingPulse:",n,n.stack)}const i=[];document.querySelectorAll(".language-checkbox:checked").forEach(t=>{i.push(t.value)});const s=document.getElementById("ignore-patterns"),o=s?.value||"";if("directory"!==e.data.type||e.data.loaded)if("file"!==e.data.type||e.data.analyzed)if("directory"===e.data.type&&!0===e.data.loaded){if(e.children)e._children=e.children,e.children=null,e.data.expanded=!1;else if(e._children)e.children=e._children,e._children=null,e.data.expanded=!0;else if(e.data.children&&e.data.children.length>0){this.root=d3.hierarchy(this.treeData);const t=this.findD3NodeByPath(e.data.path);t&&(t.children=t._children||t.children,t._children=null,t.data.expanded=!0)}this.update(this.root)}else(e.children||e._children)&&(e.children?(e._children=e.children,e.children=null,e.data.expanded=!1):(e.children=e._children,e._children=null,e.data.expanded=!0),this.update(e));else{const t=this.detectLanguage(e.data.path);if(!i.includes(t)&&"unknown"!==t)return void this.showNotification(`Skipping ${e.data.name} - ${t} not selected`,"warning");this.addLoadingPulse(e),e.data.analyzed="loading";const s=this.ensureFullPath(e.data.path);setTimeout(()=>{this.socket&&(this.socket.emit("code:analyze:file",{path:s}),this.updateBreadcrumb(`Analyzing ${e.data.name}...`,"info"),this.showNotification(`Analyzing: ${e.data.name}`,"info"))},100)}else{e.data.loaded="loading";const t=this.ensureFullPath(e.data.path);setTimeout(()=>{this.socket&&(this.socket.emit("code:discover:directory",{path:t,depth:1,languages:i,ignore_patterns:o}),this.updateBreadcrumb(`Loading ${e.data.name}...`,"info"),this.showNotification(`Loading directory: ${e.data.name}`,"info"))},100)}this.selectedNode=e;try{this.highlightNode(e)}catch(n){console.error("[CodeTree] ERROR during highlightNode:",n)}}ensureFullPath(t){if(console.log("🔗 ensureFullPath called with:",t),!t)return t;if(t.startsWith("/"))return console.log(" → Already absolute, returning:",t),t;const e=this.getWorkingDirectory();if(console.log(" → Working directory:",e),!e)return console.log(" → No working directory, returning original:",t),t;if("."===t)return console.log(" → Root path detected, returning working dir:",e),e;if(t===e)return console.log(" → Path equals working directory, returning:",e),e;const i=`${e}/${t}`.replace(/\/+/g,"/");return console.log(" → Combining with working dir, result:",i),i}highlightNode(t){this.treeGroup.selectAll("circle.node-circle").style("stroke-width",2).classed("selected",!1),this.treeGroup.selectAll("circle.node-circle").filter(e=>e===t).style("stroke-width",4).classed("selected",!0)}diagonal(t,e){return`M ${t.y} ${t.x}\n C ${(t.y+e.y)/2} ${t.x},\n ${(t.y+e.y)/2} ${e.x},\n ${e.y} ${e.x}`}radialDiagonal(t,e){return d3.linkRadial().angle(t=>t.x).radius(t=>t.y)({source:t,target:e})}getNodeColor(t){const e=t.data.type,i=t.data.complexity||1,s={root:"#6B7280",directory:"#3B82F6",file:"#10B981",module:"#8B5CF6",class:"#F59E0B",function:"#EF4444",method:"#EC4899"}[e]||"#6B7280";return i>10?d3.color(s).darker(.5):i>5?d3.color(s).darker(.25):s}getNodeStrokeColor(t){return"loading"===t.data.loaded||"loading"===t.data.analyzed?"#FCD34D":"directory"!==t.data.type||t.data.loaded?"file"!==t.data.type||t.data.analyzed?this.getNodeColor(t):"#CBD5E1":"#94A3B8"}getNodeIcon(t){return{root:"📦",directory:"📁",file:"📄",module:"📦",class:"C",function:"ƒ",method:"m"}[t.data.type]||"•"}showTooltip(t,e){if(!this.tooltip)return;const i=[];i.push(`<strong>${e.data.name}</strong>`),i.push(`Type: ${e.data.type}`),e.data.language&&i.push(`Language: ${e.data.language}`),e.data.complexity&&i.push(`Complexity: ${e.data.complexity}`),e.data.lines&&i.push(`Lines: ${e.data.lines}`),e.data.path&&i.push(`Path: ${e.data.path}`),"directory"!==e.data.type||e.data.loaded?"file"!==e.data.type||e.data.analyzed||i.push("<em>Click to analyze file</em>"):i.push("<em>Click to explore contents</em>"),this.tooltip.transition().duration(200).style("opacity",.9),this.tooltip.html(i.join("<br>")).style("left",t.pageX+10+"px").style("top",t.pageY-28+"px")}hideTooltip(){this.tooltip&&this.tooltip.transition().duration(500).style("opacity",0)}filterTree(){this.root&&(this.root.descendants().forEach(t=>{t.data._hidden=!1,"all"!==this.languageFilter&&"file"===t.data.type&&t.data.language!==this.languageFilter&&(t.data._hidden=!0),this.searchTerm&&(t.data.name.toLowerCase().includes(this.searchTerm)||(t.data._hidden=!0))}),this.update(this.root))}expandAll(){if(!this.root)return;const t=e=>{e._children&&(e.children=e._children,e._children=null),e.children&&e.children.forEach(t)};t(this.root),this.update(this.root),this.showNotification("All nodes expanded","info")}collapseAll(){if(!this.root)return;const t=e=>{e.children&&(e._children=e.children,e.children=null),e._children&&e._children.forEach(t)};this.root.children?.forEach(t),this.update(this.root),this.showNotification("All nodes collapsed","info")}resetZoom(){this.svg&&this.zoom&&(this.svg.transition().duration(750).call(this.zoom.transform,d3.zoomIdentity),this.showNotification("Zoom reset","info"))}focusOnNode(t){if(!this.svg||!this.zoom||!t)return;const e=t.descendants?t.descendants():[t];if(this.isRadialLayout){const t=e.map(t=>t.x),i=e.map(t=>t.y),s=Math.min(...t),o=Math.max(...t),n=Math.min(...i),a=Math.max(...i),r=(s+o)/2,d=(n+a)/2,l=d*Math.cos(r-Math.PI/2),c=d*Math.sin(r-Math.PI/2),h=o-s,p=a-n;let u=1;if(h>0&&p>0){const t=2*Math.PI/h,e=this.radius/p;u=Math.min(t,e,3),u=Math.max(u,1)}this.svg.transition().duration(750).call(this.zoom.transform,d3.zoomIdentity.translate(this.width/2-l*u,this.height/2-c*u).scale(u))}else{const t=e.map(t=>t.x),i=e.map(t=>t.y),s=Math.min(...t),o=Math.max(...t),n=Math.min(...i),a=Math.max(...i),r=(s+o)/2,d=(n+a)/2,l=o-s,c=a-n,h=100;let p=1;if(l>0&&c>0){const t=(this.width-h)/l,e=(this.height-h)/c;p=Math.min(t,e,2.5),p=Math.max(p,.5)}this.svg.transition().duration(750).call(this.zoom.transform,d3.zoomIdentity.translate(this.width/2-r*p,this.height/2-d*p).scale(p))}const i=this.getNodePath(t);this.updateBreadcrumb(`Focused: ${i}`,"info")}getNodePath(t){const e=[];let i=t;for(;i;)i.data&&i.data.name&&e.unshift(i.data.name),i=i.parent;return e.join(" / ")}toggleLegend(){const t=document.getElementById("tree-legend");t&&("none"===t.style.display?t.style.display="block":t.style.display="none")}getWorkingDirectory(){if(window.dashboard&&window.dashboard.workingDirectoryManager)return window.dashboard.workingDirectoryManager.getCurrentWorkingDir();const t=document.getElementById("working-dir-path");if(t){const e=t.textContent.trim();if(e&&"Loading..."!==e&&"Not selected"!==e)return e}return null}showNoWorkingDirectoryMessage(){const t=document.getElementById("code-tree-container");if(!t)return;this.removeNoWorkingDirectoryMessage(),this.hideLoading();const e=document.createElement("div");e.id="no-working-dir-message",e.className="no-working-dir-message",e.innerHTML='\n <div class="message-icon">📁</div>\n <h3>No Working Directory Selected</h3>\n <p>Please select a working directory from the top menu to analyze code.</p>\n <button id="select-working-dir-btn" class="btn btn-primary">\n Select Working Directory\n </button>\n ',e.style.cssText="\n text-align: center;\n padding: 40px;\n color: #666;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n ";const i=e.querySelector(".message-icon");i&&(i.style.cssText="font-size: 48px; margin-bottom: 16px; opacity: 0.5;");const s=e.querySelector("h3");s&&(s.style.cssText="margin: 16px 0; color: #333; font-size: 20px;");const o=e.querySelector("p");o&&(o.style.cssText="margin: 16px 0; color: #666; font-size: 14px;");const n=e.querySelector("button");n&&(n.style.cssText="\n margin-top: 20px;\n padding: 10px 20px;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n transition: background 0.2s;\n ",n.addEventListener("mouseenter",()=>{n.style.background="#2563eb"}),n.addEventListener("mouseleave",()=>{n.style.background="#3b82f6"}),n.addEventListener("click",()=>{const t=document.getElementById("change-dir-btn");t?t.click():window.dashboard&&window.dashboard.workingDirectoryManager&&window.dashboard.workingDirectoryManager.showChangeDirDialog()})),t.appendChild(e),this.updateBreadcrumb("Please select a working directory","warning")}removeNoWorkingDirectoryMessage(){const t=document.getElementById("no-working-dir-message");t&&t.remove()}exportTree(){const t={timestamp:(new Date).toISOString(),workingDirectory:this.getWorkingDirectory(),stats:this.stats,tree:this.treeData},e=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),i=URL.createObjectURL(e),s=document.createElement("a");s.href=i,s.download=`code-tree-${Date.now()}.json`,s.click(),URL.revokeObjectURL(i),this.showNotification("Tree exported successfully","success")}updateActivityTicker(t,e="info"){const i=document.getElementById("breadcrumb-content");if(i){const s="info"===e&&t.includes("...")?"⟳ ":"";i.innerHTML=`${s}${t}`,i.className=`breadcrumb-${e}`}}updateTicker(t,e="info"){const i=document.getElementById("code-tree-ticker");i&&(i.textContent=t,i.className=`ticker ticker-${e}`,"error"!==e&&setTimeout(()=>{i.style.opacity="0",setTimeout(()=>{i.style.opacity="1",i.textContent=""},300)},5e3))}}window.CodeTree=t,document.addEventListener("DOMContentLoaded",()=>{document.getElementById("code-tree-container")&&(window.codeTree=new t,document.addEventListener("click",t=>{t.target.matches('[data-tab="code"]')&&setTimeout(()=>{window.codeTree&&!window.codeTree.initialized?window.codeTree.initialize():window.codeTree&&window.codeTree.renderWhenVisible()},100)}))});
|
|
2
|
+
//# sourceMappingURL=code-tree.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{S as e,U as t}from"./socket-client.js";import{E as n,a as i}from"./components/event-viewer.js";import{M as s}from"./components/module-viewer.js";import{S as o}from"./components/session-manager.js";import{A as a}from"./components/agent-inference.js";import{E as r}from"./components/export-manager.js";import{W as l}from"./components/working-directory.js";import{F as d}from"./components/file-tool-tracker.js";class c{constructor(e,t){this.agentInference=e,this.eventViewer=t,this.state={hierarchyTree:null,nodeMap:new Map,expandedNodes:new Set,selectedNode:null},this.expandAll=!0,this.setupEventListeners(),console.log("Agent hierarchy component initialized")}setupEventListeners(){document.addEventListener("click",e=>{const t=e.target.closest("[data-toggle-node]");if(t&&window.dashboard&&window.dashboard.agentHierarchy){const e=t.dataset.toggleNode;window.dashboard.agentHierarchy.toggleNode(e)}})}buildHierarchy(){this.agentInference.processAgentInference();const e=this.agentInference.getPMDelegations(),t=this.eventViewer.events,n=this.agentInference.getEventAgentMap(),i={id:"pm_main",type:"pm",name:"PM (Main Session)",children:[],events:[],eventCount:0,status:"active",startTime:null,endTime:null,expanded:!0},s=new Map;this.state.nodeMap.clear(),this.state.nodeMap.set(i.id,i);const o=new Set;for(const[h,u]of e){const e={id:h,type:"subagent",name:u.agentName,delegationContext:this.extractDelegationContext(u.pmCall),children:[],events:u.agentEvents,eventCount:u.agentEvents.length,status:u.endIndex?"completed":"active",startTime:u.timestamp,endTime:u.endIndex?t[u.endIndex]?.timestamp:null,startIndex:u.startIndex,endIndex:u.endIndex,expanded:this.expandAll||this.state.expandedNodes.has(h)};if(i.children.push(e),this.state.nodeMap.set(h,e),o.add(u.agentName),i.eventCount++,(!i.startTime||new Date(u.timestamp)<new Date(i.startTime))&&(i.startTime=u.timestamp),u.endIndex&&t[u.endIndex]){const e=t[u.endIndex].timestamp;(!i.endTime||new Date(e)>new Date(i.endTime))&&(i.endTime=e)}}const a=this.agentInference.getOrphanGroups();let r=1;for(const[h,u]of a){const i={id:`pm_implied_${h}`,type:"pm",name:`PM (Implied #${r})`,children:[],events:[],eventCount:0,status:"inferred",startTime:null,endTime:null,expanded:!0,isImplied:!0,tooltip:"Inferred PM - Subagents started without explicit PM delegation"};s.set(h,i),this.state.nodeMap.set(i.id,i),r++;const o=new Map;for(const s of u){const i=[];t.forEach((t,o)=>{const a=n.get(o);if(a&&a.agentName===s.agentName){let n=!0;for(const[t,i]of e)if(i.agentEvents.some(e=>e.eventIndex===o)){n=!1;break}n&&i.push({eventIndex:o,event:t,inference:a})}}),i.length>0&&(o.has(s.agentName)||o.set(s.agentName,[]),o.get(s.agentName).push(...i))}for(const[e,t]of o){if(0===t.length)continue;const n=t[0].event,s=t[t.length-1].event,o={id:`implied_agent_${h}_${e}`,type:"subagent",name:e,delegationContext:"Orphan agent - no explicit PM delegation found",children:[],events:t,eventCount:t.length,status:"inferred",startTime:n.timestamp,endTime:s.timestamp,startIndex:t[0].eventIndex,endIndex:t[t.length-1].eventIndex,expanded:this.expandAll,isImplied:!0,tooltip:"This agent was spawned without an explicit PM Task delegation"};i.children.push(o),this.state.nodeMap.set(o.id,o),i.eventCount+=t.length,(!i.startTime||new Date(n.timestamp)<new Date(i.startTime))&&(i.startTime=n.timestamp),(!i.endTime||new Date(s.timestamp)>new Date(i.endTime))&&(i.endTime=s.timestamp)}}const l=[];if(t.forEach((t,i)=>{const o=n.get(i);if(o&&"subagent"===o.type){let n=!0;for(const[t,s]of e)if(s.agentEvents.some(e=>e.eventIndex===i)){n=!1;break}if(n)for(const[e,t]of s){for(const e of t.children)if(e.events.some(e=>e.eventIndex===i)){n=!1;break}if(!n)break}n&&l.push({eventIndex:i,event:t,inference:o})}}),l.length>0){const e={id:"pm_implied_generic",type:"pm",name:"PM (Implied - Uncategorized)",children:[],events:[],eventCount:0,status:"inferred",startTime:null,endTime:null,expanded:!0,isImplied:!0,tooltip:"Orphan agents without clear grouping"},t=new Map;for(const n of l){const e=n.inference.agentName;t.has(e)||t.set(e,[]),t.get(e).push(n)}for(const[n,i]of t){const t=i[0].event,s=i[i.length-1].event,o={id:`implied_generic_${n}`,type:"subagent",name:n,delegationContext:"Uncategorized orphan agent",children:[],events:i,eventCount:i.length,status:"inferred",startTime:t.timestamp,endTime:s.timestamp,startIndex:i[0].eventIndex,endIndex:i[i.length-1].eventIndex,expanded:this.expandAll,isImplied:!0};e.children.push(o),this.state.nodeMap.set(o.id,o),e.eventCount+=i.length,(!e.startTime||new Date(t.timestamp)<new Date(e.startTime))&&(e.startTime=t.timestamp),(!e.endTime||new Date(s.timestamp)>new Date(e.endTime))&&(e.endTime=s.timestamp)}e.children.length>0&&(s.set("generic",e),this.state.nodeMap.set(e.id,e))}let d=0;if(t.forEach((e,t)=>{const s=n.get(t);s&&"main_agent"===s.type&&(d++,i.events.push({eventIndex:t,event:e,inference:s}))}),i.eventCount+=d,i.children.length>0){const e=i.children.some(e=>"active"===e.status);i.status=e?"active":"completed"}const c={roots:[]};(i.eventCount>0||i.children.length>0)&&c.roots.push(i);for(const[h,u]of s)u.children.length>0&&c.roots.push(u);return this.state.hierarchyTree=c,console.log("Hierarchy built:",{mainPM:{children:i.children.length,events:i.eventCount,ownEvents:d},impliedPMGroups:s.size,totalImpliedAgents:Array.from(s.values()).reduce((e,t)=>e+t.children.length,0)}),c}extractDelegationContext(e){if(!e)return"Unknown delegation";const t=e.tool_parameters||e.data?.tool_parameters||{},n=t.task||t.request||t.description;if(n){const e=100;return n.length>e?n.substring(0,e)+"...":n}const i=e.tool_input||e.data?.tool_input;if(i&&"string"==typeof i){const e=100;return i.length>e?i.substring(0,e)+"...":i}return"Task delegation"}render(e={}){const t=this.state.hierarchyTree||this.buildHierarchy();if(!t.roots||0===t.roots.length)return'<div class="agent-hierarchy-empty">No agent activity detected</div>';return`<div class="agent-hierarchy">${this.applyFilters(t,e).roots.map(e=>this.renderNode(e,0)).join("")}</div>`}renderNode(e,t){const n=e.expanded||this.state.expandedNodes.has(e.id),i=e.children&&e.children.length>0,s=this.state.selectedNode===e.id,o=this.getNodeIcon(e),a=i?n?"▼":"▶":" ",r=this.getStatusClass(e.status),l=e.isImplied?"agent-node-implied":"",d=e.tooltip?`title="${this.escapeHtml(e.tooltip)}"`:"";let c=`\n <div class="agent-node agent-node-level-${t} ${s?"agent-node-selected":""} ${l}" \n data-node-id="${e.id}" ${d}>\n <div class="agent-node-header ${r}" \n data-toggle-node="${e.id}" style="cursor: pointer">\n <span class="agent-node-expand">${a}</span>\n <span class="agent-node-icon">${o}</span>\n <span class="agent-node-name">${this.escapeHtml(e.name)}</span>\n <span class="agent-node-stats">\n <span class="agent-event-count">${e.eventCount} events</span>\n ${e.status?`<span class="agent-status">${e.status}</span>`:""}\n </span>\n </div>\n `;if(n&&(e.delegationContext||e.startTime)){if(c+='<div class="agent-node-details">',e.delegationContext&&"Unknown delegation"!==e.delegationContext&&(c+=`\n <div class="agent-delegation-context">\n <strong>Task:</strong> ${this.escapeHtml(e.delegationContext)}\n </div>\n `),e.startTime){const t=this.calculateDuration(e.startTime,e.endTime);c+=`\n <div class="agent-timing">\n <span class="agent-time-start">${this.formatTime(e.startTime)}</span>\n ${t?`<span class="agent-duration">(${t})</span>`:""}\n </div>\n `}c+="</div>"}return n&&i&&(c+='<div class="agent-node-children">',c+=e.children.map(e=>this.renderNode(e,t+1)).join(""),c+="</div>"),c+="</div>",c}getNodeIcon(e){if("pm"===e.type)return e.isImplied?"🔍":"👔";return{"Engineer Agent":"🔧","Research Agent":"🔍","QA Agent":"✅","Documentation Agent":"📝","Security Agent":"🔒","Ops Agent":"⚙️","Version Control Agent":"📦","Data Engineer Agent":"💾","Test Integration Agent":"🧪"}[e.name]||"🤖"}getStatusClass(e){switch(e){case"active":return"agent-status-active";case"completed":return"agent-status-completed";case"pending":return"agent-status-pending";case"inferred":return"agent-status-inferred";default:return"agent-status-unknown"}}toggleNode(e){const t=this.state.nodeMap.get(e);t&&(this.state.expandedNodes.has(e)?(this.state.expandedNodes.delete(e),t.expanded=!1):(this.state.expandedNodes.add(e),t.expanded=!0),window.dashboard&&window.dashboard.renderCurrentTab())}selectNode(e){this.state.selectedNode=e;const t=this.state.nodeMap.get(e);if(t){const e=new CustomEvent("agentNodeSelected",{detail:{node:t}});document.dispatchEvent(e)}}applyFilters(e,t){if(!t||0===Object.keys(t).length)return e;const n={roots:[]};for(const i of e.roots){const e=this.filterNode(i,t);e&&n.roots.push(e)}return n}filterNode(e,t){let n=!0;if(t.searchText){const i=t.searchText.toLowerCase();n=n&&(e.name.toLowerCase().includes(i)||e.delegationContext&&e.delegationContext.toLowerCase().includes(i))}t.agentType&&(n=n&&e.name.includes(t.agentType)),t.status&&(n=n&&e.status===t.status);let i=[];if(e.children)for(const s of e.children){const e=this.filterNode(s,t);e&&i.push(e)}return n||i.length>0?{...e,children:i}:null}formatTime(e){if(!e)return"";return new Date(e).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}calculateDuration(e,t){if(!e||!t)return"";const n=new Date(e).getTime(),i=new Date(t).getTime()-n;if(i<1e3)return`${i}ms`;if(i<6e4)return`${(i/1e3).toFixed(1)}s`;return`${Math.floor(i/6e4)}m ${Math.floor(i%6e4/1e3)}s`}escapeHtml(e){if(!e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML}updateWithNewEvents(e){this.buildHierarchy()}clear(){this.state.hierarchyTree=null,this.state.nodeMap.clear(),this.state.expandedNodes.clear(),this.state.selectedNode=null}expandAllNodes(){for(const[e,t]of this.state.nodeMap)this.state.expandedNodes.add(e),t.expanded=!0;this.expandAll=!0}collapseAllNodes(){this.state.expandedNodes.clear();for(const[e,t]of this.state.nodeMap)t.expanded=!1;this.expandAll=!1}}class h{constructor(){this.element=null,this.buildInfo={monitor:{version:"1.0.0",build:1,formatted_build:"0001",full_version:"v1.0.0-0001"},mpm:{version:"unknown",build:"unknown",full_version:"v0.0.0"}},this.socketClient=null,this.init()}async init(){await this.loadDashboardVersion(),this.createElements(),this.setupEventListeners()}async loadDashboardVersion(){try{const e=await fetch("/version.json");if(e.ok){const t=await e.json();this.buildInfo.monitor={version:t.version||"1.0.0",build:t.build||1,formatted_build:t.formatted_build||"0001",full_version:t.full_version||"v1.0.0-0001"}}}catch(e){}}createElements(){this.element=document.createElement("div"),this.element.className="version-display",this.element.id="version-display";const e=document.createElement("span");e.className="version-item mpm-version",e.id="mpm-version",e.innerHTML='\n <span class="version-label">MPM</span>\n <span class="version-value">v0.0.0</span>\n ';const t=document.createElement("span");t.className="version-separator",t.textContent="|";const n=document.createElement("span");n.className="version-item monitor-version",n.id="monitor-version",n.innerHTML='\n <span class="version-label">Monitor</span>\n <span class="version-value">v1.0.0-0001</span>\n ',this.element.appendChild(e),this.element.appendChild(t),this.element.appendChild(n),this.element.title="Click for detailed version information"}setSocketClient(e){this.socketClient=e,this.socketClient&&this.socketClient.socket&&(this.socketClient.socket.on("welcome",e=>{const t=e.build_info||e.data&&e.data.build_info;t&&this.updateBuildInfo(t)}),this.socketClient.socket.on("status",e=>{const t=e.build_info||e.data&&e.data.build_info;t&&this.updateBuildInfo(t)}),this.socketClient.socket.on("build_info",e=>{this.updateBuildInfo(e)}))}updateBuildInfo(e){this.buildInfo=e,this.updateDisplay()}updateDisplay(){const e=this.element.querySelector(".mpm-version .version-value");if(e&&this.buildInfo.mpm){const t=this.buildInfo.mpm.full_version||`v${this.buildInfo.mpm.version}`;e.textContent=t,this.buildInfo.mpm.build&&"unknown"!==this.buildInfo.mpm.build&&(e.parentElement.title=`MPM Build: ${this.buildInfo.mpm.build}`)}const t=this.element.querySelector(".monitor-version .version-value");if(t&&this.buildInfo.monitor){const e=this.buildInfo.monitor.full_version||`v${this.buildInfo.monitor.version}-${this.buildInfo.monitor.formatted_build}`;if(t.textContent=e,this.buildInfo.monitor.last_updated){const e=new Date(this.buildInfo.monitor.last_updated).toLocaleString();t.parentElement.title=`Monitor Build: ${this.buildInfo.monitor.formatted_build}\nLast Updated: ${e}`}}}setupEventListeners(){this.element.addEventListener("click",()=>{this.showDetailedInfo()})}showDetailedInfo(){const e=[];if(this.buildInfo.mpm&&(e.push("=== MPM Framework ==="),e.push(`Version: ${this.buildInfo.mpm.version}`),this.buildInfo.mpm.build&&"unknown"!==this.buildInfo.mpm.build&&e.push(`Build: ${this.buildInfo.mpm.build}`),e.push(`Full: ${this.buildInfo.mpm.full_version}`)),e.push(""),this.buildInfo.monitor&&(e.push("=== Monitor UI ==="),e.push(`Version: ${this.buildInfo.monitor.version}`),e.push(`Build: ${this.buildInfo.monitor.formatted_build} (${this.buildInfo.monitor.build})`),e.push(`Full: ${this.buildInfo.monitor.full_version}`),this.buildInfo.monitor.last_updated)){const t=new Date(this.buildInfo.monitor.last_updated).toLocaleString();e.push(`Updated: ${t}`)}const t=document.createElement("div");t.className="version-modal",t.innerHTML=`\n <div class="version-modal-content">\n <h3>Version Information</h3>\n <pre>${e.join("\n")}</pre>\n <button onclick="this.parentElement.parentElement.remove()">Close</button>\n </div>\n `,document.body.appendChild(t),setTimeout(()=>{t.remove()},1e4)}mount(e){const t="string"==typeof e?document.querySelector(e):e;this.element&&t&&this.element.parentNode!==t&&t.appendChild(this.element)}getElement(){return this.element}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.socketClient&&this.socketClient.socket&&(this.socketClient.socket.off("welcome"),this.socketClient.socket.off("status"),this.socketClient.socket.off("build_info")),this.element=null,this.socketClient=null}}class u{constructor(){this.eventViewer=null,this.moduleViewer=null,this.sessionManager=null,this.socketManager=null,this.agentInference=null,this.agentHierarchy=null,this.uiStateManager=null,this.eventProcessor=null,this.exportManager=null,this.workingDirectoryManager=null,this.fileToolTracker=null,this.buildTracker=null,this.init()}init(){console.log("Initializing refactored Claude MPM Dashboard...");try{this.initializeSocketManager(),this.initializeCoreComponents(),this.initializeBuildTracker(),this.initializeAgentInference(),this.initializeAgentHierarchy(),this.initializeUIStateManager(),this.initializeWorkingDirectoryManager(),this.initializeFileToolTracker(),this.initializeEventProcessor(),this.initializeExportManager(),this.setupModuleInteractions(),this.initializeFromURL(),console.log("Claude MPM Dashboard initialized successfully")}catch(e){throw console.error("Error during dashboard initialization:",e),e}}validateInitialization(){const e=[{name:"socketManager",component:this.socketManager},{name:"eventViewer",component:this.eventViewer},{name:"agentHierarchy",component:this.agentHierarchy}].filter(e=>!e.component);e.length>0?console.warn("Missing critical components:",e.map(e=>e.name)):console.log("All critical components initialized")}postInit(){try{this.agentHierarchy&&(window.dashboard.agentHierarchy=this.agentHierarchy,console.log("Agent hierarchy global reference set")),this.validateInitialization()}catch(e){console.error("Error in dashboard postInit:",e)}}initializeSocketManager(){this.socketManager=new e,this.socketManager.setupConnectionControls(),this.socketClient=this.socketManager.getSocketClient(),window.socketClient=this.socketClient}initializeCoreComponents(){this.eventViewer=new n("events-list",this.socketClient),this.moduleViewer=new s,this.sessionManager=new o(this.socketClient),window.eventViewer=this.eventViewer,window.moduleViewer=this.moduleViewer,window.sessionManager=this.sessionManager}initializeBuildTracker(){this.buildTracker=new h,this.buildTracker.setSocketClient(this.socketClient);const e=()=>{const t=document.querySelector(".header-title");t?(this.buildTracker.mount(t),console.log("BuildTracker mounted successfully")):(console.warn("Header-title element not found for build tracker, will retry"),setTimeout(e,100))};e(),window.buildTracker=this.buildTracker}initializeAgentInference(){this.agentInference=new a(this.eventViewer),this.agentInference.initialize()}initializeAgentHierarchy(){try{this.agentHierarchy=new c(this.agentInference,this.eventViewer),console.log("Agent hierarchy component created")}catch(e){console.error("Failed to initialize agent hierarchy:",e),this.agentHierarchy={render:()=>'<div class="error">Agent hierarchy unavailable</div>',expandAllNodes:()=>{},collapseAllNodes:()=>{},updateWithNewEvents:()=>{}}}}initializeUIStateManager(){this.uiStateManager=new t,this.setupTabFilters()}initializeWorkingDirectoryManager(){this.workingDirectoryManager=new l(this.socketManager)}initializeFileToolTracker(){this.fileToolTracker=new d(this.agentInference,this.workingDirectoryManager)}initializeEventProcessor(){this.eventProcessor=new i(this.eventViewer,this.agentInference)}initializeExportManager(){this.exportManager=new r(this.eventViewer)}setupModuleInteractions(){this.socketManager.onEventUpdate(e=>{this.fileToolTracker.updateFileOperations(e),this.fileToolTracker.updateToolCalls(e),this.agentInference.processAgentInference(),this.agentHierarchy.updateWithNewEvents(e),"events"===this.uiStateManager.getCurrentTab()&&this.exportManager.scrollListToBottom("events-list"),this.renderCurrentTab()}),this.socketManager.onConnectionStatusChange((e,t)=>{"connected"===t&&this.workingDirectoryManager.updateGitBranch(this.workingDirectoryManager.getCurrentWorkingDir())}),document.addEventListener("tabChanged",e=>{this.renderCurrentTab(),this.uiStateManager.updateTabNavigationItems()}),document.addEventListener("eventsClearing",()=>{this.fileToolTracker.clear(),this.agentInference.initialize()}),document.addEventListener("showCardDetails",e=>{this.showCardDetails(e.detail.tabName,e.detail.index)}),document.addEventListener("sessionFilterChanged",e=>{console.log("Session filter changed, re-rendering current tab:",this.uiStateManager.getCurrentTab()),this.renderCurrentTab()})}setupTabFilters(){const e=document.getElementById("agents-search-input"),t=document.getElementById("agents-type-filter");e&&e.addEventListener("input",()=>{"agents"===this.uiStateManager.getCurrentTab()&&this.renderCurrentTab()}),t&&t.addEventListener("change",()=>{"agents"===this.uiStateManager.getCurrentTab()&&this.renderCurrentTab()});const n=document.getElementById("tools-search-input"),i=document.getElementById("tools-type-filter");n&&n.addEventListener("input",()=>{"tools"===this.uiStateManager.getCurrentTab()&&this.renderCurrentTab()}),i&&i.addEventListener("change",()=>{"tools"===this.uiStateManager.getCurrentTab()&&this.renderCurrentTab()});const s=document.getElementById("files-search-input"),o=document.getElementById("files-type-filter");s&&s.addEventListener("input",()=>{"files"===this.uiStateManager.getCurrentTab()&&this.renderCurrentTab()}),o&&o.addEventListener("change",()=>{"files"===this.uiStateManager.getCurrentTab()&&this.renderCurrentTab()})}initializeFromURL(){const e=new URLSearchParams(window.location.search);this.socketManager.initializeFromURL(e)}renderCurrentTab(){const e=this.uiStateManager.getCurrentTab();switch(e){case"events":break;case"activity":if(window.ActivityTree&&"function"==typeof window.ActivityTree)window.activityTreeInstance||(console.log("Creating new ActivityTree instance..."),window.activityTreeInstance=new window.ActivityTree),window.activityTreeInstance&&(window.activityTreeInstance.initialized||(console.log("Initializing ActivityTree..."),window.activityTreeInstance.initialize()),"function"==typeof window.activityTreeInstance.renderWhenVisible&&(console.log("Dashboard triggering activity tree render..."),window.activityTreeInstance.renderWhenVisible()),"function"==typeof window.activityTreeInstance.forceShow&&(console.log("Dashboard forcing activity tree to show..."),window.activityTreeInstance.forceShow()));else if(window.activityTree&&"function"==typeof window.activityTree){const e=window.activityTree();e&&("function"==typeof e.renderWhenVisible&&(console.log("Dashboard triggering activity tree render (legacy)..."),e.renderWhenVisible()),"function"==typeof e.forceShow&&(console.log("Dashboard forcing activity tree to show (legacy)..."),e.forceShow()))}else console.warn("Activity tree component not available, retrying in 100ms..."),setTimeout(()=>{"activity"===this.currentTab&&this.renderCurrentTab()},100);break;case"agents":this.renderAgents();break;case"tools":this.renderTools();break;case"files":this.renderFiles()}this.uiStateManager.getSelectedCard().tab===e&&this.uiStateManager.updateCardSelectionUI(),this.uiStateManager.updateUnifiedSelectionUI()}renderAgents(){const e=document.getElementById("agents-list");if(!e)return;const t=document.getElementById("agents-search-input")?.value||"",n=document.getElementById("agents-type-filter")?.value||"",i=this.renderAgentsFlat(t,n);e.innerHTML=i,this.removeHierarchyControls();const s=this.agentInference.getUniqueAgentInstances();this.updateAgentsFilterDropdowns(s)}removeHierarchyControls(){const e=document.getElementById("hierarchy-controls");e&&e.remove()}renderAgentsFlat(e,t){const n=this.eventViewer.events;if(!n||0===n.length)return'<div class="no-events">No agent events found...</div>';this.agentInference.processAgentInference();const i=this.agentInference.getEventAgentMap(),s=[];if(n.forEach((n,o)=>{const a=i.get(o);if(a&&("subagent"===a.type||"main_agent"===a.type)){let i=!0;if(e){const t=e.toLowerCase();i=i&&(a.agentName.toLowerCase().includes(t)||n.tool_name&&n.tool_name.toLowerCase().includes(t)||n.data&&JSON.stringify(n.data).toLowerCase().includes(t))}t&&(i=i&&a.agentName.includes(t)),i&&s.push({event:n,inference:a,index:o,timestamp:new Date(n.timestamp)})}}),0===s.length)return'<div class="no-events">No agent events match the current filters...</div>';return`<div class="agent-events-flat">${s.map((e,t)=>{const{event:n,inference:i,index:s,timestamp:o}=e;let a="Activity",r="📋",l="";if("SubagentStart"===n.event_type)a="Started",r="🟢",l="Agent session began";else if("SubagentStop"===n.event_type)a="Stopped",r="🔴",l="Agent session ended";else if(n.tool_name&&(a=`Tool: ${n.tool_name}`,r=this.getToolIcon(n.tool_name),n.data&&n.data.tool_parameters)){const e=n.data.tool_parameters;e.file_path?l=e.file_path:e.command?l=e.command.substring(0,50)+(e.command.length>50?"...":""):e.pattern?l=`pattern="${e.pattern}"`:e.query&&(l=`query="${e.query}"`)}let d="completed";return"SubagentStart"===n.event_type?d="active":n.data&&n.data.error&&(d="error"),`\n <div class="agent-event-item" data-index="${t}" onclick="window.dashboard.showCardDetails('agents', ${s})">\n <div class="agent-event-header">\n <div class="agent-event-time">${this.formatTimestamp(o)}</div>\n <div class="agent-event-agent">\n ${this.getAgentIcon(i.agentName)} ${i.agentName}\n </div>\n <div class="agent-event-action">\n ${r} ${a}\n </div>\n <div class="agent-event-status status-${d}">\n ${this.getStatusIcon(d)}\n </div>\n </div>\n ${l?`<div class="agent-event-details">${this.escapeHtml(l)}</div>`:""}\n </div>\n `}).join("")}</div>`}getAgentIcon(e){return{PM:"🎯","Engineer Agent":"🔧","Research Agent":"🔍","QA Agent":"✅","Documentation Agent":"📝","Security Agent":"🔒","Ops Agent":"⚙️","Version Control Agent":"📦","Data Engineer Agent":"💾","Test Integration Agent":"🧪"}[e]||"🤖"}getToolIcon(e){return{Read:"📖",Write:"✏️",Edit:"📝",Bash:"💻",Grep:"🔍",Glob:"📂",LS:"📁",Task:"📋"}[e]||"🔧"}getStatusIcon(e){return{active:"🟢",completed:"✅",error:"❌",pending:"🟡"}[e]||"❓"}formatTimestamp(e){return e.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}escapeHtml(e){if(!e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML}renderTools(){const e=document.getElementById("tools-list");if(!e)return;const t=this.fileToolTracker.getToolCalls(),n=Array.from(t.entries()),i=this.eventProcessor.getUniqueToolInstances(n),s=this.eventProcessor.generateToolHTML(i);e.innerHTML=s,this.exportManager.scrollListToBottom("tools-list"),this.updateToolsFilterDropdowns(i)}renderFiles(){const e=document.getElementById("files-list");if(!e)return;const t=this.fileToolTracker.getFileOperations(),n=Array.from(t.entries()),i=this.eventProcessor.getUniqueFileInstances(n),s=this.eventProcessor.generateFileHTML(i);e.innerHTML=s,this.exportManager.scrollListToBottom("files-list"),this.updateFilesFilterDropdowns(n)}updateAgentsFilterDropdowns(e){const t=new Set;e.forEach(e=>{e.agentName&&"Unknown"!==e.agentName&&t.add(e.agentName)});const n=Array.from(t).filter(e=>e&&""!==e.trim());this.populateFilterDropdown("agents-type-filter",n,"All Agent Types"),n.length>0?console.log("Agent types found for filter:",n):console.log("No agent types found for filter. Instances:",e.length)}updateToolsFilterDropdowns(e){const t=[...new Set(e.map(([e,t])=>t.tool_name))].filter(e=>e);this.populateFilterDropdown("tools-type-filter",t,"All Tools")}updateFilesFilterDropdowns(e){const t=[...new Set(e.flatMap(([e,t])=>t.operations.map(e=>e.operation)))].filter(e=>e);this.populateFilterDropdown("files-type-filter",t,"All Operations")}populateFilterDropdown(e,t,n="All"){const i=document.getElementById(e);if(!i)return;const s=i.value,o=t.sort((e,t)=>e.localeCompare(t));i.innerHTML=`<option value="">${n}</option>`,o.forEach(e=>{const t=document.createElement("option");t.value=e,t.textContent=e,i.appendChild(t)}),s&&o.includes(s)&&(i.value=s)}showCardDetails(e,t){switch(e){case"events":this.eventViewer&&this.eventViewer.showEventDetails(t);break;case"agents":this.showAgentDetailsByIndex(t);break;case"tools":this.showToolDetailsByIndex(t);break;case"files":this.showFileDetailsByIndex(t)}}showAgentDetailsByIndex(e){const t=this.eventProcessor.getFilteredEventsForTab("agents");if(!t||!Array.isArray(t)||e<0||e>=t.length)return void console.warn("Dashboard: Invalid agent index or events array");const n=this.eventProcessor.applyAgentsFilters([t[e]]);if(n.length>0&&this.moduleViewer&&"function"==typeof this.moduleViewer.showAgentEvent){const t=n[0];this.moduleViewer.showAgentEvent(t,e)}}showAgentInstanceDetails(e){const t=this.agentInference.getPMDelegations().get(e);if(!t){const t=this.agentInference.getUniqueAgentInstances().find(t=>t.id===e);return t?void this.showImpliedAgentDetails(t):void console.error("Agent instance not found:",e)}this.moduleViewer&&"function"==typeof this.moduleViewer.showAgentInstance?this.moduleViewer.showAgentInstance(t):console.log("Agent Instance Details:",{id:e,agentName:t.agentName,type:"PM Delegation",eventCount:t.agentEvents.length,startTime:t.timestamp,pmCall:t.pmCall})}showImpliedAgentDetails(e){this.moduleViewer&&"function"==typeof this.moduleViewer.showImpliedAgent?this.moduleViewer.showImpliedAgent(e):console.log("Implied Agent Details:",{id:e.id,agentName:e.agentName,type:"Implied PM Delegation",eventCount:e.eventCount,startTime:e.timestamp,note:"No explicit PM call found - inferred from agent activity"})}showToolDetailsByIndex(e){const t=this.fileToolTracker.getToolCalls(),n=Array.from(t.entries()),i=this.eventProcessor.applyToolCallFilters(n);if(e>=0&&e<i.length){const[t]=i[e];this.showToolCallDetails(t)}}showFileDetailsByIndex(e){const t=this.fileToolTracker.getFileOperations();let n=Array.from(t.entries());if(n=this.eventProcessor.applyFilesFilters(n),e>=0&&e<n.length){const[t]=n[e];this.showFileDetails(t)}}showToolCallDetails(e){const t=this.fileToolTracker.getToolCall(e);t&&this.moduleViewer&&this.moduleViewer.showToolCall(t,e)}showFileDetails(e){const t=this.fileToolTracker.getFileOperationsForFile(e);t&&this.moduleViewer&&this.moduleViewer.showFileOperations(t,e)}switchTab(e){this.uiStateManager.switchTab(e)}selectCard(e,t,n,i){this.uiStateManager.selectCard(e,t,n,i)}clearEvents(){this.exportManager.clearEvents()}exportEvents(){this.exportManager.exportEvents()}clearSelection(){this.uiStateManager.clearSelection(),this.eventViewer&&this.eventViewer.clearSelection(),this.moduleViewer&&this.moduleViewer.clear()}get currentWorkingDir(){return this.workingDirectoryManager.getCurrentWorkingDir()}set currentWorkingDir(e){this.workingDirectoryManager.setWorkingDirectory(e)}get currentTab(){return this.uiStateManager.getCurrentTab()}get selectedCard(){return this.uiStateManager.getSelectedCard()}get fileOperations(){return this.fileToolTracker.getFileOperations()}get toolCalls(){return this.fileToolTracker.getToolCalls()}get tabNavigation(){return this.uiStateManager?this.uiStateManager.tabNavigation:null}}function p(){const e=document.createElement("div");return e.id="file-viewer-modal",e.className="modal file-viewer-modal",e.innerHTML='\n <div class="modal-content file-viewer-content">\n <div class="file-viewer-header">\n <h2 class="file-viewer-title">\n <span class="file-viewer-icon">📄</span>\n <span class="file-viewer-title-text">File Viewer</span>\n </h2>\n <div class="file-viewer-meta">\n <span class="file-viewer-file-path"></span>\n <span class="file-viewer-file-size"></span>\n </div>\n <button class="file-viewer-close" onclick="hideFileViewerModal()">\n <span>×</span>\n </button>\n </div>\n <div class="file-viewer-body">\n <div class="file-viewer-loading">\n <div class="loading-spinner"></div>\n <span>Loading file content...</span>\n </div>\n <div class="file-viewer-error" style="display: none;">\n <div class="error-icon">⚠️</div>\n <div class="error-message"></div>\n <div class="error-suggestions"></div>\n </div>\n <div class="file-viewer-content-area" style="display: none;">\n <div class="file-viewer-toolbar">\n <div class="file-viewer-info">\n <span class="file-extension"></span>\n <span class="file-encoding"></span>\n </div>\n <div class="file-viewer-actions">\n <button class="file-content-copy" onclick="copyFileContent()">\n 📋 Copy\n </button>\n </div>\n </div>\n <div class="file-viewer-scroll-wrapper">\n <pre class="file-content-display"><code class="file-content-code"></code></pre>\n </div>\n </div>\n </div>\n </div>\n ',e.addEventListener("click",t=>{t.target===e&&hideFileViewerModal()}),document.addEventListener("keydown",t=>{"Escape"===t.key&&"flex"===e.style.display&&hideFileViewerModal()}),e}async function g(e,t,n){const i=e.querySelector(".file-viewer-file-path"),s=e.querySelector(".file-viewer-file-size");i.textContent=t,s.textContent="",e.querySelector(".file-viewer-loading").style.display="flex",e.querySelector(".file-viewer-error").style.display="none",e.querySelector(".file-viewer-content-area").style.display="none";try{const i=window.socket||window.dashboard?.socketClient?.socket;if(!i)throw new Error("No socket connection available");const s=new Promise((e,n)=>{const s=o=>{o.file_path===t&&(i.off("file_content_response",s),o.success?e(o):n(new Error(o.error||"Failed to read file")))};i.on("file_content_response",s),setTimeout(()=>{i.off("file_content_response",s),n(new Error("Request timeout"))},1e4)});i.emit("read_file",{file_path:t,working_dir:n});const o=await s;e.querySelector(".file-viewer-loading").style.display="none",function(e,t){const n=e.querySelector(".file-viewer-content-area"),i=e.querySelector(".file-extension"),s=e.querySelector(".file-encoding"),o=e.querySelector(".file-viewer-file-size"),a=e.querySelector(".file-content-code");i&&(i.textContent=`Type: ${t.extension||"unknown"}`);s&&(s.textContent=`Encoding: ${t.encoding||"unknown"}`);o&&(o.textContent=`Size: ${function(e){if(!e)return"0 B";const t=1024,n=["B","KB","MB","GB"],i=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,i)).toFixed(2))+" "+n[i]}(t.file_size)}`);if(a&&t.content){a.innerHTML=function(e,t){const n=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");switch(t){case".js":case".jsx":case".ts":case".tsx":return function(e){return m(e.replace(/\b(function|const|let|var|if|else|for|while|return|import|export|class|extends)\b/g,'<span class="keyword">$1</span>').replace(/(\/\*[\s\S]*?\*\/|\/\/.*)/g,'<span class="comment">$1</span>').replace(/('[^']*'|"[^"]*"|`[^`]*`)/g,'<span class="string">$1</span>').replace(/\b(\d+)\b/g,'<span class="number">$1</span>'))}(n);case".py":return function(e){return m(e.replace(/\b(def|class|if|elif|else|for|while|return|import|from|as|try|except|finally|with)\b/g,'<span class="keyword">$1</span>').replace(/(#.*)/g,'<span class="comment">$1</span>').replace(/('[^']*'|"[^"]*"|"""[\s\S]*?""")/g,'<span class="string">$1</span>').replace(/\b(\d+)\b/g,'<span class="number">$1</span>'))}(n);case".json":return function(e){return m(e.replace(/("[\w\s]*")\s*:/g,'<span class="property">$1</span>:').replace(/:\s*(".*?")/g,': <span class="string">$1</span>').replace(/:\s*(\d+)/g,': <span class="number">$1</span>').replace(/:\s*(true|false|null)/g,': <span class="keyword">$1</span>'))}(n);case".css":return function(e){return m(e.replace(/([.#]?[\w-]+)\s*\{/g,'<span class="selector">$1</span> {').replace(/([\w-]+)\s*:/g,'<span class="property">$1</span>:').replace(/:\s*([^;]+);/g,': <span class="value">$1</span>;').replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="comment">$1</span>'))}(n);case".html":case".htm":return function(e){return m(e.replace(/(<\/?[\w-]+)/g,'<span class="tag">$1</span>').replace(/([\w-]+)=(['"][^'"]*['"])/g,'<span class="attribute">$1</span>=<span class="string">$2</span>').replace(/(<!--[\s\S]*?-->)/g,'<span class="comment">$1</span>'))}(n);case".md":case".markdown":return function(e){return m(e.replace(/^(#{1,6})\s+(.*)$/gm,'<span class="header">$1</span> <span class="header-text">$2</span>').replace(/\*\*(.*?)\*\*/g,'<span class="bold">**$1**</span>').replace(/\*(.*?)\*/g,'<span class="italic">*$1*</span>').replace(/`([^`]+)`/g,'<span class="code">`$1`</span>').replace(/^\s*[-*+]\s+(.*)$/gm,'<span class="list-marker">•</span> $1'))}(n);default:return m(n)}}(t.content,t.extension);const n=e.querySelector(".file-viewer-scroll-wrapper");n&&setTimeout(()=>{const t=e.querySelector(".modal-content"),i=e.querySelector(".file-viewer-header"),s=e.querySelector(".file-viewer-toolbar"),o=(t?.offsetHeight||0)-(i?.offsetHeight||0)-(s?.offsetHeight||0)-40;n.style.maxHeight=`${o}px`,n.style.overflowY="auto"},50)}else console.warn("⚠️ Missing codeElement or file content");n&&(n.style.display="block")}(e,o)}catch(o){console.error("❌ Failed to fetch file content:",o),e.querySelector(".file-viewer-loading").style.display="none";let i=o.message||"Unknown error occurred",s=[];o.message.includes("No socket connection")?(i="Failed to connect to the monitoring server",s=["Check if the monitoring server is running","Verify the socket connection in the dashboard","Try refreshing the page and reconnecting"]):o.message.includes("timeout")?(i="Request timed out",s=["The file may be too large to load quickly","Check your network connection","Try again in a few moments"]):o.message.includes("File does not exist")?(i="File not found",s=["The file may have been moved or deleted","Check the file path spelling","Refresh the file list to see current files"]):o.message.includes("Access denied")&&(i="Access denied",s=["The file is outside the allowed directories","File access is restricted for security reasons"]),function(e,t){const n=e.querySelector(".file-viewer-error"),i=e.querySelector(".error-message"),s=e.querySelector(".error-suggestions");let o=t.error||"Unknown error occurred";i.innerHTML=`\n <div class="error-main">${o}</div>\n ${t.file_path?`<div class="error-file">File: ${t.file_path}</div>`:""}\n ${t.working_dir?`<div class="error-dir">Working directory: ${t.working_dir}</div>`:""}\n `,t.suggestions&&t.suggestions.length>0?s.innerHTML=`\n <h4>Suggestions:</h4>\n <ul>\n ${t.suggestions.map(e=>`<li>${e}</li>`).join("")}\n </ul>\n `:s.innerHTML="";console.log("📋 Displaying file viewer error:",{originalError:t.error,processedMessage:o,suggestions:t.suggestions}),n.style.display="block"}(e,{error:i,file_path:t,working_dir:n,suggestions:s})}}function m(e){return e.split("\n").map((e,t)=>`<span class="line-number">${String(t+1).padStart(3," ")}</span> ${e||" "}`).join("\n")}function f(e,t){const n=e.querySelector(".git-diff-error"),i=e.querySelector(".error-message"),s=e.querySelector(".error-suggestions");let o=t.error||"Unknown error occurred",a=!1;if(o.includes("not tracked by git")?(o="📝 This file is not tracked by git yet",a=!0):o.includes("No git history found")&&(o="📋 No git history available for this file"),i.innerHTML=`\n <div class="error-main">${o}</div>\n ${t.file_path?`<div class="error-file">File: ${t.file_path}</div>`:""}\n ${t.working_dir?`<div class="error-dir">Working directory: ${t.working_dir}</div>`:""}\n `,t.suggestions&&t.suggestions.length>0){const e=a?"How to track this file:":"Suggestions:";s.innerHTML=`\n <h4>${e}</h4>\n <ul>\n ${t.suggestions.map(e=>`<li>${e}</li>`).join("")}\n </ul>\n `}else s.innerHTML="";console.log("📋 Displaying git diff error:",{originalError:t.error,processedMessage:o,isUntracked:a,suggestions:t.suggestions}),n.style.display="block"}function v(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}window.clearEvents=function(){window.dashboard&&window.dashboard.clearEvents()},window.exportEvents=function(){window.dashboard&&window.dashboard.exportEvents()},window.clearSelection=function(){window.dashboard&&window.dashboard.clearSelection()},window.switchTab=function(e){window.dashboard&&window.dashboard.switchTab(e)},window.showFileViewerModal=function(e,t){!t&&window.dashboard&&window.dashboard.currentWorkingDir&&(t=window.dashboard.currentWorkingDir);let n=document.getElementById("file-viewer-modal");n||(n=p(),document.body.appendChild(n)),g(n,e,t),n.style.display="flex",document.body.style.overflow="hidden"},window.hideFileViewerModal=function(){const e=document.getElementById("file-viewer-modal");e&&(e.style.display="none",document.body.style.overflow="")},window.copyFileContent=function(){const e=document.getElementById("file-viewer-modal");if(!e)return;const t=e.querySelector(".file-content-code");if(!t)return;const n=t.textContent;if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(n).then(()=>{const t=e.querySelector(".file-content-copy"),n=t.textContent;t.textContent="✅ Copied!",setTimeout(()=>{t.textContent=n},2e3)}).catch(e=>{console.error("Failed to copy text:",e)});else{const t=document.createElement("textarea");t.value=n,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t);const i=e.querySelector(".file-content-copy"),s=i.textContent;i.textContent="✅ Copied!",setTimeout(()=>{i.textContent=s},2e3)}},window.showGitDiffModal=function(e,t,n){!n&&window.dashboard&&window.dashboard.currentWorkingDir&&(n=window.dashboard.currentWorkingDir);let i=document.getElementById("git-diff-modal");i||(i=function(){const e=document.createElement("div");return e.id="git-diff-modal",e.className="modal git-diff-modal",e.innerHTML='\n <div class="modal-content git-diff-content">\n <div class="git-diff-header">\n <h2 class="git-diff-title">\n <span class="git-diff-icon">📋</span>\n <span class="git-diff-title-text">Git Diff</span>\n </h2>\n <div class="git-diff-meta">\n <span class="git-diff-file-path"></span>\n <span class="git-diff-timestamp"></span>\n </div>\n <button class="git-diff-close" onclick="hideGitDiffModal()">\n <span>×</span>\n </button>\n </div>\n <div class="git-diff-body">\n <div class="git-diff-loading">\n <div class="loading-spinner"></div>\n <span>Loading git diff...</span>\n </div>\n <div class="git-diff-error" style="display: none;">\n <div class="error-icon">⚠️</div>\n <div class="error-message"></div>\n <div class="error-suggestions"></div>\n </div>\n <div class="git-diff-content-area" style="display: none;">\n <div class="git-diff-toolbar">\n <div class="git-diff-info">\n <span class="commit-hash"></span>\n <span class="diff-method"></span>\n </div>\n <div class="git-diff-actions">\n <button class="git-diff-copy" onclick="copyGitDiff()">\n 📋 Copy\n </button>\n </div>\n </div>\n <div class="git-diff-scroll-wrapper">\n <pre class="git-diff-display"><code class="git-diff-code"></code></pre>\n </div>\n </div>\n </div>\n </div>\n ',e.addEventListener("click",t=>{t.target===e&&hideGitDiffModal()}),document.addEventListener("keydown",t=>{"Escape"===t.key&&"flex"===e.style.display&&hideGitDiffModal()}),e}(),document.body.appendChild(i)),async function(e,t,n,i){const s=e.querySelector(".git-diff-file-path"),o=e.querySelector(".git-diff-timestamp");s.textContent=t,o.textContent=n?new Date(n).toLocaleString():"Latest",e.querySelector(".git-diff-loading").style.display="flex",e.querySelector(".git-diff-error").style.display="none",e.querySelector(".git-diff-content-area").style.display="none";try{let s=8765;if(window.dashboard&&window.dashboard.socketClient&&window.dashboard.socketClient.port)s=window.dashboard.socketClient.port;else{const e=document.getElementById("port-input");e&&e.value&&(s=e.value)}const o=new URLSearchParams({file:t});n&&o.append("timestamp",n),i&&o.append("working_dir",i);const r=`http://localhost:${s}/api/git-diff?${o}`;console.log("🌐 Making git diff request to:",r),console.log("📋 Git diff request parameters:",{filePath:t,timestamp:n,workingDir:i,urlParams:o.toString()});try{const e=await fetch(`http://localhost:${s}/health`,{method:"GET",headers:{Accept:"application/json","Content-Type":"application/json"},mode:"cors"});if(!e.ok)throw new Error(`Server health check failed: ${e.status} ${e.statusText}`)}catch(a){throw new Error(`Cannot reach server at localhost:${s}. Health check failed: ${a.message}`)}const l=await fetch(r,{method:"GET",headers:{Accept:"application/json","Content-Type":"application/json"},mode:"cors"});if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);const d=await l.json();e.querySelector(".git-diff-loading").style.display="none",d.success?function(e,t){const n=e.querySelector(".git-diff-content-area"),i=e.querySelector(".commit-hash"),s=e.querySelector(".diff-method"),o=e.querySelector(".git-diff-code");i&&(i.textContent=`Commit: ${t.commit_hash}`);s&&(s.textContent=`Method: ${t.method}`);if(o&&t.diff){o.innerHTML=t.diff.split("\n").map(e=>{const t=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");return e.startsWith("+++")||e.startsWith("---")?`<span class="diff-header">${t}</span>`:e.startsWith("@@")?`<span class="diff-meta">${t}</span>`:e.startsWith("+")?`<span class="diff-addition">${t}</span>`:e.startsWith("-")?`<span class="diff-deletion">${t}</span>`:e.startsWith("commit ")||e.startsWith("Author:")||e.startsWith("Date:")?`<span class="diff-header">${t}</span>`:`<span class="diff-context">${t}</span>`}).join("\n");const n=e.querySelector(".git-diff-scroll-wrapper");n&&setTimeout(()=>{const t=e.querySelector(".modal-content"),i=e.querySelector(".git-diff-header"),s=e.querySelector(".git-diff-toolbar"),o=(t?.offsetHeight||0)-(i?.offsetHeight||0)-(s?.offsetHeight||0)-40;n.style.maxHeight=`${o}px`,n.style.overflowY="auto"},50)}else console.warn("⚠️ Missing codeElement or diff data");n&&(n.style.display="block")}(e,d):f(e,d)}catch(r){console.error("❌ Failed to fetch git diff:",r),console.error("Error details:",{name:r.name,message:r.message,stack:r.stack,filePath:t,timestamp:n,workingDir:i}),e.querySelector(".git-diff-loading").style.display="none";let s=`Network error: ${r.message}`,o=[];r.message.includes("Failed to fetch")?(s="Failed to connect to the monitoring server",o=["Check if the monitoring server is running on port 8765","Verify the port configuration in the dashboard","Check browser console for CORS or network errors","Try refreshing the page and reconnecting"]):r.message.includes("health check failed")?(s=r.message,o=["The server may be starting up - try again in a few seconds","Check if another process is using port 8765","Restart the claude-mpm monitoring server"]):r.message.includes("HTTP")&&(s=`Server error: ${r.message}`,o=["The server encountered an internal error","Check the server logs for more details","Try with a different file or working directory"]),f(e,{error:s,file_path:t,working_dir:i,suggestions:o,debug_info:{error_type:r.name,original_message:r.message,port:window.dashboard?.socketClient?.port||document.getElementById("port-input")?.value||"8765",timestamp:(new Date).toISOString()}})}}(i,e,t,n),i.style.display="flex",document.body.style.overflow="hidden"},window.hideGitDiffModal=function(){const e=document.getElementById("git-diff-modal");e&&(e.style.display="none",document.body.style.overflow="")},window.copyGitDiff=function(){const e=document.getElementById("git-diff-modal");if(!e)return;const t=e.querySelector(".git-diff-code");if(!t)return;const n=t.textContent;if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(n).then(()=>{const t=e.querySelector(".git-diff-copy"),n=t.textContent;t.textContent="✅ Copied!",setTimeout(()=>{t.textContent=n},2e3)}).catch(e=>{console.error("Failed to copy text:",e)});else{const t=document.createElement("textarea");t.value=n,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t);const i=e.querySelector(".git-diff-copy"),s=i.textContent;i.textContent="✅ Copied!",setTimeout(()=>{i.textContent=s},2e3)}},window.showFileViewerModal=function(e){let t="";window.dashboard&&window.dashboard.currentWorkingDir&&(t=window.dashboard.currentWorkingDir);let n=document.getElementById("file-viewer-modal");n||(n=p(),document.body.appendChild(n)),g(n,e,t),n.style.display="flex",document.body.style.overflow="hidden"},window.hideFileViewerModal=function(){const e=document.getElementById("file-viewer-modal");e&&(e.style.display="none",document.body.style.overflow="")},window.copyFileContent=function(){const e=document.getElementById("file-viewer-modal");if(!e)return;const t=e.querySelector(".file-content-code");if(!t)return;const n=t.textContent;if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(n).then(()=>{const t=e.querySelector(".file-content-copy"),n=t.textContent;t.textContent="✅ Copied!",setTimeout(()=>{t.textContent=n},2e3)}).catch(e=>{console.error("Failed to copy text:",e)});else{const t=document.createElement("textarea");t.value=n,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t);const i=e.querySelector(".file-content-copy"),s=i.textContent;i.textContent="✅ Copied!",setTimeout(()=>{i.textContent=s},2e3)}},window.showSearchViewerModal=function(e,t){let n=document.getElementById("search-viewer-modal");n||(n=function(){const e=document.createElement("div");return e.id="search-viewer-modal",e.className="modal search-viewer-modal",e.innerHTML='\n <div class="modal-content search-viewer-content">\n <div class="search-viewer-header">\n <h2 class="search-viewer-title">\n <span class="search-viewer-icon">🔍</span>\n <span class="search-viewer-title-text">Search Results</span>\n </h2>\n <button class="search-viewer-close" onclick="hideSearchViewerModal()">\n <span>×</span>\n </button>\n </div>\n <div class="search-viewer-body">\n <div class="search-params-section">\n <h3>Search Parameters</h3>\n <pre class="search-params-display"></pre>\n </div>\n <div class="search-results-section">\n <h3>Search Results</h3>\n <div class="search-results-display"></div>\n </div>\n </div>\n </div>\n ',e.addEventListener("click",t=>{t.target===e&&hideSearchViewerModal()}),document.addEventListener("keydown",t=>{"Escape"===t.key&&"flex"===e.style.display&&hideSearchViewerModal()}),e}(),document.body.appendChild(n)),function(e,t,n){const i=e.querySelector(".search-params-display"),s=e.querySelector(".search-results-display");i&&t&&(i.textContent=JSON.stringify(t,null,2));if(s&&n){let e="";"string"==typeof n?e=`<pre class="search-results-text">${v(n)}</pre>`:Array.isArray(n)?(e='<ul class="search-results-list">',n.forEach(t=>{e+="object"==typeof t?`<li><pre>${JSON.stringify(t,null,2)}</pre></li>`:`<li>${v(String(t))}</li>`}),e+="</ul>"):e="object"==typeof n?`<pre class="search-results-json">${JSON.stringify(n,null,2)}</pre>`:`<div class="search-results-text">${v(String(n))}</div>`,s.innerHTML=e}}(n,e,t),n.style.display="flex",document.body.style.overflow="hidden"},window.hideSearchViewerModal=function(){const e=document.getElementById("search-viewer-modal");e&&(e.style.display="none",document.body.style.overflow="")},window.showAgentInstanceDetails=function(e){window.dashboard&&"function"==typeof window.dashboard.showAgentInstanceDetails?window.dashboard.showAgentInstanceDetails(e):console.error("Dashboard not available or method not found")},document.addEventListener("DOMContentLoaded",function(){try{window.dashboard=new u,window.dashboard&&"function"==typeof window.dashboard.postInit&&window.dashboard.postInit(),console.log("Dashboard loaded and initialized successfully"),document.dispatchEvent(new CustomEvent("dashboardReady",{detail:{dashboard:window.dashboard}}))}catch(e){console.error("Failed to initialize dashboard:",e),document.body.innerHTML=`\n <div style="padding: 20px; font-family: sans-serif;">\n <h1>Dashboard Initialization Error</h1>\n <p>The dashboard failed to load properly. Please refresh the page or check the console for details.</p>\n <pre style="background: #f5f5f5; padding: 10px; border-radius: 4px;">${e.message}</pre>\n </div>\n `}});
|
|
2
|
+
//# sourceMappingURL=dashboard.js.map
|