claude-mpm 4.1.21__tar.gz → 4.1.23__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.
Files changed (622) hide show
  1. claude_mpm-4.1.23/BUILD_NUMBER +1 -0
  2. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/PKG-INFO +1 -1
  3. claude_mpm-4.1.23/VERSION +1 -0
  4. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/pyproject.toml +2 -2
  5. claude_mpm-4.1.23/src/claude_mpm/VERSION +1 -0
  6. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/css/activity.css +252 -0
  7. claude_mpm-4.1.23/src/claude_mpm/dashboard/static/dist/chunks/unified-data-viewer.CvAmgM3l.js +2 -0
  8. claude_mpm-4.1.23/src/claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  9. claude_mpm-4.1.23/src/claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  10. claude_mpm-4.1.23/src/claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  11. claude_mpm-4.1.23/src/claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  12. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/activity-tree.js +140 -51
  13. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/unified-data-viewer.js +377 -132
  14. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_version_manager.py +6 -1
  15. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm.egg-info/PKG-INFO +1 -1
  16. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm.egg-info/SOURCES.txt +1 -0
  17. claude_mpm-4.1.21/BUILD_NUMBER +0 -1
  18. claude_mpm-4.1.21/VERSION +0 -1
  19. claude_mpm-4.1.21/src/claude_mpm/VERSION +0 -1
  20. claude_mpm-4.1.21/src/claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  21. claude_mpm-4.1.21/src/claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  22. claude_mpm-4.1.21/src/claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  23. claude_mpm-4.1.21/src/claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  24. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/CLAUDE.md +0 -0
  25. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/LICENSE +0 -0
  26. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/MANIFEST.in +0 -0
  27. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/README.md +0 -0
  28. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/scripts/ticket +0 -0
  29. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/setup.cfg +0 -0
  30. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/BUILD_NUMBER +0 -0
  31. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/__init__.py +0 -0
  32. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/__main__.py +0 -0
  33. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -0
  34. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/BASE_PM.md +0 -0
  35. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/INSTRUCTIONS.md +0 -0
  36. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/MEMORY.md +0 -0
  37. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/OUTPUT_STYLE.md +0 -0
  38. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/WORKFLOW.md +0 -0
  39. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/__init__.py +0 -0
  40. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/agent-template.yaml +0 -0
  41. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/agent_loader.py +0 -0
  42. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/agent_loader_integration.py +0 -0
  43. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/agents_metadata.py +0 -0
  44. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/async_agent_loader.py +0 -0
  45. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/base_agent.json +0 -0
  46. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/base_agent_loader.py +0 -0
  47. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/frontmatter_validator.py +0 -0
  48. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/system_agent_config.py +0 -0
  49. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -0
  50. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -0
  51. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/__init__.py +0 -0
  52. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/agent-manager.json +0 -0
  53. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/agent-manager.md +0 -0
  54. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -0
  55. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/api_qa.json +0 -0
  56. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/code_analyzer.json +0 -0
  57. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/data_engineer.json +0 -0
  58. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/documentation.json +0 -0
  59. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/engineer.json +0 -0
  60. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/imagemagick.json +0 -0
  61. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -0
  62. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/memory_manager.json +0 -0
  63. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/ops.json +0 -0
  64. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/project_organizer.json +0 -0
  65. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/qa.json +0 -0
  66. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/refactoring_engineer.json +0 -0
  67. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/research.json +0 -0
  68. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/security.json +0 -0
  69. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/ticketing.json +0 -0
  70. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/vercel_ops_agent.json +0 -0
  71. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/version_control.json +0 -0
  72. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/web_qa.json +0 -0
  73. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/agents/templates/web_ui.json +0 -0
  74. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/__init__.py +0 -0
  75. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/__main__.py +0 -0
  76. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/__init__.py +0 -0
  77. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/agent_manager.py +0 -0
  78. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/agents.py +0 -0
  79. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/aggregate.py +0 -0
  80. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/analyze.py +0 -0
  81. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/analyze_code.py +0 -0
  82. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/cleanup.py +0 -0
  83. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/cleanup_orphaned_agents.py +0 -0
  84. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/config.py +0 -0
  85. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/configure.py +0 -0
  86. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/configure_tui.py +0 -0
  87. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/dashboard.py +0 -0
  88. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/debug.py +0 -0
  89. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/doctor.py +0 -0
  90. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/info.py +0 -0
  91. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp.py +0 -0
  92. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp_command_router.py +0 -0
  93. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp_config_commands.py +0 -0
  94. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp_install_commands.py +0 -0
  95. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp_pipx_config.py +0 -0
  96. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp_server_commands.py +0 -0
  97. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mcp_tool_commands.py +0 -0
  98. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/memory.py +0 -0
  99. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/monitor.py +0 -0
  100. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mpm_init.py +0 -0
  101. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/mpm_init_handler.py +0 -0
  102. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/run.py +0 -0
  103. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/socketio_monitor.py +0 -0
  104. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/commands/tickets.py +0 -0
  105. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parser.py +0 -0
  106. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/__init__.py +0 -0
  107. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/agent_manager_parser.py +0 -0
  108. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/agents_parser.py +0 -0
  109. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/analyze_code_parser.py +0 -0
  110. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/analyze_parser.py +0 -0
  111. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/base_parser.py +0 -0
  112. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/config_parser.py +0 -0
  113. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/configure_parser.py +0 -0
  114. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/dashboard_parser.py +0 -0
  115. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/debug_parser.py +0 -0
  116. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/mcp_parser.py +0 -0
  117. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/memory_parser.py +0 -0
  118. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/monitor_parser.py +0 -0
  119. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/mpm_init_parser.py +0 -0
  120. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/run_parser.py +0 -0
  121. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/parsers/tickets_parser.py +0 -0
  122. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/shared/__init__.py +0 -0
  123. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/shared/argument_patterns.py +0 -0
  124. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/shared/base_command.py +0 -0
  125. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/shared/error_handling.py +0 -0
  126. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/shared/output_formatters.py +0 -0
  127. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/startup_logging.py +0 -0
  128. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/ticket_cli.py +0 -0
  129. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli/utils.py +0 -0
  130. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli_module/__init__.py +0 -0
  131. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli_module/args.py +0 -0
  132. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli_module/commands.py +0 -0
  133. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/cli_module/migration_example.py +0 -0
  134. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/__init__.py +0 -0
  135. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-agents.md +0 -0
  136. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-config.md +0 -0
  137. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-doctor.md +0 -0
  138. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-help.md +0 -0
  139. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-init.md +0 -0
  140. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-status.md +0 -0
  141. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm-tickets.md +0 -0
  142. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/commands/mpm.md +0 -0
  143. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/config/__init__.py +0 -0
  144. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/config/agent_config.py +0 -0
  145. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/config/experimental_features.py +0 -0
  146. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/config/paths.py +0 -0
  147. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/config/socketio_config.py +0 -0
  148. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/constants.py +0 -0
  149. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/__init__.py +0 -0
  150. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/agent_name_normalizer.py +0 -0
  151. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/agent_registry.py +0 -0
  152. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/agent_session_manager.py +0 -0
  153. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/base_service.py +0 -0
  154. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/cache.py +0 -0
  155. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/claude_runner.py +0 -0
  156. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/config.py +0 -0
  157. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/config_aliases.py +0 -0
  158. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/config_constants.py +0 -0
  159. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/constants.py +0 -0
  160. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/container.py +0 -0
  161. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/exceptions.py +0 -0
  162. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/factories.py +0 -0
  163. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/framework_loader.py +0 -0
  164. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/hook_manager.py +0 -0
  165. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/hook_performance_config.py +0 -0
  166. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/injectable_service.py +0 -0
  167. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/instruction_reinforcement_hook.py +0 -0
  168. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/interactive_session.py +0 -0
  169. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/interfaces.py +0 -0
  170. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/lazy.py +0 -0
  171. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/log_manager.py +0 -0
  172. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/logger.py +0 -0
  173. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/logging_config.py +0 -0
  174. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/minimal_framework_loader.py +0 -0
  175. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/mixins.py +0 -0
  176. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/oneshot_session.py +0 -0
  177. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/optimized_agent_loader.py +0 -0
  178. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/optimized_startup.py +0 -0
  179. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/output_style_manager.py +0 -0
  180. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/pm_hook_interceptor.py +0 -0
  181. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/service_registry.py +0 -0
  182. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/session_manager.py +0 -0
  183. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/shared/__init__.py +0 -0
  184. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/shared/config_loader.py +0 -0
  185. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/shared/path_resolver.py +0 -0
  186. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/shared/singleton_manager.py +0 -0
  187. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/socketio_pool.py +0 -0
  188. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/tool_access_control.py +0 -0
  189. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/types.py +0 -0
  190. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/typing_utils.py +0 -0
  191. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/unified_agent_registry.py +0 -0
  192. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/unified_config.py +0 -0
  193. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/core/unified_paths.py +0 -0
  194. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -0
  195. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/__init__.py +0 -0
  196. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/analysis_runner.py +0 -0
  197. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/index.html +0 -0
  198. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/open_dashboard.py +0 -0
  199. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/activity-tree.js +0 -0
  200. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/agent-inference.js +0 -0
  201. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/code-tree.js +0 -0
  202. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/code-viewer.js +0 -0
  203. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/event-processor.js +0 -0
  204. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/event-viewer.js +0 -0
  205. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/export-manager.js +0 -0
  206. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -0
  207. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -0
  208. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/hud-manager.js +0 -0
  209. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -0
  210. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/module-viewer.js +0 -0
  211. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/session-manager.js +0 -0
  212. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/socket-manager.js +0 -0
  213. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -0
  214. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/components/working-directory.js +0 -0
  215. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/dashboard.js +0 -0
  216. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/built/socket-client.js +0 -0
  217. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/css/code-tree.css +0 -0
  218. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/css/connection-status.css +0 -0
  219. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/css/dashboard.css +0 -0
  220. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -0
  221. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -0
  222. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/event-processor.js +0 -0
  223. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -0
  224. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/export-manager.js +0 -0
  225. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -0
  226. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -0
  227. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -0
  228. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -0
  229. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/session-manager.js +0 -0
  230. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -0
  231. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -0
  232. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/components/working-directory.js +0 -0
  233. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/dist/socket-client.js +0 -0
  234. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -0
  235. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/agent-inference.js +0 -0
  236. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/build-tracker.js +0 -0
  237. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/code-tree.js +0 -0
  238. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/code-viewer.js +0 -0
  239. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/connection-debug.js +0 -0
  240. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/event-processor.js +0 -0
  241. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/event-viewer.js +0 -0
  242. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/export-manager.js +0 -0
  243. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -0
  244. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -0
  245. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/hud-manager.js +0 -0
  246. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -0
  247. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/module-viewer.js +0 -0
  248. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/session-manager.js +0 -0
  249. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/socket-manager.js +0 -0
  250. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -0
  251. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/components/working-directory.js +0 -0
  252. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/connection-manager.js +0 -0
  253. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/dashboard.js +0 -0
  254. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/extension-error-handler.js +0 -0
  255. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/static/js/socket-client.js +0 -0
  256. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/templates/index.html +0 -0
  257. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/dashboard/test_dashboard.html +0 -0
  258. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/experimental/__init__.py +0 -0
  259. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/experimental/cli_enhancements.py +0 -0
  260. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/generators/__init__.py +0 -0
  261. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/generators/agent_profile_generator.py +0 -0
  262. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/__init__.py +0 -0
  263. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/base_hook.py +0 -0
  264. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/__init__.py +0 -0
  265. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/connection_pool.py +0 -0
  266. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/event_handlers.py +0 -0
  267. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/hook_handler.py +0 -0
  268. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -0
  269. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -0
  270. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -0
  271. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/hook_wrapper.sh +0 -0
  272. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/installer.py +0 -0
  273. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/memory_integration.py +0 -0
  274. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/response_tracking.py +0 -0
  275. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/services/__init__.py +0 -0
  276. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/services/connection_manager.py +0 -0
  277. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +0 -0
  278. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +0 -0
  279. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/services/state_manager.py +0 -0
  280. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/services/subagent_processor.py +0 -0
  281. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/claude_hooks/tool_analysis.py +0 -0
  282. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/memory_integration_hook.py +0 -0
  283. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/tool_call_interceptor.py +0 -0
  284. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/hooks/validation_hooks.py +0 -0
  285. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/init.py +0 -0
  286. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/models/__init__.py +0 -0
  287. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/models/agent_definition.py +0 -0
  288. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/models/agent_session.py +0 -0
  289. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/schemas/__init__.py +0 -0
  290. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/__init__.py +0 -0
  291. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/claude-hook-handler.sh +0 -0
  292. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/mcp_server.py +0 -0
  293. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/mcp_wrapper.py +0 -0
  294. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/mpm_doctor.py +0 -0
  295. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/socketio_daemon.py +0 -0
  296. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/socketio_daemon_hardened.py +0 -0
  297. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/socketio_daemon_wrapper.py +0 -0
  298. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/socketio_server_manager.py +0 -0
  299. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/scripts/start_activity_logging.py +0 -0
  300. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/__init__.py +0 -0
  301. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agent_capabilities_service.py +0 -0
  302. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/__init__.py +0 -0
  303. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/agent_builder.py +0 -0
  304. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/__init__.py +0 -0
  305. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_config_provider.py +0 -0
  306. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_configuration_manager.py +0 -0
  307. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_definition_factory.py +0 -0
  308. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_deployment.py +0 -0
  309. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_discovery_service.py +0 -0
  310. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_environment_manager.py +0 -0
  311. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_filesystem_manager.py +0 -0
  312. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_format_converter.py +0 -0
  313. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +0 -0
  314. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +0 -0
  315. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -0
  316. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_metrics_collector.py +0 -0
  317. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_operation_service.py +0 -0
  318. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_record_service.py +0 -0
  319. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -0
  320. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_state_service.py +0 -0
  321. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_template_builder.py +0 -0
  322. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_validator.py +0 -0
  323. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agent_versioning.py +0 -0
  324. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/agents_directory_resolver.py +0 -0
  325. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/async_agent_deployment.py +0 -0
  326. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/base_agent_locator.py +0 -0
  327. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/config/__init__.py +0 -0
  328. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/config/deployment_config.py +0 -0
  329. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/config/deployment_config_manager.py +0 -0
  330. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/deployment_config_loader.py +0 -0
  331. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/deployment_results_manager.py +0 -0
  332. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/deployment_type_detector.py +0 -0
  333. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/deployment_wrapper.py +0 -0
  334. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/facade/__init__.py +0 -0
  335. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +0 -0
  336. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -0
  337. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/facade/deployment_facade.py +0 -0
  338. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +0 -0
  339. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/interface_adapter.py +0 -0
  340. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/lifecycle_health_checker.py +0 -0
  341. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +0 -0
  342. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/multi_source_deployment_service.py +0 -0
  343. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/__init__.py +0 -0
  344. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +0 -0
  345. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +0 -0
  346. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +0 -0
  347. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +0 -0
  348. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +0 -0
  349. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -0
  350. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +0 -0
  351. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +0 -0
  352. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +0 -0
  353. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/processors/__init__.py +0 -0
  354. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +0 -0
  355. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +0 -0
  356. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/processors/agent_processor.py +0 -0
  357. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +0 -0
  358. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/results/__init__.py +0 -0
  359. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/results/deployment_metrics.py +0 -0
  360. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/results/deployment_result_builder.py +0 -0
  361. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/single_agent_deployer.py +0 -0
  362. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/strategies/__init__.py +0 -0
  363. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/strategies/base_strategy.py +0 -0
  364. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/strategies/project_strategy.py +0 -0
  365. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/strategies/strategy_selector.py +0 -0
  366. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/strategies/system_strategy.py +0 -0
  367. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/strategies/user_strategy.py +0 -0
  368. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/system_instructions_deployer.py +0 -0
  369. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/validation/__init__.py +0 -0
  370. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/validation/agent_validator.py +0 -0
  371. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/validation/deployment_validator.py +0 -0
  372. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/validation/template_validator.py +0 -0
  373. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/deployment/validation/validation_result.py +0 -0
  374. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/loading/__init__.py +0 -0
  375. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/loading/agent_profile_loader.py +0 -0
  376. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/loading/base_agent_manager.py +0 -0
  377. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/loading/framework_agent_loader.py +0 -0
  378. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/management/__init__.py +0 -0
  379. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/management/agent_capabilities_generator.py +0 -0
  380. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/management/agent_management_service.py +0 -0
  381. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/__init__.py +0 -0
  382. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/agent_memory_manager.py +0 -0
  383. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/agent_persistence_service.py +0 -0
  384. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/content_manager.py +0 -0
  385. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/memory_categorization_service.py +0 -0
  386. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/memory_file_service.py +0 -0
  387. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/memory_format_service.py +0 -0
  388. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/memory_limits_service.py +0 -0
  389. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/memory/template_generator.py +0 -0
  390. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/registry/__init__.py +0 -0
  391. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/registry/deployed_agent_discovery.py +0 -0
  392. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/agents/registry/modification_tracker.py +0 -0
  393. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/async_session_logger.py +0 -0
  394. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/claude_session_logger.py +0 -0
  395. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/__init__.py +0 -0
  396. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/agent_cleanup_service.py +0 -0
  397. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/agent_dependency_service.py +0 -0
  398. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/agent_listing_service.py +0 -0
  399. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/agent_output_formatter.py +0 -0
  400. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/agent_validation_service.py +0 -0
  401. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/dashboard_launcher.py +0 -0
  402. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/memory_crud_service.py +0 -0
  403. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/memory_output_formatter.py +0 -0
  404. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/session_manager.py +0 -0
  405. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/socketio_manager.py +0 -0
  406. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/cli/startup_checker.py +0 -0
  407. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/command_deployment_service.py +0 -0
  408. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/command_handler_service.py +0 -0
  409. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/communication/__init__.py +0 -0
  410. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/__init__.py +0 -0
  411. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/base.py +0 -0
  412. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/cache_manager.py +0 -0
  413. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/interfaces/__init__.py +0 -0
  414. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/interfaces/agent.py +0 -0
  415. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/interfaces/communication.py +0 -0
  416. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/interfaces/infrastructure.py +0 -0
  417. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/interfaces/service.py +0 -0
  418. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/interfaces.py +0 -0
  419. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/memory_manager.py +0 -0
  420. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/path_resolver.py +0 -0
  421. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/service_container.py +0 -0
  422. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/core/service_interfaces.py +0 -0
  423. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/__init__.py +0 -0
  424. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/__init__.py +0 -0
  425. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/agent_check.py +0 -0
  426. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/base_check.py +0 -0
  427. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -0
  428. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/common_issues_check.py +0 -0
  429. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/configuration_check.py +0 -0
  430. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/filesystem_check.py +0 -0
  431. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/installation_check.py +0 -0
  432. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/instructions_check.py +0 -0
  433. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/mcp_check.py +0 -0
  434. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/monitor_check.py +0 -0
  435. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/checks/startup_log_check.py +0 -0
  436. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/diagnostic_runner.py +0 -0
  437. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/doctor_reporter.py +0 -0
  438. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/diagnostics/models.py +0 -0
  439. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/event_aggregator.py +0 -0
  440. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/event_bus/__init__.py +0 -0
  441. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/event_bus/config.py +0 -0
  442. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/event_bus/direct_relay.py +0 -0
  443. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/event_bus/event_bus.py +0 -0
  444. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/event_bus/relay.py +0 -0
  445. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/__init__.py +0 -0
  446. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/consumers/__init__.py +0 -0
  447. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/consumers/dead_letter.py +0 -0
  448. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/consumers/logging.py +0 -0
  449. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/consumers/metrics.py +0 -0
  450. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/consumers/socketio.py +0 -0
  451. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/core.py +0 -0
  452. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/interfaces.py +0 -0
  453. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/producers/__init__.py +0 -0
  454. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/producers/hook.py +0 -0
  455. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/events/producers/system.py +0 -0
  456. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/exceptions.py +0 -0
  457. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/__init__.py +0 -0
  458. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/content_assembler.py +0 -0
  459. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/content_validator.py +0 -0
  460. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/deployment_manager.py +0 -0
  461. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -0
  462. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -0
  463. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +0 -0
  464. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +0 -0
  465. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +0 -0
  466. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +0 -0
  467. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +0 -0
  468. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/header.py +0 -0
  469. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +0 -0
  470. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +0 -0
  471. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +0 -0
  472. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +0 -0
  473. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +0 -0
  474. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/section_manager.py +0 -0
  475. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/framework_claude_md_generator/version_manager.py +0 -0
  476. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/hook_service.py +0 -0
  477. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/__init__.py +0 -0
  478. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/context_preservation.py +0 -0
  479. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/daemon_manager.py +0 -0
  480. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/logging.py +0 -0
  481. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/__init__.py +0 -0
  482. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/aggregator.py +0 -0
  483. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/base.py +0 -0
  484. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/legacy.py +0 -0
  485. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/network.py +0 -0
  486. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/process.py +0 -0
  487. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/resources.py +0 -0
  488. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring/service.py +0 -0
  489. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/infrastructure/monitoring.py +0 -0
  490. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/__init__.py +0 -0
  491. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/auto_configure.py +0 -0
  492. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/config/__init__.py +0 -0
  493. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/config/config_loader.py +0 -0
  494. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/config/config_schema.py +0 -0
  495. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/config/configuration.py +0 -0
  496. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/__init__.py +0 -0
  497. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/base.py +0 -0
  498. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/exceptions.py +0 -0
  499. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/interfaces.py +0 -0
  500. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/process_pool.py +0 -0
  501. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -0
  502. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -0
  503. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/main.py +0 -0
  504. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/registry/__init__.py +0 -0
  505. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -0
  506. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -0
  507. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/server/__init__.py +0 -0
  508. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -0
  509. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -0
  510. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -0
  511. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/__init__.py +0 -0
  512. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -0
  513. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -0
  514. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -0
  515. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -0
  516. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -0
  517. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -0
  518. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/__init__.py +0 -0
  519. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/builder.py +0 -0
  520. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/cache/__init__.py +0 -0
  521. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/cache/shared_prompt_cache.py +0 -0
  522. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/cache/simple_cache.py +0 -0
  523. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/indexed_memory.py +0 -0
  524. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/optimizer.py +0 -0
  525. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory/router.py +0 -0
  526. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/memory_hook_service.py +0 -0
  527. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/monitor_build_service.py +0 -0
  528. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/port_manager.py +0 -0
  529. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/__init__.py +0 -0
  530. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/analyzer.py +0 -0
  531. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/analyzer_refactored.py +0 -0
  532. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/analyzer_v2.py +0 -0
  533. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/architecture_analyzer.py +0 -0
  534. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/dependency_analyzer.py +0 -0
  535. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/language_analyzer.py +0 -0
  536. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/metrics_collector.py +0 -0
  537. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/project/registry.py +0 -0
  538. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/recovery_manager.py +0 -0
  539. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/response_tracker.py +0 -0
  540. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/runner_configuration_service.py +0 -0
  541. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/session_management_service.py +0 -0
  542. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/shared/__init__.py +0 -0
  543. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/shared/async_service_base.py +0 -0
  544. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/shared/config_service_base.py +0 -0
  545. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/shared/lifecycle_service_base.py +0 -0
  546. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/shared/manager_base.py +0 -0
  547. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/shared/service_factory.py +0 -0
  548. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/__init__.py +0 -0
  549. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/client_proxy.py +0 -0
  550. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/event_normalizer.py +0 -0
  551. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/__init__.py +0 -0
  552. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/base.py +0 -0
  553. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/code_analysis.py +0 -0
  554. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/connection.py +0 -0
  555. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/connection_handler.py +0 -0
  556. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/file.py +0 -0
  557. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/git.py +0 -0
  558. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/hook.py +0 -0
  559. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/memory.py +0 -0
  560. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/project.py +0 -0
  561. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/handlers/registry.py +0 -0
  562. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/migration_utils.py +0 -0
  563. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/server/__init__.py +0 -0
  564. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/server/broadcaster.py +0 -0
  565. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/server/connection_manager.py +0 -0
  566. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/server/core.py +0 -0
  567. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/server/eventbus_integration.py +0 -0
  568. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio/server/main.py +0 -0
  569. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio_client_manager.py +0 -0
  570. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/socketio_server.py +0 -0
  571. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/subprocess_launcher_service.py +0 -0
  572. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/system_instructions_service.py +0 -0
  573. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_manager.py +0 -0
  574. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_services/__init__.py +0 -0
  575. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_services/crud_service.py +0 -0
  576. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_services/formatter_service.py +0 -0
  577. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_services/search_service.py +0 -0
  578. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_services/validation_service.py +0 -0
  579. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/ticket_services/workflow_service.py +0 -0
  580. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/utility_service.py +0 -0
  581. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_control/__init__.py +0 -0
  582. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_control/branch_strategy.py +0 -0
  583. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_control/conflict_resolution.py +0 -0
  584. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_control/git_operations.py +0 -0
  585. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_control/semantic_versioning.py +0 -0
  586. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_control/version_parser.py +0 -0
  587. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/version_service.py +0 -0
  588. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/visualization/__init__.py +0 -0
  589. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/services/visualization/mermaid_generator.py +0 -0
  590. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/storage/__init__.py +0 -0
  591. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/storage/state_storage.py +0 -0
  592. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/ticket_wrapper.py +0 -0
  593. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/tools/__init__.py +0 -0
  594. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/tools/__main__.py +0 -0
  595. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/tools/code_tree_analyzer.py +0 -0
  596. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/tools/code_tree_builder.py +0 -0
  597. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/tools/code_tree_events.py +0 -0
  598. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/tools/socketio_debug.py +0 -0
  599. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/__init__.py +0 -0
  600. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/agent_dependency_loader.py +0 -0
  601. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/config_manager.py +0 -0
  602. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/console.py +0 -0
  603. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/dependency_cache.py +0 -0
  604. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/dependency_manager.py +0 -0
  605. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/dependency_strategies.py +0 -0
  606. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/environment_context.py +0 -0
  607. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/error_handler.py +0 -0
  608. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/file_utils.py +0 -0
  609. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/framework_detection.py +0 -0
  610. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/import_migration_example.py +0 -0
  611. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/imports.py +0 -0
  612. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/path_operations.py +0 -0
  613. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/robust_installer.py +0 -0
  614. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/session_logging.py +0 -0
  615. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/utils/subprocess_utils.py +0 -0
  616. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/validation/__init__.py +0 -0
  617. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/validation/agent_validator.py +0 -0
  618. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm/validation/frontmatter_validator.py +0 -0
  619. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm.egg-info/dependency_links.txt +0 -0
  620. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm.egg-info/entry_points.txt +0 -0
  621. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm.egg-info/requires.txt +0 -0
  622. {claude_mpm-4.1.21 → claude_mpm-4.1.23}/src/claude_mpm.egg-info/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ 322
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.1.21
3
+ Version: 4.1.23
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -0,0 +1 @@
1
+ 4.1.23
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-mpm"
7
- version = "4.1.21"
7
+ version = "4.1.23"
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"
@@ -248,7 +248,7 @@ ignore-imports = false
248
248
 
249
249
  [tool.commitizen]
250
250
  name = "cz_conventional_commits"
251
- version = "4.1.21"
251
+ version = "4.1.23"
252
252
  version_files = [
253
253
  "VERSION",
254
254
  "src/claude_mpm/VERSION",
@@ -0,0 +1 @@
1
+ 4.1.23
@@ -1683,4 +1683,256 @@ body .activity-tree-container .linear-tree .tree-node.tool.privileged-tool .tree
1683
1683
  font-size: 0.75em;
1684
1684
  margin-left: 5px;
1685
1685
  font-weight: 600;
1686
+ }
1687
+
1688
+ /* ==================== IMPROVED DATA VIEWER STYLES ==================== */
1689
+
1690
+ /* Primary data section for important information */
1691
+ .primary-data {
1692
+ padding: 10px 0;
1693
+ border-bottom: 1px solid #e5e7eb;
1694
+ margin-bottom: 15px;
1695
+ }
1696
+
1697
+ .primary-data .detail-row.highlight {
1698
+ background: rgba(59, 130, 246, 0.05);
1699
+ padding: 8px 12px;
1700
+ border-radius: 6px;
1701
+ margin: 5px 0;
1702
+ font-weight: 500;
1703
+ }
1704
+
1705
+ .primary-data .code {
1706
+ font-family: 'Monaco', 'Courier New', monospace;
1707
+ background: #1e293b;
1708
+ color: #94a3b8;
1709
+ padding: 2px 6px;
1710
+ border-radius: 3px;
1711
+ }
1712
+
1713
+ /* TodoWrite specific styles */
1714
+ .todo-status-bar {
1715
+ display: flex;
1716
+ gap: 20px;
1717
+ padding: 12px;
1718
+ background: linear-gradient(90deg, #f8fafc 0%, #f1f5f9 100%);
1719
+ border-radius: 8px;
1720
+ margin-bottom: 15px;
1721
+ }
1722
+
1723
+ .todo-status-bar .status-item {
1724
+ display: flex;
1725
+ align-items: center;
1726
+ gap: 6px;
1727
+ }
1728
+
1729
+ .todo-status-bar .status-icon {
1730
+ font-size: 1.2em;
1731
+ }
1732
+
1733
+ .todo-status-bar .status-count {
1734
+ font-size: 1.4em;
1735
+ font-weight: 700;
1736
+ color: #1e293b;
1737
+ }
1738
+
1739
+ .todo-status-bar .status-label {
1740
+ color: #64748b;
1741
+ font-size: 0.9em;
1742
+ }
1743
+
1744
+ /* Todo list primary display */
1745
+ .todo-list-primary {
1746
+ padding: 10px 0;
1747
+ }
1748
+
1749
+ .todo-item {
1750
+ display: flex;
1751
+ align-items: center;
1752
+ gap: 10px;
1753
+ padding: 10px 12px;
1754
+ margin: 5px 0;
1755
+ background: white;
1756
+ border: 1px solid #e5e7eb;
1757
+ border-radius: 6px;
1758
+ transition: all 0.2s ease;
1759
+ }
1760
+
1761
+ .todo-item:hover {
1762
+ border-color: #cbd5e1;
1763
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
1764
+ }
1765
+
1766
+ .todo-item.completed {
1767
+ opacity: 0.7;
1768
+ background: #f8fafc;
1769
+ }
1770
+
1771
+ .todo-item.completed .todo-text {
1772
+ text-decoration: line-through;
1773
+ color: #94a3b8;
1774
+ }
1775
+
1776
+ .todo-item.in_progress {
1777
+ background: linear-gradient(90deg, rgba(251, 146, 60, 0.1) 0%, white 100%);
1778
+ border-color: #fb923c;
1779
+ }
1780
+
1781
+ .todo-item .todo-icon {
1782
+ font-size: 1.2em;
1783
+ flex-shrink: 0;
1784
+ }
1785
+
1786
+ .todo-item .todo-text {
1787
+ flex-grow: 1;
1788
+ font-size: 0.95em;
1789
+ color: #334155;
1790
+ }
1791
+
1792
+ .todo-item .todo-badge.active {
1793
+ background: #fb923c;
1794
+ color: white;
1795
+ padding: 2px 8px;
1796
+ border-radius: 12px;
1797
+ font-size: 0.75em;
1798
+ font-weight: 600;
1799
+ text-transform: uppercase;
1800
+ animation: pulse 2s ease-in-out infinite;
1801
+ }
1802
+
1803
+ /* Tool display improvements */
1804
+ .tool-chip {
1805
+ display: inline-flex;
1806
+ align-items: center;
1807
+ gap: 6px;
1808
+ padding: 4px 10px;
1809
+ background: #f1f5f9;
1810
+ border: 1px solid #e2e8f0;
1811
+ border-radius: 15px;
1812
+ font-size: 0.9em;
1813
+ margin: 2px;
1814
+ }
1815
+
1816
+ .tool-chip.active {
1817
+ background: linear-gradient(90deg, #fef3c7 0%, #fed7aa 100%);
1818
+ border-color: #fb923c;
1819
+ font-weight: 500;
1820
+ }
1821
+
1822
+ .tools-grid {
1823
+ display: flex;
1824
+ flex-wrap: wrap;
1825
+ gap: 5px;
1826
+ margin-top: 8px;
1827
+ }
1828
+
1829
+ .active-tools-section {
1830
+ margin: 10px 0;
1831
+ padding: 10px;
1832
+ background: rgba(251, 146, 60, 0.05);
1833
+ border-radius: 6px;
1834
+ }
1835
+
1836
+ .active-tools-section .section-label {
1837
+ font-weight: 600;
1838
+ color: #ea580c;
1839
+ display: block;
1840
+ margin-bottom: 8px;
1841
+ }
1842
+
1843
+ /* Instruction display */
1844
+ .instruction-content {
1845
+ background: #f8fafc;
1846
+ padding: 15px;
1847
+ border-radius: 8px;
1848
+ border-left: 4px solid #3b82f6;
1849
+ font-size: 0.95em;
1850
+ line-height: 1.6;
1851
+ color: #1e293b;
1852
+ margin-bottom: 10px;
1853
+ }
1854
+
1855
+ .instruction-meta {
1856
+ display: flex;
1857
+ gap: 15px;
1858
+ padding: 8px 0;
1859
+ color: #64748b;
1860
+ font-size: 0.85em;
1861
+ }
1862
+
1863
+ .instruction-meta .meta-item {
1864
+ display: flex;
1865
+ align-items: center;
1866
+ gap: 5px;
1867
+ }
1868
+
1869
+ /* Collapsible JSON viewer */
1870
+ .collapsible-json-section {
1871
+ margin-top: 15px;
1872
+ border-top: 1px solid #e5e7eb;
1873
+ padding-top: 10px;
1874
+ }
1875
+
1876
+ .collapsible-json-toggle {
1877
+ background: #f8fafc;
1878
+ border: 1px solid #e2e8f0;
1879
+ padding: 6px 12px;
1880
+ border-radius: 6px;
1881
+ cursor: pointer;
1882
+ font-size: 0.9em;
1883
+ color: #475569;
1884
+ transition: all 0.2s ease;
1885
+ width: auto;
1886
+ display: inline-block;
1887
+ }
1888
+
1889
+ .collapsible-json-toggle:hover {
1890
+ background: #f1f5f9;
1891
+ border-color: #cbd5e1;
1892
+ }
1893
+
1894
+ .collapsible-json-toggle.expanded {
1895
+ background: #e0e7ff;
1896
+ border-color: #818cf8;
1897
+ color: #4338ca;
1898
+ }
1899
+
1900
+ .collapsible-json-content {
1901
+ margin-top: 10px;
1902
+ max-height: 400px;
1903
+ overflow-y: auto;
1904
+ }
1905
+
1906
+ .json-viewer {
1907
+ background: #1e293b;
1908
+ color: #94a3b8;
1909
+ padding: 12px;
1910
+ border-radius: 6px;
1911
+ font-family: 'Monaco', 'Courier New', monospace;
1912
+ font-size: 0.85em;
1913
+ line-height: 1.4;
1914
+ overflow-x: auto;
1915
+ }
1916
+
1917
+ /* Code snippets in viewers */
1918
+ .code-snippet {
1919
+ background: #1e293b;
1920
+ color: #94a3b8;
1921
+ padding: 8px 12px;
1922
+ border-radius: 4px;
1923
+ font-family: 'Monaco', 'Courier New', monospace;
1924
+ font-size: 0.9em;
1925
+ margin: 5px 0;
1926
+ overflow-x: auto;
1927
+ max-width: 100%;
1928
+ }
1929
+
1930
+ /* Animation for active items */
1931
+ @keyframes pulse {
1932
+ 0%, 100% {
1933
+ opacity: 1;
1934
+ }
1935
+ 50% {
1936
+ opacity: 0.7;
1937
+ }
1686
1938
  }
@@ -0,0 +1,2 @@
1
+ class s{constructor(s="module-data-content"){this.container=document.getElementById(s),this.currentData=null,this.currentType=null}display(s,a=null){if(this.container)switch(this.currentData=s,this.currentType=a,a||(a=this.detectType(s)),this.container.innerHTML="",a){case"event":this.displayEvent(s);break;case"agent":this.displayAgent(s);break;case"tool":this.displayTool(s);break;case"todo":this.displayTodo(s);break;case"instruction":this.displayInstruction(s);break;case"session":this.displaySession(s);break;case"file_operation":this.displayFileOperation(s);break;case"hook":this.displayHook(s);break;default:this.displayGeneric(s)}else console.warn("UnifiedDataViewer: Container not found")}detectType(s){return s&&"object"==typeof s?s.hook_event_name||s.event_type||s.type&&s.timestamp?"event":s.agent_name||s.agentName||s.name&&("active"===s.status||"completed"===s.status)?"agent":s.tool_name||"TodoWrite"===s.name||"Read"===s.name||s.tool_parameters||s.params&&s.icon||s.name&&"tool"===s.type?"tool":!s.todos||s.name||s.params?s.content&&s.activeForm&&s.status&&!s.name&&!s.params?"todo":s.text&&s.preview&&"user_instruction"===s.type?"instruction":s.session_id&&(s.startTime||s.lastActivity)?"session":s.file_path&&(s.operations||s.operation)?"file_operation":s.event_type&&(s.hook_name||s.subtype)?"hook":"generic":"todo":"generic"}displayEvent(s){let a=`\n <div class="unified-viewer-header">\n <h6>${this.formatEventType(s)}</h6>\n <span class="unified-viewer-timestamp">${this.formatTimestamp(s.timestamp)}</span>\n </div>\n <div class="unified-viewer-content">\n `;if(a+='<div class="primary-data">',a+=this.formatEventDetails(s),s.tool_name||s.data?.tool_name){const n=s.tool_name||s.data.tool_name;a+=`\n <div class="detail-row highlight">\n <span class="detail-label">Tool:</span>\n <span class="detail-value">${this.getToolIcon(n)} ${n}</span>\n </div>\n `;const t=s.tool_parameters||s.data?.tool_parameters;t&&(t.file_path&&(a+=`\n <div class="detail-row">\n <span class="detail-label">File:</span>\n <span class="detail-value code">${t.file_path}</span>\n </div>\n `),t.command&&(a+=`\n <div class="detail-row">\n <span class="detail-label">Command:</span>\n <pre class="code-snippet">${this.escapeHtml(t.command)}</pre>\n </div>\n `))}a+="</div>",a+=this.createCollapsibleJSON(s,"Full Event Data"),a+="</div>",this.container.innerHTML=a}displayAgent(s){const a=this.getAgentIcon(s.name||s.agentName),n=s.name||s.agentName||"Unknown Agent",t=this.formatStatus(s.status);let e=`\n <div class="unified-viewer-header">\n <h6>${a} ${n}</h6>\n <span class="unified-viewer-status">${t}</span>\n </div>\n <div class="unified-viewer-content">\n `;if(e+='<div class="primary-data">',e+=`\n <div class="detail-row highlight">\n <span class="detail-label">Status:</span>\n <span class="detail-value ${this.formatStatusClass(t)}">${t}</span>\n </div>\n `,s.tools&&s.tools.length>0){const a=s.tools.filter(s=>"in_progress"===s.status),n=s.tools.filter(s=>"completed"===s.status);a.length>0&&(e+='\n <div class="active-tools-section">\n <span class="section-label">🔄 Active Tools:</span>\n <div class="tools-grid">\n ',a.forEach(s=>{e+=`\n <div class="tool-chip active">\n ${this.getToolIcon(s.name)} ${s.name}\n </div>\n `}),e+="</div></div>"),e+=`\n <div class="detail-row">\n <span class="detail-label">Tools Summary:</span>\n <span class="detail-value">\n ${a.length} active, ${n.length} completed, ${s.tools.length} total\n </span>\n </div>\n `}(s.currentTask||s.description)&&(e+=`\n <div class="detail-row">\n <span class="detail-label">Current Task:</span>\n <span class="detail-value">${s.currentTask||s.description}</span>\n </div>\n `),e+="</div>",e+=this.createCollapsibleJSON(s,"Full Agent Details"),e+="</div>",this.container.innerHTML=e}displayTool(s){const a=s.name||s.tool_name||"Unknown Tool",n=this.getToolIcon(a),t=this.formatStatus(s.status);if("TodoWrite"===a)return void this.displayTodoWriteTool(s);let e=`\n <div class="unified-viewer-header">\n <h6>${n} ${a}</h6>\n <span class="unified-viewer-status">${t}</span>\n </div>\n <div class="unified-viewer-content">\n `;const i=s.params||s.tool_parameters||{};"Read"===a||"Edit"===a||"Write"===a?i.file_path&&(e+=`\n <div class="primary-data">\n <div class="detail-row highlight">\n <span class="detail-label">📁 File:</span>\n <span class="detail-value code">${i.file_path}</span>\n </div>\n `,i.old_string&&(e+=`\n <div class="detail-row">\n <span class="detail-label">Old Text:</span>\n <pre class="code-snippet">${this.escapeHtml(i.old_string.substring(0,200))}${i.old_string.length>200?"...":""}</pre>\n </div>\n `),i.new_string&&(e+=`\n <div class="detail-row">\n <span class="detail-label">New Text:</span>\n <pre class="code-snippet">${this.escapeHtml(i.new_string.substring(0,200))}${i.new_string.length>200?"...":""}</pre>\n </div>\n `),e+="</div>"):"Bash"===a?i.command&&(e+=`\n <div class="primary-data">\n <div class="detail-row highlight">\n <span class="detail-label">💻 Command:</span>\n <pre class="code-snippet">${this.escapeHtml(i.command)}</pre>\n </div>\n </div>\n `):"Grep"===a||"Glob"===a?i.pattern&&(e+=`\n <div class="primary-data">\n <div class="detail-row highlight">\n <span class="detail-label">🔍 Pattern:</span>\n <span class="detail-value code">${this.escapeHtml(i.pattern)}</span>\n </div>\n `,i.path&&(e+=`\n <div class="detail-row">\n <span class="detail-label">Path:</span>\n <span class="detail-value">${i.path}</span>\n </div>\n `),e+="</div>"):"Task"===a&&i.subagent_type&&(e+=`\n <div class="primary-data">\n <div class="detail-row highlight">\n <span class="detail-label">🤖 Delegating to:</span>\n <span class="detail-value">${i.subagent_type} agent</span>\n </div>\n `,i.description&&(e+=`\n <div class="detail-row">\n <span class="detail-label">Task:</span>\n <span class="detail-value">${i.description}</span>\n </div>\n `),e+="</div>"),e+=`\n <div class="detail-row">\n <span class="detail-label">Status:</span>\n <span class="detail-value">${t}</span>\n </div>\n `,s.callCount&&(e+=`\n <div class="detail-row">\n <span class="detail-label">Call Count:</span>\n <span class="detail-value">${s.callCount}</span>\n </div>\n `),e+=this.createCollapsibleJSON(s,"Full Tool Details"),e+="</div>",this.container.innerHTML=e}displayTodoWriteTool(s){const a=this.formatStatus(s.status),n=(s.params||s.tool_parameters||{}).todos||[];let t=`\n <div class="unified-viewer-header">\n <h6>📝 TodoWrite</h6>\n <span class="unified-viewer-status">${a}</span>\n </div>\n <div class="unified-viewer-content">\n `;if(n.length>0){const s=this.getTodoStatusCounts(n);t+=`\n <div class="todo-status-bar">\n <div class="status-item completed">\n <span class="status-icon">✅</span>\n <span class="status-count">${s.completed}</span>\n <span class="status-label">Done</span>\n </div>\n <div class="status-item in_progress">\n <span class="status-icon">🔄</span>\n <span class="status-count">${s.in_progress}</span>\n <span class="status-label">Active</span>\n </div>\n <div class="status-item pending">\n <span class="status-icon">⏳</span>\n <span class="status-count">${s.pending}</span>\n <span class="status-label">Pending</span>\n </div>\n </div>\n `,t+='\n <div class="todo-list-primary">\n ',n.forEach((s,a)=>{const n=this.getCheckboxIcon(s.status),e="in_progress"===s.status&&s.activeForm||s.content,i=this.formatStatusClass(s.status);t+=`\n <div class="todo-item ${s.status}">\n <span class="todo-icon ${i}">${n}</span>\n <span class="todo-text">${this.escapeHtml(e)}</span>\n ${"in_progress"===s.status?'<span class="todo-badge active">ACTIVE</span>':""}\n </div>\n `}),t+="\n </div>\n "}else t+='\n <div class="detail-row">\n <span class="detail-value">No todos in list</span>\n </div>\n ';s.callCount&&s.callCount>1&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Updates:</span>\n <span class="detail-value">${s.callCount}</span>\n </div>\n `),t+=this.createCollapsibleJSON(s,"Full Details"),t+="</div>",this.container.innerHTML=t}displayTodo(s){let a;a=s.todos&&Array.isArray(s.todos)?s.todos:Array.isArray(s)?s:s.content&&s.activeForm&&s.status?[s]:[];let n='\n <div class="unified-viewer-header">\n <h6>📋 Todo List</h6>\n </div>\n <div class="unified-viewer-content">\n ';a.length>0?(n+='\n <div class="todo-list-primary">\n ',a.forEach(s=>{const a=this.getCheckboxIcon(s.status),t="in_progress"===s.status&&s.activeForm||s.content,e=this.formatStatusClass(s.status);n+=`\n <div class="todo-item ${s.status}">\n <span class="todo-icon ${e}">${a}</span>\n <span class="todo-text">${this.escapeHtml(t)}</span>\n <span class="todo-status-text ${e}">${s.status.replace("_"," ")}</span>\n </div>\n `}),n+="\n </div>\n "):n+='\n <div class="detail-section">\n <div class="no-todos">No todo items found</div>\n </div>\n ',n+="</div>",this.container.innerHTML=n}displayInstruction(s){let a=`\n <div class="unified-viewer-header">\n <h6>💬 User Instruction</h6>\n <span class="unified-viewer-timestamp">${this.formatTimestamp(s.timestamp)}</span>\n </div>\n <div class="unified-viewer-content">\n `;a+=`\n <div class="primary-data">\n <div class="instruction-content">\n ${this.escapeHtml(s.text)}\n </div>\n <div class="instruction-meta">\n <span class="meta-item">📏 ${s.text.length} characters</span>\n <span class="meta-item">🕐 ${this.formatTimestamp(s.timestamp)}</span>\n </div>\n </div>\n `,Object.keys(s).length>3&&(a+=this.createCollapsibleJSON(s,"Full Instruction Data")),a+="</div>",this.container.innerHTML=a}displaySession(s){let a=`\n <div class="unified-viewer-header">\n <h6>🎯 Session: ${s.session_id||s.id}</h6>\n <span class="unified-viewer-status">${this.formatStatus(s.status||"active")}</span>\n </div>\n <div class="unified-viewer-content">\n <div class="detail-row">\n <span class="detail-label">Session ID:</span>\n <span class="detail-value">${s.session_id||s.id}</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Start Time:</span>\n <span class="detail-value">${this.formatTimestamp(s.startTime||s.timestamp)}</span>\n </div>\n `;s.working_directory&&(a+=`\n <div class="detail-row">\n <span class="detail-label">Working Directory:</span>\n <span class="detail-value">${s.working_directory}</span>\n </div>\n `),s.git_branch&&(a+=`\n <div class="detail-row">\n <span class="detail-label">Git Branch:</span>\n <span class="detail-value">${s.git_branch}</span>\n </div>\n `),void 0!==s.eventCount&&(a+=`\n <div class="detail-row">\n <span class="detail-label">Events:</span>\n <span class="detail-value">${s.eventCount}</span>\n </div>\n `),a+="</div>",this.container.innerHTML=a}displayFileOperation(s){let a=`\n <div class="unified-viewer-header">\n <h6>📄 File: ${s.file_path}</h6>\n <span class="unified-viewer-count">${s.operations?s.operations.length:1} operation${s.operations&&1!==s.operations.length?"s":""}</span>\n </div>\n <div class="unified-viewer-content">\n <div class="detail-row">\n <span class="detail-label">File Path:</span>\n <span class="detail-value">${s.file_path}</span>\n </div>\n `;s.operations&&Array.isArray(s.operations)&&(a+=`\n <div class="detail-section">\n <span class="detail-section-title">Operations:</span>\n <div class="operations-list">\n ${s.operations.map(s=>`\n <div class="operation-item">\n <span class="operation-type">${s.operation}</span>\n <span class="operation-timestamp">${this.formatTimestamp(s.timestamp)}</span>\n </div>\n `).join("")}\n </div>\n </div>\n `),a+="</div>",this.container.innerHTML=a}displayHook(s){let a=`\n <div class="unified-viewer-header">\n <h6>🔗 Hook: ${s.event_type||s.subtype||"unknown"}</h6>\n <span class="unified-viewer-timestamp">${this.formatTimestamp(s.timestamp)}</span>\n </div>\n <div class="unified-viewer-content">\n `;a+=this.formatHookDetails(s),a+="</div>",this.container.innerHTML=a}displayGeneric(s){let a=`\n <div class="unified-viewer-header">\n <h6>📊 Data Details</h6>\n ${s.timestamp?`<span class="unified-viewer-timestamp">${this.formatTimestamp(s.timestamp)}</span>`:""}\n </div>\n <div class="unified-viewer-content">\n `;if("object"==typeof s&&null!==s){const n=["id","name","type","status","timestamp","text","content","message"];for(let t of n)if(void 0!==s[t]){let n=s[t];"string"==typeof n&&n.length>200&&(n=n.substring(0,200)+"..."),a+=`\n <div class="detail-row">\n <span class="detail-label">${t}:</span>\n <span class="detail-value">${this.escapeHtml(String(n))}</span>\n </div>\n `}}else a+=`<div class="simple-value">${this.escapeHtml(String(s))}</div>`;a+="</div>",this.container.innerHTML=a}formatEventType(s){return s.type&&s.subtype?s.type===s.subtype||"generic"===s.subtype?s.type:`${s.type}.${s.subtype}`:s.type?s.type:s.hook_event_name?s.hook_event_name:"unknown"}formatEventDetails(s){switch(s.data,s.type){case"hook":return this.formatHookDetails(s);case"agent":return this.formatAgentEventDetails(s);case"todo":return this.formatTodoEventDetails(s);case"session":return this.formatSessionEventDetails(s);default:return this.formatGenericEventDetails(s)}}formatHookDetails(s){const a=s.data||{},n=s.subtype||s.event_type||"unknown";let t=`\n <div class="detail-row">\n <span class="detail-label">Hook Type:</span>\n <span class="detail-value">${n}</span>\n </div>\n `;switch(n){case"user_prompt":const s=a.prompt_text||a.prompt_preview||"";t+=`\n <div class="detail-row">\n <span class="detail-label">Prompt:</span>\n <div class="detail-value prompt-text">${this.escapeHtml(s)}</div>\n </div>\n `;break;case"pre_tool":case"post_tool":t+=`\n <div class="detail-row">\n <span class="detail-label">Tool:</span>\n <span class="detail-value">${a.tool_name||"Unknown tool"}</span>\n </div>\n `,a.operation_type&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Operation:</span>\n <span class="detail-value">${a.operation_type}</span>\n </div>\n `),"post_tool"===n&&a.duration_ms&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Duration:</span>\n <span class="detail-value">${a.duration_ms}ms</span>\n </div>\n `);break;case"subagent_start":case"subagent_stop":t+=`\n <div class="detail-row">\n <span class="detail-label">Agent:</span>\n <span class="detail-value">${a.agent_type||a.agent||"Unknown"}</span>\n </div>\n `,"subagent_start"===n&&a.prompt&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Task:</span>\n <div class="detail-value">${this.escapeHtml(a.prompt)}</div>\n </div>\n `),"subagent_stop"===n&&a.reason&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Reason:</span>\n <span class="detail-value">${a.reason}</span>\n </div>\n `)}return t}formatAgentEventDetails(s){const a=s.data||{};let n="";return(a.agent_type||a.name)&&(n+=`\n <div class="detail-row">\n <span class="detail-label">Agent Type:</span>\n <span class="detail-value">${a.agent_type||a.name}</span>\n </div>\n `),s.subtype&&(n+=`\n <div class="detail-row">\n <span class="detail-label">Action:</span>\n <span class="detail-value">${s.subtype}</span>\n </div>\n `),n}formatTodoEventDetails(s){const a=s.data||{};let n="";if(a.todos&&Array.isArray(a.todos)){const s=this.getTodoStatusCounts(a.todos);n+=`\n <div class="detail-row">\n <span class="detail-label">Todo Items:</span>\n <span class="detail-value">${a.todos.length} total</span>\n </div>\n <div class="detail-row">\n <span class="detail-label">Status:</span>\n <span class="detail-value">${s.completed} completed, ${s.in_progress} in progress</span>\n </div>\n `}return n}formatSessionEventDetails(s){const a=s.data||{};let n="";return a.session_id&&(n+=`\n <div class="detail-row">\n <span class="detail-label">Session ID:</span>\n <span class="detail-value">${a.session_id}</span>\n </div>\n `),s.subtype&&(n+=`\n <div class="detail-row">\n <span class="detail-label">Action:</span>\n <span class="detail-value">${s.subtype}</span>\n </div>\n `),n}formatGenericEventDetails(s){const a=s.data||{};let n="";const t=["message","description","value","result"];for(let e of t)if(void 0!==a[e]){let s=a[e];"string"==typeof s&&s.length>200&&(s=s.substring(0,200)+"..."),n+=`\n <div class="detail-row">\n <span class="detail-label">${e}:</span>\n <span class="detail-value">${this.escapeHtml(String(s))}</span>\n </div>\n `}return n}formatEventData(s){const a=s.data;return a&&0!==Object.keys(a).length?`\n <div class="detail-section">\n <span class="detail-section-title">Event Data:</span>\n <pre class="event-data-json">${this.escapeHtml(JSON.stringify(a,null,2))}</pre>\n </div>\n `:""}formatParameters(s,a="Parameters"){if(!s||0===Object.keys(s).length)return`\n <div class="detail-section">\n <span class="detail-section-title">${a}:</span>\n <div class="no-params">No parameters</div>\n </div>\n `;const n=Object.keys(s);return`\n <div class="detail-section">\n <span class="detail-section-title">${a} (${n.length}):</span>\n <div class="params-list">\n ${n.map(a=>{const n=s[a];return`\n <div class="param-item">\n <div class="param-key">${a}:</div>\n <div class="param-value">${this.formatParameterValue(n)}</div>\n </div>\n `}).join("")}\n </div>\n </div>\n `}formatParameterValue(s){if("string"==typeof s)return s.length>500?`<pre class="param-text-long">${this.escapeHtml(s.substring(0,500)+"...\n\n[Content truncated - "+s.length+" total characters]")}</pre>`:s.length>100?`<pre class="param-text">${this.escapeHtml(s)}</pre>`:`<span class="param-text-short">${this.escapeHtml(s)}</span>`;if("object"!=typeof s||null===s)return`<span class="param-primitive">${this.escapeHtml(String(s))}</span>`;if(Array.isArray(s)&&s.length>0&&s[0].hasOwnProperty("content")&&s[0].hasOwnProperty("status"))return this.formatTodosAsParameter(s);try{return`<pre class="param-json">${this.escapeHtml(JSON.stringify(s,null,2))}</pre>`}catch(a){return'<span class="param-error">Error displaying object</span>'}}formatTodosAsParameter(s){const a=this.getTodoStatusCounts(s);let n=`\n <div class="param-todos">\n <div class="param-todos-header">\n Array of todo objects (${s.length} items)\n </div>\n <div class="param-todos-summary">\n ${a.completed} completed • ${a.in_progress} in progress • ${a.pending} pending\n </div>\n <div class="param-todos-list">\n `;return s.forEach((s,a)=>{const t=this.getCheckboxIcon(s.status),e="in_progress"===s.status&&s.activeForm||s.content,i=this.formatStatusClass(s.status);n+=`\n <div class="param-todo-item ${s.status}">\n <div class="param-todo-checkbox">\n <span class="param-checkbox-icon ${i}">${t}</span>\n </div>\n <div class="param-todo-text">\n <span class="param-todo-content">${this.escapeHtml(e)}</span>\n <span class="param-todo-status-badge ${i}">${s.status.replace("_"," ")}</span>\n </div>\n </div>\n `}),n+="\n </div>\n </div>\n ",n}formatTimestamp(s){if(!s)return"Unknown time";try{const a=new Date(s);return isNaN(a.getTime())?"Invalid date":a.toLocaleString()}catch(a){return"Invalid date"}}formatStatus(s){if(!s)return"unknown";return{active:"🟢 Active",completed:"✅ Completed",in_progress:"🔄 In Progress",pending:"⏳ Pending",error:"❌ Error",failed:"❌ Failed"}[s]||s}formatStatusClass(s){return`status-${s}`}getAgentIcon(s){return{PM:"🎯",Engineer:"🔧","Engineer Agent":"🔧",Research:"🔍","Research Agent":"🔍",QA:"✅","QA Agent":"✅",Architect:"🏗️","Architect Agent":"🏗️",Ops:"⚙️","Ops Agent":"⚙️"}[s]||"🤖"}getToolIcon(s){return{Read:"👁️",Write:"✍️",Edit:"✏️",MultiEdit:"📝",Bash:"💻",Grep:"🔍",Glob:"📂",LS:"📁",TodoWrite:"📝",Task:"📋",WebFetch:"🌐"}[s]||"🔧"}getCheckboxIcon(s){return{pending:"⏳",in_progress:"🔄",completed:"✅"}[s]||"❓"}getTodoStatusCounts(s){const a={completed:0,in_progress:0,pending:0};return s.forEach(s=>{a.hasOwnProperty(s.status)&&a[s.status]++}),a}escapeHtml(s){if("string"!=typeof s)return"";const a=document.createElement("div");return a.textContent=s,a.innerHTML}createCollapsibleJSON(s,a="Full Details"){const n=`json-details-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,t=this.cleanDataForDisplay(s);return`\n <div class="collapsible-json-section">\n <button class="collapsible-json-toggle" onclick="\n const content = document.getElementById('${n}');\n const button = this;\n if (content.style.display === 'none' || content.style.display === '') {\n content.style.display = 'block';\n button.classList.add('expanded');\n button.innerHTML = '▼ ${a}';\n } else {\n content.style.display = 'none';\n button.classList.remove('expanded');\n button.innerHTML = '▶ ${a}';\n }\n ">▶ ${a}</button>\n <div id="${n}" class="collapsible-json-content" style="display: none;">\n <pre class="json-viewer">${this.escapeHtml(JSON.stringify(t,null,2))}</pre>\n </div>\n </div>\n `}cleanDataForDisplay(s){const a=new WeakSet;return JSON.parse(JSON.stringify(s,(s,n)=>{if("object"==typeof n&&null!==n){if(a.has(n))return"[Circular Reference]";a.add(n)}return"string"==typeof n&&n.length>1e3?n.substring(0,1e3)+"... [truncated]":"function"==typeof n?"[Function]":n}))}clear(){this.container&&(this.container.innerHTML=""),this.currentData=null,this.currentType=null}getCurrentData(){return this.currentData}getCurrentType(){return this.currentType}hasData(){return null!==this.currentData}}window.UnifiedDataViewer=s;export{s as U};
2
+ //# sourceMappingURL=unified-data-viewer.CvAmgM3l.js.map
@@ -0,0 +1,2 @@
1
+ import{U as e}from"../chunks/unified-data-viewer.CvAmgM3l.js";class t{constructor(){this.container=null,this.events=[],this.processedEventIds=new Set,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,this.renderTreeDebounced=this.debounce(()=>this.renderTree(),100)}debounce(e,t){let s;return function(...n){clearTimeout(s),s=setTimeout(()=>{clearTimeout(s),e(...n)},t)}}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 o=document.getElementById("activity-search");o&&o.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`);for(const[n,o]of t.entries())if(this.sessions.has(n)){const e=this.sessions.get(n);e.timestamp=new Date(o.lastActivity||o.startTime||e.timestamp),e.eventCount=o.eventCount,e.status=o.status||e.status,e.working_directory=o.working_directory||e.working_directory,e.git_branch=o.git_branch||e.git_branch}else{const e={id:n,timestamp:new Date(o.lastActivity||o.startTime||new Date),expanded:this.expandedSessions.has(n)||!0,agents:new Map,todos:[],userInstructions:[],tools:[],toolsMap:new Map,status:"active",currentTodoTool:null,working_directory:o.working_directory,git_branch:o.git_branch,eventCount:o.eventCount};this.sessions.set(n,e)}const s=e.filter(e=>{const t=e.id||`${e.type}-${e.timestamp}-${Math.random()}`;return!this.processedEventIds.has(t)});s.length>0&&(console.log(`ActivityTree: Processing ${s.length} new events`,s),s.forEach(e=>{const t=e.id||`${e.type}-${e.timestamp}-${Math.random()}`;this.processedEventIds.add(t),this.processEvent(e)})),this.events=[...e],this.renderTreeDebounced(),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`);for(const[s,n]of e.sessions.entries())if(!this.sessions.has(s)){const e={id:s,timestamp:new Date(n.lastActivity||n.startTime||new Date),expanded:this.expandedSessions.has(s)||!0,agents:new Map,todos:[],userInstructions:[],tools:[],toolsMap:new Map,status:"active",currentTodoTool:null,working_directory:n.working_directory,git_branch:n.git_branch,eventCount:n.eventCount};this.sessions.set(s,e)}const t=e.events.filter(e=>{const t=e.id||`${e.type}-${e.timestamp}-${Math.random()}`;return!this.processedEventIds.has(t)});t.length>0&&(console.log(`ActivityTree: Processing ${t.length} unprocessed events from initial load`),t.forEach(e=>{const t=e.id||`${e.type}-${e.timestamp}-${Math.random()}`;this.processedEventIds.add(t),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 o=this.sessions.get(n);switch(s){case"Start":this.currentSession=o;break;case"user_prompt":this.processUserInstruction(e,o);break;case"TodoWrite":break;case"SubagentStart":this.processSubagentStart(e,o);break;case"SubagentStop":this.processSubagentStop(e,o);break;case"PreToolUse":this.processToolUse(e,o);break;case"PostToolUse":this.updateToolStatus(e,o,"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"};if(t.agents.size>0){console.log("ActivityTree: New user prompt detected, collapsing previous agents");for(let e of t.agents.values())"active"===e.status&&(e.status="completed"),this.expandedAgents.delete(e.id)}t.currentActiveAgent=null,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.currentTodos=s.map(t=>({content:t.content,activeForm:t.activeForm,status:t.status,timestamp:e.timestamp}));let n=t.currentActiveAgent;if(!n){const e=this.getAllAgents(t).filter(e=>"active"===e.status||"in_progress"===e.status).sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));if(e.length>0)n=e[0];else{const e=this.getAllAgents(t),s=e.find(e=>e.isPM);s?n=s:e.length>0&&(n=e[0])}}if(n){n.todoWritesMap||(n.todoWritesMap=new Map),n.todoWrites||(n.todoWrites=[]);const t=n.todoWritesMap.get("TodoWrite");if(t)t.todos=s,t.timestamp=e.timestamp,t.updateCount=(t.updateCount||1)+1;else{const t={id:`todowrite-${n.id}-${Date.now()}`,name:"TodoWrite",type:"todowrite",icon:"📝",timestamp:e.timestamp,status:"completed",todos:s,params:{todos:s},updateCount:1};n.todoWritesMap.set("TodoWrite",t),n.todoWrites=[t]}n.currentTodos=s}else{t.todoWrites||(t.todoWrites=[]),t.todoWritesMap||(t.todoWritesMap=new Map);const n=t.todoWritesMap.get("TodoWrite");if(n)n.todos=s,n.timestamp=e.timestamp,n.updateCount=(n.updateCount||1)+1;else{const n={id:`todowrite-session-${Date.now()}`,name:"TodoWrite",type:"todowrite",icon:"📝",timestamp:e.timestamp,status:"completed",todos:s,updateCount:1};t.todoWritesMap.set("TodoWrite",n),t.todoWrites=[n]}}}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,o=e.parent_agent||e.data?.parent_agent,i=`${s}-${n||"no-session"}`;let a=null;let r;if(a=this.getAllAgents(t).find(e=>e.name===s&&e.sessionId===n&&"active"===e.status),a)r=a,r.timestamp=e.timestamp,r.instanceCount=(r.instanceCount||1)+1,this.expandedAgents.add(r.id);else{if(r={id:`agent-${i}-${Date.now()}`,name:s,type:"agent",icon:this.getAgentIcon(s),timestamp:e.timestamp,status:"active",tools:[],subagents:new Map,sessionId:n,parentAgent:o,isPM:"pm"===s.toLowerCase()||s.toLowerCase().includes("project manager"),instanceCount:1,toolsMap:new Map},o){let e=null;for(let[s,n]of t.agents.entries())if(n.sessionId===o||n.name===o){e=n;break}e?(e.subagents||(e.subagents=new Map),e.subagents.set(r.id,r)):t.agents.set(r.id,r)}else t.agents.set(r.id,r);this.expandedAgents.add(r.id)}t.currentActiveAgent=r}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||{},o=e.session_id||e.data?.session_id;let i=t.currentActiveAgent;if(!i){const e=this.getAllAgents(t);i=e.find(e=>e.sessionId===o)||e.find(e=>"active"===e.status)||e[0]}if(i){i.toolsMap||(i.toolsMap=new Map),i.tools||(i.tools=[]);const t=this.getToolKey(s,n);let o=i.toolsMap.get(t);if(o)o.params=n,o.timestamp=e.timestamp,o.status="in_progress",o.eventId=e.id,o.callCount=(o.callCount||1)+1,i.currentTool=o;else{const o={id:`tool-${i.id}-${s}-${Date.now()}`,name:s,type:"tool",icon:this.getToolIcon(s),timestamp:e.timestamp,status:"in_progress",params:n,eventId:e.id,callCount:1,createdAt:e.timestamp};"Task"===s&&n.subagent_type&&(o.isSubagentTask=!0,o.subagentType=n.subagent_type),i.toolsMap.set(t,o),"TodoWrite"===s?i.tools.unshift(o):i.tools.push(o),i.currentTool=o}}else{t.tools||(t.tools=[]),t.toolsMap||(t.toolsMap=new Map);const o=this.getToolKey(s,n);let i=t.toolsMap.get(o);if(i)i.params=n,i.timestamp=e.timestamp,i.status="in_progress",i.eventId=e.id,i.callCount=(i.callCount||1)+1,t.currentTool=i;else{const i={id:`tool-session-${s}-${Date.now()}`,name:s,type:"tool",icon:this.getToolIcon(s),timestamp:e.timestamp,status:"in_progress",params:n,eventId:e.id,callCount:1,createdAt:e.timestamp};t.toolsMap.set(o,i),"TodoWrite"===s?t.tools.unshift(i):t.tools.push(i),t.currentTool=i}}}getToolKey(e,t){if("TodoWrite"===e)return"TodoWrite";let s=e;return"Edit"!==e&&"Write"!==e&&"Read"!==e||t.file_path&&(s+=`-${t.file_path}`),"Grep"!==e&&"Glob"!==e||!t.pattern||(s+=`-${t.pattern.substring(0,20)}`),s}updateToolStatus(e,t,s){const n=e.tool_name||e.data?.tool_name||e.tool||"unknown",o=e.tool_parameters||e.data?.tool_parameters||e.parameters||e.data?.parameters||{},i=e.session_id||e.data?.session_id,a=this.getToolKey(n,o);let r=t.currentActiveAgent;if(!r){const e=this.getAllAgents(t);r=e.find(e=>e.sessionId===i)||e.find(e=>"active"===e.status)}if(r&&r.toolsMap){const t=r.toolsMap.get(a);if(t)return t.status=s,t.completedAt=e.timestamp,(e.data?.result||e.result)&&(t.result=e.data?.result||e.result),void(e.data?.duration_ms&&(t.duration=e.data.duration_ms))}if(t.toolsMap){const n=t.toolsMap.get(a);if(n)return n.status=s,n.completedAt=e.timestamp,(e.data?.result||e.result)&&(n.result=e.data?.result||e.result),void(e.data?.duration_ms&&(n.duration=e.data.duration_ms))}console.log(`ActivityTree: Could not find tool to update status for ${n} with key ${a} (event ${e.id})`)}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 o=t?"▼":"▶",i=this.getAllAgents(e).length,a=e.currentTodos?e.currentTodos.length:0,r=e.userInstructions?e.userInstructions.length:0;return console.log(`ActivityTree: Rendering session ${e.id}: ${i} agents, ${r} instructions, ${a} todos at ${s}`),n.innerHTML=`\n <div class="tree-node-content" onclick="window.activityTreeInstance.toggleSession('${e.id}')">\n <span class="tree-expand-icon">${o}</span>\n <span class="tree-icon">🎯</span>\n <span class="tree-label">PM Session</span>\n <span class="tree-meta">${s} • ${i} agent(s) • ${r} instruction(s) • ${a} 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.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),o=n?"▼":"▶";let i=0,a=0;e.forEach(e=>{"completed"===e.status?i++:"in_progress"===e.status&&a++});let r="";r=a>0?`${a} in progress, ${i} completed`:i===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();">${o}</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}`,o="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(o)}</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),o=e.tools&&e.tools.length>0,i=e.subagents&&e.subagents.size>0,a=o||i,r=a?n?"▼":"▶":"",l=this.selectedItem&&"agent"===this.selectedItem.type&&this.selectedItem.data.id===e.id?"selected":"",c=e.instanceCount>1?` (${e.instanceCount}x)`:"";let d="";if(!n&&a){const t=[];if(e.currentTodos&&e.currentTodos.length>0){const s=e.currentTodos.find(e=>"in_progress"===e.status);s&&t.push(`📝 ${s.activeForm||s.content}`)}e.currentTool&&t.push(`${e.currentTool.icon} ${e.currentTool.name}`),t.length>0&&(d=` • ${t.join(" • ")}`)}let p=`\n <div class="tree-node agent ${s} ${l}" data-level="${t}">\n <div class="tree-node-content">\n ${r?`<span class="tree-expand-icon" onclick="window.activityTreeInstance.toggleAgent('${e.id}'); event.stopPropagation();">${r}</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}${c}${d}</span>\n <span class="tree-status ${s}">${e.status}</span>\n </div>\n `;if(a&&n){if(p+='<div class="tree-children">',o)for(let s of e.tools)p+=this.renderToolElement(s,t+1);if(i){const s=Array.from(e.subagents.values());for(let e of s)p+=this.renderAgentElement(e,t+1)}p+="</div>"}return p+="</div>",p}renderToolElement(e,t){const s=`status-${e.status}`,n=this.getToolParams(e),o=this.selectedItem&&"tool"===this.selectedItem.type&&this.selectedItem.data.id===e.id?"selected":"",i=this.getToolStatusIcon(e.status),a=this.getToolStatusLabel(e.status),r=e.callCount>1?` (${e.callCount} calls)`:"";return`\n <div class="tree-node tool ${s} ${o}" 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-status-icon">${i}</span>\n <span class="tree-label clickable" onclick="window.activityTreeInstance.selectItem(${this.escapeJson(e)}, 'tool', event)">${e.name}${r}</span>\n <span class="tree-params">${n}</span>\n <span class="tree-status ${s}">${a}</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:"🏗️","project manager":"📊"}[e.toLowerCase()]||"🤖"}getAllAgents(e){const t=[],s=e=>{if(e)for(let n of e.values())t.push(n),n.subagents&&n.subagents.size>0&&s(n.subagents)};return s(e.agents),t}renderTodoWriteElement(e,t){const s=e.id,n=this.expandedTools.has(s),o=n?"▼":"▶",i=e.todos||[];let a=0,r=0;i.forEach(e=>{"completed"===e.status?a++:"in_progress"===e.status&&r++});const l=i.find(e=>"in_progress"===e.status),c=l?` • 🔄 ${l.activeForm||l.content}`:"";let d="";d=r>0?`${r} in progress, ${a}/${i.length} done`:a===i.length&&i.length>0?`All ${i.length} completed ✅`:`${a}/${i.length} done`;let p=`\n <div class="tree-node todowrite ${l?"has-active":""}" data-level="${t}">\n <div class="tree-node-content">\n <span class="tree-expand-icon" onclick="window.activityTreeInstance.toggleTodoWrite('${s}'); event.stopPropagation();">${o}</span>\n <span class="tree-icon">📝</span>\n <span class="tree-label">TodoWrite${e.updateCount>1?` (${e.updateCount} updates)`:""}${n?"":c}</span>\n <span class="tree-params">${d}</span>\n <span class="tree-status status-active">todos</span>\n </div>\n `;if(n&&i.length>0){p+='<div class="tree-children">';for(let e of i){const s=this.getCheckboxIcon(e.status),n=`status-${e.status}`,o="in_progress"===e.status?e.activeForm:e.content;p+=`\n <div class="tree-node todo-item ${n} ${e===l?"current-active":""}" data-level="${t+1}">\n <div class="tree-node-content">\n <span class="tree-expand-icon"></span>\n <span class="tree-icon">${s}</span>\n <span class="tree-label">${this.escapeHtml(o)}</span>\n <span class="tree-status ${n}">${e.status.replace("_"," ")}</span>\n </div>\n </div>\n `}p+="</div>"}return p+="</div>",p}toggleTodoWrite(e){this.expandedTools.has(e)?this.expandedTools.delete(e):this.expandedTools.add(e),this.renderTree()}getToolIcon(e){return{read:"👁️",write:"✍️",edit:"✏️",bash:"💻",webfetch:"🌐",grep:"🔍",glob:"📂",todowrite:"📝"}[e.toLowerCase()]||"🔧"}getToolStatusIcon(e){return{in_progress:"⏳",completed:"✅",failed:"❌",error:"❌",pending:"⏸️",active:"🔄"}[e]||"❓"}getToolStatusLabel(e){return{in_progress:"in progress",completed:"completed",failed:"failed",error:"error",pending:"pending",active:"active"}[e]||e}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"),o=document.getElementById("active-count"),i=document.getElementById("tree-depth");n&&(n.textContent=e),o&&(o.textContent=t),i&&(i.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()}renderPinnedTodosElement(e,t){const s=`pinned-todos-${Date.now()}`,n=!1!==this.expandedTools.has(s),o=n?"▼":"▶",i=e.todos||[];let a=0,r=0;i.forEach(e=>{"completed"===e.status?a++:"in_progress"===e.status&&r++});let l="";l=r>0?`${r} in progress, ${a} completed`:a===i.length&&i.length>0?`All ${i.length} completed`:`${i.length} todo(s)`;let c=`\n <div class="tree-node pinned-todos" data-level="${t}">\n <div class="tree-node-content">\n <span class="tree-expand-icon" onclick="window.activityTreeInstance.toggleTodoChecklist('${s}'); event.stopPropagation();">${o}</span>\n <span class="tree-icon">📌</span>\n <span class="tree-label">Pinned TODOs</span>\n <span class="tree-params">${l}</span>\n <span class="tree-status status-active">pinned</span>\n </div>\n `;if(n){c+='<div class="tree-children">';for(let e of i){const s=this.getCheckboxIcon(e.status),n=`status-${e.status}`,o="in_progress"===e.status?e.activeForm:e.content;c+=`\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">${s}</span>\n <span class="tree-label">${this.escapeHtml(o)}</span>\n <span class="tree-status ${n}">${e.status.replace("_"," ")}</span>\n </div>\n </div>\n `}c+="</div>"}return c+="</div>",c}selectItem(e,t,s){s&&s.stopPropagation(),this.selectedItem={data:e,type:t},this.displayItemData(e,t),this.renderTree()}displayItemData(t,s){this.unifiedViewer||(this.unifiedViewer=new e("module-data-content")),this.unifiedViewer.display(t,s);const n=document.querySelector(".module-data-header h5");if(n){const e={agent:"🤖",tool:"🔧",instruction:"💬",session:"🎯",todo:"📝"}[s]||"📊",o=t.name||t.agentName||t.tool_name||"Item";n.textContent=`${e} ${s}: ${o}`}}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,"&apos;").replace(/"/g,"&quot;")}}window.ActivityTree=t;const s=()=>{let e=null;const s=()=>{e||(console.log("Creating new Activity Tree instance..."),e=new t,window.activityTreeInstance=e,window.activityTree=()=>e),setTimeout(()=>{console.log("Attempting to initialize Activity Tree visualization..."),e.initialize()},100)};document.querySelectorAll(".tab-button").forEach(t=>{t.addEventListener("click",t=>{"activity"===t.target.getAttribute("data-tab")&&(console.log("Activity tab button clicked, initializing tree..."),s(),e&&setTimeout(()=>{e.renderWhenVisible(),e.forceShow()},150))})}),document.addEventListener("tabChanged",t=>{t.detail&&"activity"===t.detail.newTab&&(console.log("Tab changed to activity, initializing tree..."),s(),e&&setTimeout(()=>{e.renderWhenVisible(),e.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 o=document.getElementById("activity-tab");o&&o.classList.contains("active")&&(console.log("Activity panel is active on load, initializing tree..."),e||s())};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",s):s();
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,this.bulkLoadMode=!1,this.expandedPaths=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 o=document.getElementById("code-collapse-all");o&&o.addEventListener("click",()=>this.collapseAll());const s=document.getElementById("code-reset-zoom");s&&s.addEventListener("click",()=>this.resetZoom());const a=document.getElementById("code-toggle-legend");a&&a.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(),this.addTreeControls(),this.addBreadcrumb(),!t||!t.node())return void console.error("Code tree container not found");const e=t.node(),i=e.clientWidth||960,o=e.clientHeight||600;this.width=i-this.margin.left-this.margin.right,this.height=o-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",o);const s=i/2,a=o/2;this.isRadialLayout?this.treeGroup=this.svg.append("g").attr("transform",`translate(${s},${a})`):this.treeGroup=this.svg.append("g").attr("transform",`translate(${this.margin.left+100},${a})`),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,o=i>5?2:i>3?1.5:1,s=1+.2*t.depth;return e*o/(t.depth||1)*s}return 4/(t.depth||1)}):this.treeLayout=d3.tree().nodeSize([30,200]).separation((t,e)=>t.parent==e.parent?1:1.5),this.zoom=null,console.log("[CodeTree] All zoom and pan behavior disabled - tree is now completely stationary"),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 o=document.getElementById("ignore-patterns")?.value||"",s={path:t,depth:"top_level",languages:i,ignore_patterns:o,request_id:`discover_${Date.now()}`};this.socket&&this.socket.emit("code:discover:top_level",s),this.updateStats()}analyzeCode(){this.analyzing||this.autoDiscoverRootLevel()}cancelAnalysis(){this.analyzing=!1,this.hideLoading(),this.socket&&this.socket.emit("code:analysis:cancel")}addTreeControls(){const t=d3.select("#code-tree-container");t.select(".tree-controls-toolbar").remove();const e=t.append("div").attr("class","tree-controls-toolbar");e.append("button").attr("class","tree-control-btn").attr("title","Expand all loaded directories").text("⊞").on("click",()=>this.expandAll()),e.append("button").attr("class","tree-control-btn").attr("title","Collapse all directories").text("⊟").on("click",()=>this.collapseAll()),e.append("button").attr("class","tree-control-btn").attr("id","bulk-load-toggle").attr("title","Toggle bulk loading (load 2 levels at once)").text("↕").on("click",()=>this.toggleBulkLoad()),e.append("button").attr("class","tree-control-btn").attr("title","Toggle between radial and linear layouts").text("◎").on("click",()=>this.toggleLayout()),e.append("input").attr("class","tree-control-btn").attr("type","text").attr("placeholder","Search...").attr("title","Search for files and directories").style("width","120px").style("text-align","left").on("input",t=>this.searchTree(t.target.value)).on("keydown",t=>{"Escape"===t.key&&(t.target.value="",this.searchTree(""))})}addBreadcrumb(){const t=d3.select("#code-tree-container");t.select(".tree-breadcrumb").remove();t.append("div").attr("class","tree-breadcrumb").append("div").attr("class","breadcrumb-path").attr("id","tree-breadcrumb-path"),this.updateBreadcrumbPath("/")}updateBreadcrumbPath(t){const e=d3.select("#tree-breadcrumb-path");e.selectAll("*").remove();const i=this.getWorkingDirectory();if(!i||"Loading..."===i||"Not selected"===i)return void e.text("No project selected");const o="/"===t?[i.split("/").pop()||"Root"]:t.split("/").filter(t=>t.length>0);o.forEach((t,i)=>{i>0&&e.append("span").attr("class","breadcrumb-separator").text("/"),e.append("span").attr("class",i===o.length-1?"breadcrumb-segment current":"breadcrumb-segment").text(t).on("click",()=>{if(i<o.length-1){const t=o.slice(0,i+1).join("/");this.navigateToPath(t)}})})}expandAll(){if(!this.root)return;const t=e=>{"directory"===e.data.type&&!0===e.data.loaded&&e._children&&(e.children=e._children,e._children=null,e.data.expanded=!0),e.children&&e.children.forEach(t)};t(this.root),this.update(this.root),this.showNotification("Expanded all loaded directories","success")}collapseAll(){if(!this.root)return;const t=e=>{"directory"===e.data.type&&e.children&&(e._children=e.children,e.children=null,e.data.expanded=!1),e._children&&e._children.forEach(t)};t(this.root),this.update(this.root),this.showNotification("Collapsed all directories","info")}toggleBulkLoad(){this.bulkLoadMode=!this.bulkLoadMode;const t=d3.select("#bulk-load-toggle");this.bulkLoadMode?(t.classed("active",!0),this.showNotification("Bulk load enabled - will load 2 levels deep","info")):(t.classed("active",!1),this.showNotification("Bulk load disabled - load 1 level at a time","info"))}navigateToPath(t){this.updateBreadcrumbPath(t),this.showNotification(`Navigating to: ${t}`,"info")}searchTree(t){if(!this.root||!this.treeGroup)return;const e=t.toLowerCase().trim();if(this.treeGroup.selectAll(".code-node").classed("search-match",!1),!e)return;const i=[],o=t=>{const s=(t.data.name||"").toLowerCase(),a=(t.data.path||"").toLowerCase();(s.includes(e)||a.includes(e))&&i.push(t),t.children&&t.children.forEach(o),t._children&&t._children.forEach(o)};o(this.root),i.length>0?(this.treeGroup.selectAll(".code-node").data(),i.forEach(t=>{this.treeGroup.selectAll(".code-node").filter(e=>e.data.path===t.data.path).classed("search-match",!0),this.expandPathToNode(t)}),this.showNotification(`Found ${i.length} matches`,"success")):this.showNotification("No matches found","info")}expandPathToNode(t){const e=[];let i=t.parent;for(;i&&i!==this.root;)e.unshift(i),i=i.parent;e.forEach(t=>{"directory"===t.data.type&&t._children&&(t.children=t._children,t._children=null,t.data.expanded=!0)}),e.length>0&&this.update(this.root)}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 o=document.createElement("div");o.className="analysis-event",o.style.borderLeftColor="warning"===e?"#f59e0b":"error"===e?"#ef4444":"#3b82f6";const s=(new Date).toLocaleTimeString();o.innerHTML=`<span style="color: #718096;">[${s}]</span> ${t}`,i.appendChild(o),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 o=this.findNodeByPath(e);if(o&&t.children){const i=this.findD3NodeByPath(e);if(i&&this.loadingNodes.has(e)&&(this.removeLoadingPulse(i),this.loadingNodes.delete(e),console.log("🎯 [SUBDIRECTORY LOADING] Successfully completed and removed from loading set:",e)),o.children=t.children.map(t=>{let i;if("."===e||""===e)i=t.name||t.path;else{const o=t.name||t.path;i=`${e}/${o}`}return{...t,path:i,loaded:"directory"!==t.type&&void 0,analyzed:"file"!==t.type&&void 0,expanded:!1,children:[]}}),o.loaded=!0,o.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("✅ [SUBDIRECTORY LOADING] Received directory discovery response:",{path:t.path,name:t.name,childrenCount:(t.children||[]).length,children:(t.children||[]).map(t=>({name:t.name,type:t.type})),workingDir:this.getWorkingDirectory(),fullEventData:t});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 o=this.findNodeByPath(e);if(o&&t.children){o.children=t.children.map(t=>{let i;if("."===e||""===e)i=t.name||t.path;else{const o=t.name||t.path;i=`${e}/${o}`}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}}),o.loaded=!0,o.expanded=!0;const i=this.findD3NodeByPath(e);if(i&&this.loadingNodes.has(e)&&(this.removeLoadingPulse(i),this.loadingNodes.delete(e),console.log("🎯 [SUBDIRECTORY LOADING] Successfully completed and removed from loading set (hierarchy update):",e)),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)}0===o.children.length?(this.updateBreadcrumb(`Empty directory: ${o.name}`,"info"),this.showNotification(`Directory "${o.name}" is empty`,"info")):(this.updateBreadcrumb(`Loaded ${o.children.length} items from ${o.name}`,"success"),this.showNotification(`Loaded ${o.children.length} items from "${o.name}"`,"success")),this.updateStats()}else if(o){if(o&&!t.children){console.warn("⚠️ [SUBDIRECTORY LOADING] Directory response has no children:",{path:t.path,searchPath:e,nodeExists:!!o,dataKeys:Object.keys(t),fullData:t});const i=t.path?t.path.split("/").filter(t=>t):[];if(1===i.length||t.forceAdd){const e={name:t.name||i[i.length-1]||"Unknown",path:t.path,type:"directory",children:[],loaded:!1,expanded:!1,stats:t.stats||{}};this.addNodeToTree(e,t.parent||""),this.updateBreadcrumb(`Discovered: ${t.path}`,"info")}}}else console.error("❌ [SUBDIRECTORY LOADING] Node not found for path:",{searchPath:e,originalPath:t.path,workingDir:this.getWorkingDirectory(),allTreePaths:this.getAllTreePaths(this.treeData)}),this.showNotification(`Could not find directory "${e}" in tree`,"error"),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):[],o=i.slice(0,-1).join("/"),s={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(s,o),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),this.loadingNodes.delete(t.path)),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 o="";if(t.parent_path)o=t.parent_path;else if(t.file_path)o=t.file_path;else if(i.path.includes("/")){const t=i.path.split("/");t.pop(),o=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,o),this.updateStats();const s=i.type.charAt(0).toUpperCase()+i.type.slice(1);this.updateBreadcrumb(`Found ${s}: ${i.name}`,"info")}onProgressUpdate(t){const e=t.progress||0,i=t.message||`Processing... ${e}%`;this.updateBreadcrumb(i,"info");const o=document.querySelector(".code-tree-progress");o&&(o.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 o=document.getElementById("code-tree-container");o&&(i.style.position="absolute",i.style.top="10px",i.style.right="10px",i.style.zIndex="1000",o.style.position&&"static"!==o.style.position||(o.style.position="relative"),o.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 o=i.children?.find(e=>e.path===t.path||e.name===t.name&&e.type===t.type);o?Object.assign(o,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,console.log("🔍 [SUBDIRECTORY LOADING] Starting search for path:",t)),e.path===t)return console.log("✅ [SUBDIRECTORY LOADING] Found node for path:",t),e;if(e.children)for(const i of e.children){const e=this.findNodeByPath(t,i);if(e)return e}return e.parent||e!==this.treeData||console.warn("❌ [SUBDIRECTORY LOADING] Path not found in tree:",t),null}logAllPaths(t,e=""){if(console.log(`${e}${t.path} (${t.name})`),t.children)for(const i of t.children)this.logAllPaths(i,e+" ")}getAllTreePaths(t){const e=[t.path];if(t.children)for(const i of t.children)e.push(...this.getAllTreePaths(i));return 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,o]of Object.entries(t)){const t=document.getElementById(i);t&&(t.textContent=o.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(),o=e.descendants().slice(1);this.isRadialLayout&&i.forEach(t=>{void 0===t.x0&&(t.x0=t.x,t.y0=t.y)});const s=this.treeGroup.selectAll("g.node").data(i,t=>t.id||(t.id=++this.nodeId)),a=s.enter().append("g").attr("class",t=>{let e=["node","code-node"];return"directory"===t.data.type?(e.push("directory"),!0===t.data.loaded&&t.children&&e.push("expanded"),"loading"===t.data.loaded&&e.push("loading"),t.data.children&&0===t.data.children.length&&e.push("empty")):"file"===t.data.type&&e.push("file"),e.join(" ")}).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));a.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",t=>"directory"===t.data.type?2:1.5).style("cursor","pointer").on("click",(t,e)=>this.onNodeClick(t,e)).on("mouseover",(t,e)=>this.showTooltip(t,e)).on("mouseout",()=>this.hideTooltip()),a.filter(t=>"directory"===t.data.type).append("text").attr("class","expand-icon").attr("x",0).attr("y",0).attr("text-anchor","middle").attr("dominant-baseline","central").text(t=>"loading"===t.data.loaded?"⟳":!0===t.data.loaded&&t.children?"▼":"▶").style("font-size","10px").style("pointer-events","none"),a.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)").on("click",(t,e)=>this.onNodeClick(t,e)).style("cursor","pointer"),a.filter(t=>"directory"!==t.data.type).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").on("click",(t,e)=>this.onNodeClick(t,e)).style("cursor","pointer"),a.filter(t=>"directory"===t.data.type&&t.data.children).append("text").attr("class","item-count-badge").attr("x",12).attr("y",-8).attr("text-anchor","middle").text(t=>{const e=t.data.children?t.data.children.length:0;return e>0?e:""}).style("font-size","9px").style("opacity",.7).on("click",(t,e)=>this.onNodeClick(t,e)).style("cursor","pointer");const n=a.merge(s);n.on("click",(t,e)=>this.onNodeClick(t,e)),n.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})`}),n.attr("class",t=>{let e=["node","code-node"];return"directory"===t.data.type?(e.push("directory"),!0===t.data.loaded&&t.children&&e.push("expanded"),"loading"===t.data.loaded&&e.push("loading"),t.data.children&&0===t.data.children.length&&e.push("empty")):"file"===t.data.type&&e.push("file"),e.join(" ")}),n.select("circle.node-circle").attr("r",t=>"directory"===t.data.type?10:8).style("fill",t=>this.getNodeColor(t)),n.select(".expand-icon").text(t=>"loading"===t.data.loaded?"⟳":!0===t.data.loaded&&t.children?"▼":"▶"),n.select(".item-count-badge").text(t=>{if("directory"!==t.data.type)return"";const e=t.data.children?t.data.children.length:0;return e>0?e:""}).style("stroke",t=>this.getNodeStrokeColor(t)).attr("cursor","pointer");const r=this.isRadialLayout;n.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=s.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(o,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){console.log("[CodeTree] centerOnNode called but disabled - no centering will occur")}centerOnNodeRadial(t){console.log("[CodeTree] centerOnNodeRadial called but disabled - no centering will occur")}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");e.classed("parent-context",!0),e.style("stroke","#10b981").style("stroke-width",3).style("opacity",.8)}onNodeClick(t,e){if(t)try{"function"==typeof t.stopPropagation&&t.stopPropagation()}catch(a){console.error("[CodeTree] ERROR calling stopPropagation:",a)}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{"function"==typeof this.highlightActiveNode?this.highlightActiveNode(e):console.error("[CodeTree] highlightActiveNode is not a function!")}catch(a){console.error("[CodeTree] ERROR during highlightActiveNode:",a,a.stack)}try{"function"==typeof this.showWithParent?this.showWithParent(e):console.error("[CodeTree] showWithParent is not a function!")}catch(a){console.error("[CodeTree] ERROR during showWithParent:",a,a.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(a){console.error("[CodeTree] ERROR during addLoadingPulse:",a,a.stack)}const i=[];document.querySelectorAll(".language-checkbox:checked").forEach(t=>{i.push(t.value)});const o=document.getElementById("ignore-patterns"),s=o?.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 o=this.ensureFullPath(e.data.path);setTimeout(()=>{this.socket&&(this.socket.emit("code:analyze:file",{path:o}),this.updateBreadcrumb(`Analyzing ${e.data.name}...`,"info"),this.showNotification(`Analyzing: ${e.data.name}`,"info"))},100)}else{if(this.loadingNodes.has(e.data.path))return void this.showNotification(`Already loading: ${e.data.name}`,"warning");e.data.loaded="loading",this.loadingNodes.add(e.data.path);const t=this.ensureFullPath(e.data.path);console.log("🚀 [SUBDIRECTORY LOADING] Attempting to load:",{originalPath:e.data.path,fullPath:t,nodeType:e.data.type,loaded:e.data.loaded,hasSocket:!!this.socket,workingDir:this.getWorkingDirectory()}),setTimeout(()=>{this.socket?(console.log("📡 [SUBDIRECTORY LOADING] Emitting WebSocket request:",{event:"code:discover:directory",data:{path:t,depth:this.bulkLoadMode?2:1,languages:i,ignore_patterns:s}}),this.socket.emit("code:discover:directory",{path:t,depth:this.bulkLoadMode?2:1,languages:i,ignore_patterns:s}),this.updateBreadcrumb(`Loading ${e.data.name}...`,"info"),this.showNotification(`Loading directory: ${e.data.name}`,"info")):(console.error("❌ [SUBDIRECTORY LOADING] No WebSocket connection available!"),this.showNotification("Cannot load directory: No connection","error"))},100)}this.selectedNode=e;try{this.highlightNode(e)}catch(a){console.error("[CodeTree] ERROR during highlightNode:",a)}}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,o={root:"#6B7280",directory:"#3B82F6",file:"#10B981",module:"#8B5CF6",class:"#F59E0B",function:"#EF4444",method:"#EC4899"}[e]||"#6B7280";return i>10?d3.color(o).darker(.5):i>5?d3.color(o).darker(.25):o}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(){console.log("[CodeTree] resetZoom called but disabled - no zoom reset will occur"),this.showNotification("Zoom reset disabled - tree remains stationary","info")}focusOnNode(t){console.log("[CodeTree] focusOnNode called but disabled - no focusing will occur")}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 o=e.querySelector("h3");o&&(o.style.cssText="margin: 16px 0; color: #333; font-size: 20px;");const s=e.querySelector("p");s&&(s.style.cssText="margin: 16px 0; color: #666; font-size: 14px;");const a=e.querySelector("button");a&&(a.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 ",a.addEventListener("mouseenter",()=>{a.style.background="#2563eb"}),a.addEventListener("mouseleave",()=>{a.style.background="#3b82f6"}),a.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),o=document.createElement("a");o.href=i,o.download=`code-tree-${Date.now()}.json`,o.click(),URL.revokeObjectURL(i),this.showNotification("Tree exported successfully","success")}updateActivityTicker(t,e="info"){const i=document.getElementById("breadcrumb-content");if(i){const o="info"===e&&t.includes("...")?"⟳ ":"";i.innerHTML=`${o}${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