claude-mpm 4.1.24__tar.gz → 4.1.25__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 (627) hide show
  1. claude_mpm-4.1.25/BUILD_NUMBER +1 -0
  2. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/PKG-INFO +1 -1
  3. claude_mpm-4.1.25/VERSION +1 -0
  4. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/pyproject.toml +2 -2
  5. claude_mpm-4.1.25/src/claude_mpm/VERSION +1 -0
  6. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  7. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  8. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
  9. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
  10. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/built/dashboard.js +2 -0
  11. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  12. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  13. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  14. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  15. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
  16. claude_mpm-4.1.25/src/claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  17. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/activity-tree.js +4 -2
  18. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/event-processor.js +0 -107
  19. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/module-viewer.js +21 -198
  20. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/unified-data-viewer.js +104 -11
  21. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/dashboard.js +22 -428
  22. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/tools/code_tree_analyzer.py +3 -1
  23. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm.egg-info/PKG-INFO +1 -1
  24. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm.egg-info/SOURCES.txt +2 -1
  25. claude_mpm-4.1.24/BUILD_NUMBER +0 -1
  26. claude_mpm-4.1.24/VERSION +0 -1
  27. claude_mpm-4.1.24/src/claude_mpm/VERSION +0 -1
  28. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  29. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  30. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  31. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/built/dashboard.js +0 -2
  32. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/dist/chunks/unified-data-viewer.B7wmm2bD.js +0 -2
  33. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  34. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  35. claude_mpm-4.1.24/src/claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  36. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/CLAUDE.md +0 -0
  37. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/LICENSE +0 -0
  38. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/MANIFEST.in +0 -0
  39. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/README.md +0 -0
  40. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/scripts/ticket +0 -0
  41. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/setup.cfg +0 -0
  42. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/BUILD_NUMBER +0 -0
  43. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/__init__.py +0 -0
  44. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/__main__.py +0 -0
  45. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -0
  46. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/BASE_PM.md +0 -0
  47. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/INSTRUCTIONS.md +0 -0
  48. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/MEMORY.md +0 -0
  49. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/OUTPUT_STYLE.md +0 -0
  50. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/WORKFLOW.md +0 -0
  51. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/__init__.py +0 -0
  52. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/agent-template.yaml +0 -0
  53. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/agent_loader.py +0 -0
  54. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/agent_loader_integration.py +0 -0
  55. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/agents_metadata.py +0 -0
  56. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/async_agent_loader.py +0 -0
  57. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/base_agent.json +0 -0
  58. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/base_agent_loader.py +0 -0
  59. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/frontmatter_validator.py +0 -0
  60. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/system_agent_config.py +0 -0
  61. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -0
  62. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -0
  63. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/__init__.py +0 -0
  64. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/agent-manager.json +0 -0
  65. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/agent-manager.md +0 -0
  66. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -0
  67. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/api_qa.json +0 -0
  68. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/code_analyzer.json +0 -0
  69. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/data_engineer.json +0 -0
  70. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/documentation.json +0 -0
  71. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/engineer.json +0 -0
  72. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/imagemagick.json +0 -0
  73. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -0
  74. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/memory_manager.json +0 -0
  75. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/ops.json +0 -0
  76. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/project_organizer.json +0 -0
  77. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/qa.json +0 -0
  78. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/refactoring_engineer.json +0 -0
  79. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/research.json +0 -0
  80. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/security.json +0 -0
  81. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/ticketing.json +0 -0
  82. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/vercel_ops_agent.json +0 -0
  83. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/version_control.json +0 -0
  84. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/web_qa.json +0 -0
  85. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/agents/templates/web_ui.json +0 -0
  86. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/__init__.py +0 -0
  87. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/__main__.py +0 -0
  88. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/__init__.py +0 -0
  89. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/agent_manager.py +0 -0
  90. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/agents.py +0 -0
  91. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/aggregate.py +0 -0
  92. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/analyze.py +0 -0
  93. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/analyze_code.py +0 -0
  94. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/cleanup.py +0 -0
  95. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/cleanup_orphaned_agents.py +0 -0
  96. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/config.py +0 -0
  97. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/configure.py +0 -0
  98. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/configure_tui.py +0 -0
  99. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/dashboard.py +0 -0
  100. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/debug.py +0 -0
  101. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/doctor.py +0 -0
  102. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/info.py +0 -0
  103. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp.py +0 -0
  104. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp_command_router.py +0 -0
  105. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp_config_commands.py +0 -0
  106. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp_install_commands.py +0 -0
  107. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp_pipx_config.py +0 -0
  108. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp_server_commands.py +0 -0
  109. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mcp_tool_commands.py +0 -0
  110. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/memory.py +0 -0
  111. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/monitor.py +0 -0
  112. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mpm_init.py +0 -0
  113. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/mpm_init_handler.py +0 -0
  114. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/run.py +0 -0
  115. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/socketio_monitor.py +0 -0
  116. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/commands/tickets.py +0 -0
  117. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parser.py +0 -0
  118. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/__init__.py +0 -0
  119. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/agent_manager_parser.py +0 -0
  120. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/agents_parser.py +0 -0
  121. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/analyze_code_parser.py +0 -0
  122. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/analyze_parser.py +0 -0
  123. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/base_parser.py +0 -0
  124. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/config_parser.py +0 -0
  125. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/configure_parser.py +0 -0
  126. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/dashboard_parser.py +0 -0
  127. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/debug_parser.py +0 -0
  128. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/mcp_parser.py +0 -0
  129. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/memory_parser.py +0 -0
  130. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/monitor_parser.py +0 -0
  131. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/mpm_init_parser.py +0 -0
  132. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/run_parser.py +0 -0
  133. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/parsers/tickets_parser.py +0 -0
  134. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/shared/__init__.py +0 -0
  135. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/shared/argument_patterns.py +0 -0
  136. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/shared/base_command.py +0 -0
  137. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/shared/error_handling.py +0 -0
  138. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/shared/output_formatters.py +0 -0
  139. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/startup_logging.py +0 -0
  140. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/ticket_cli.py +0 -0
  141. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli/utils.py +0 -0
  142. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli_module/__init__.py +0 -0
  143. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli_module/args.py +0 -0
  144. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli_module/commands.py +0 -0
  145. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/cli_module/migration_example.py +0 -0
  146. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/__init__.py +0 -0
  147. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-agents.md +0 -0
  148. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-config.md +0 -0
  149. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-doctor.md +0 -0
  150. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-help.md +0 -0
  151. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-init.md +0 -0
  152. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-status.md +0 -0
  153. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm-tickets.md +0 -0
  154. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/commands/mpm.md +0 -0
  155. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/config/__init__.py +0 -0
  156. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/config/agent_config.py +0 -0
  157. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/config/experimental_features.py +0 -0
  158. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/config/paths.py +0 -0
  159. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/config/socketio_config.py +0 -0
  160. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/constants.py +0 -0
  161. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/__init__.py +0 -0
  162. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/agent_name_normalizer.py +0 -0
  163. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/agent_registry.py +0 -0
  164. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/agent_session_manager.py +0 -0
  165. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/base_service.py +0 -0
  166. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/cache.py +0 -0
  167. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/claude_runner.py +0 -0
  168. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/config.py +0 -0
  169. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/config_aliases.py +0 -0
  170. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/config_constants.py +0 -0
  171. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/constants.py +0 -0
  172. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/container.py +0 -0
  173. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/exceptions.py +0 -0
  174. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/factories.py +0 -0
  175. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/framework_loader.py +0 -0
  176. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/hook_manager.py +0 -0
  177. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/hook_performance_config.py +0 -0
  178. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/injectable_service.py +0 -0
  179. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/instruction_reinforcement_hook.py +0 -0
  180. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/interactive_session.py +0 -0
  181. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/interfaces.py +0 -0
  182. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/lazy.py +0 -0
  183. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/log_manager.py +0 -0
  184. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/logger.py +0 -0
  185. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/logging_config.py +0 -0
  186. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/minimal_framework_loader.py +0 -0
  187. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/mixins.py +0 -0
  188. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/oneshot_session.py +0 -0
  189. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/optimized_agent_loader.py +0 -0
  190. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/optimized_startup.py +0 -0
  191. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/output_style_manager.py +0 -0
  192. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/pm_hook_interceptor.py +0 -0
  193. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/service_registry.py +0 -0
  194. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/session_manager.py +0 -0
  195. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/shared/__init__.py +0 -0
  196. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/shared/config_loader.py +0 -0
  197. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/shared/path_resolver.py +0 -0
  198. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/shared/singleton_manager.py +0 -0
  199. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/socketio_pool.py +0 -0
  200. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/tool_access_control.py +0 -0
  201. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/types.py +0 -0
  202. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/typing_utils.py +0 -0
  203. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/unified_agent_registry.py +0 -0
  204. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/unified_config.py +0 -0
  205. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/core/unified_paths.py +0 -0
  206. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -0
  207. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/__init__.py +0 -0
  208. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/analysis_runner.py +0 -0
  209. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/index.html +0 -0
  210. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/open_dashboard.py +0 -0
  211. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/agent-inference.js +0 -0
  212. {claude_mpm-4.1.24/src/claude_mpm/dashboard/static/dist → claude_mpm-4.1.25/src/claude_mpm/dashboard/static/built}/components/code-tree.js +0 -0
  213. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/code-viewer.js +0 -0
  214. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/event-processor.js +0 -0
  215. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/export-manager.js +0 -0
  216. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -0
  217. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -0
  218. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/hud-manager.js +0 -0
  219. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -0
  220. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/session-manager.js +0 -0
  221. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/socket-manager.js +0 -0
  222. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -0
  223. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/components/working-directory.js +0 -0
  224. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/built/socket-client.js +0 -0
  225. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/css/activity.css +0 -0
  226. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/css/code-tree.css +0 -0
  227. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/css/connection-status.css +0 -0
  228. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/css/dashboard.css +0 -0
  229. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -0
  230. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -0
  231. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/event-processor.js +0 -0
  232. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/export-manager.js +0 -0
  233. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -0
  234. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -0
  235. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -0
  236. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -0
  237. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/session-manager.js +0 -0
  238. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -0
  239. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -0
  240. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/components/working-directory.js +0 -0
  241. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/dist/socket-client.js +0 -0
  242. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -0
  243. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/agent-inference.js +0 -0
  244. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/build-tracker.js +0 -0
  245. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/code-tree.js +0 -0
  246. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/code-viewer.js +0 -0
  247. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/connection-debug.js +0 -0
  248. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/event-viewer.js +0 -0
  249. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/export-manager.js +0 -0
  250. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -0
  251. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -0
  252. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/hud-manager.js +0 -0
  253. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -0
  254. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/session-manager.js +0 -0
  255. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/socket-manager.js +0 -0
  256. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -0
  257. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/components/working-directory.js +0 -0
  258. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/connection-manager.js +0 -0
  259. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/extension-error-handler.js +0 -0
  260. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/static/js/socket-client.js +0 -0
  261. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/templates/index.html +0 -0
  262. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/dashboard/test_dashboard.html +0 -0
  263. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/experimental/__init__.py +0 -0
  264. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/experimental/cli_enhancements.py +0 -0
  265. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/generators/__init__.py +0 -0
  266. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/generators/agent_profile_generator.py +0 -0
  267. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/__init__.py +0 -0
  268. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/base_hook.py +0 -0
  269. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/__init__.py +0 -0
  270. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/connection_pool.py +0 -0
  271. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/event_handlers.py +0 -0
  272. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/hook_handler.py +0 -0
  273. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -0
  274. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -0
  275. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -0
  276. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/hook_wrapper.sh +0 -0
  277. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/installer.py +0 -0
  278. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/memory_integration.py +0 -0
  279. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/response_tracking.py +0 -0
  280. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/services/__init__.py +0 -0
  281. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/services/connection_manager.py +0 -0
  282. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +0 -0
  283. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +0 -0
  284. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/services/state_manager.py +0 -0
  285. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/services/subagent_processor.py +0 -0
  286. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/claude_hooks/tool_analysis.py +0 -0
  287. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/memory_integration_hook.py +0 -0
  288. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/tool_call_interceptor.py +0 -0
  289. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/hooks/validation_hooks.py +0 -0
  290. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/init.py +0 -0
  291. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/models/__init__.py +0 -0
  292. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/models/agent_definition.py +0 -0
  293. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/models/agent_session.py +0 -0
  294. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/schemas/__init__.py +0 -0
  295. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/__init__.py +0 -0
  296. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/claude-hook-handler.sh +0 -0
  297. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/mcp_server.py +0 -0
  298. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/mcp_wrapper.py +0 -0
  299. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/mpm_doctor.py +0 -0
  300. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/socketio_daemon.py +0 -0
  301. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/socketio_daemon_hardened.py +0 -0
  302. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/socketio_daemon_wrapper.py +0 -0
  303. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/socketio_server_manager.py +0 -0
  304. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/scripts/start_activity_logging.py +0 -0
  305. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/__init__.py +0 -0
  306. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agent_capabilities_service.py +0 -0
  307. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/__init__.py +0 -0
  308. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/agent_builder.py +0 -0
  309. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/__init__.py +0 -0
  310. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_config_provider.py +0 -0
  311. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_configuration_manager.py +0 -0
  312. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_definition_factory.py +0 -0
  313. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_deployment.py +0 -0
  314. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_discovery_service.py +0 -0
  315. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_environment_manager.py +0 -0
  316. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_filesystem_manager.py +0 -0
  317. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_format_converter.py +0 -0
  318. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +0 -0
  319. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +0 -0
  320. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -0
  321. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_metrics_collector.py +0 -0
  322. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_operation_service.py +0 -0
  323. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_record_service.py +0 -0
  324. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -0
  325. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_state_service.py +0 -0
  326. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_template_builder.py +0 -0
  327. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_validator.py +0 -0
  328. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_version_manager.py +0 -0
  329. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agent_versioning.py +0 -0
  330. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/agents_directory_resolver.py +0 -0
  331. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/async_agent_deployment.py +0 -0
  332. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/base_agent_locator.py +0 -0
  333. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/config/__init__.py +0 -0
  334. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/config/deployment_config.py +0 -0
  335. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/config/deployment_config_manager.py +0 -0
  336. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/deployment_config_loader.py +0 -0
  337. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/deployment_results_manager.py +0 -0
  338. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/deployment_type_detector.py +0 -0
  339. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/deployment_wrapper.py +0 -0
  340. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/facade/__init__.py +0 -0
  341. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +0 -0
  342. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -0
  343. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/facade/deployment_facade.py +0 -0
  344. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +0 -0
  345. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/interface_adapter.py +0 -0
  346. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/lifecycle_health_checker.py +0 -0
  347. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +0 -0
  348. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/multi_source_deployment_service.py +0 -0
  349. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/__init__.py +0 -0
  350. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +0 -0
  351. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +0 -0
  352. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +0 -0
  353. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +0 -0
  354. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +0 -0
  355. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -0
  356. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +0 -0
  357. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +0 -0
  358. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +0 -0
  359. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/processors/__init__.py +0 -0
  360. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +0 -0
  361. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +0 -0
  362. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/processors/agent_processor.py +0 -0
  363. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +0 -0
  364. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/results/__init__.py +0 -0
  365. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/results/deployment_metrics.py +0 -0
  366. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/results/deployment_result_builder.py +0 -0
  367. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/single_agent_deployer.py +0 -0
  368. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/strategies/__init__.py +0 -0
  369. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/strategies/base_strategy.py +0 -0
  370. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/strategies/project_strategy.py +0 -0
  371. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/strategies/strategy_selector.py +0 -0
  372. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/strategies/system_strategy.py +0 -0
  373. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/strategies/user_strategy.py +0 -0
  374. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/system_instructions_deployer.py +0 -0
  375. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/validation/__init__.py +0 -0
  376. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/validation/agent_validator.py +0 -0
  377. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/validation/deployment_validator.py +0 -0
  378. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/validation/template_validator.py +0 -0
  379. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/deployment/validation/validation_result.py +0 -0
  380. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/loading/__init__.py +0 -0
  381. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/loading/agent_profile_loader.py +0 -0
  382. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/loading/base_agent_manager.py +0 -0
  383. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/loading/framework_agent_loader.py +0 -0
  384. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/management/__init__.py +0 -0
  385. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/management/agent_capabilities_generator.py +0 -0
  386. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/management/agent_management_service.py +0 -0
  387. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/__init__.py +0 -0
  388. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/agent_memory_manager.py +0 -0
  389. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/agent_persistence_service.py +0 -0
  390. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/content_manager.py +0 -0
  391. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/memory_categorization_service.py +0 -0
  392. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/memory_file_service.py +0 -0
  393. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/memory_format_service.py +0 -0
  394. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/memory_limits_service.py +0 -0
  395. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/memory/template_generator.py +0 -0
  396. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/registry/__init__.py +0 -0
  397. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/registry/deployed_agent_discovery.py +0 -0
  398. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/agents/registry/modification_tracker.py +0 -0
  399. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/async_session_logger.py +0 -0
  400. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/claude_session_logger.py +0 -0
  401. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/__init__.py +0 -0
  402. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/agent_cleanup_service.py +0 -0
  403. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/agent_dependency_service.py +0 -0
  404. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/agent_listing_service.py +0 -0
  405. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/agent_output_formatter.py +0 -0
  406. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/agent_validation_service.py +0 -0
  407. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/dashboard_launcher.py +0 -0
  408. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/memory_crud_service.py +0 -0
  409. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/memory_output_formatter.py +0 -0
  410. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/session_manager.py +0 -0
  411. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/socketio_manager.py +0 -0
  412. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/cli/startup_checker.py +0 -0
  413. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/command_deployment_service.py +0 -0
  414. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/command_handler_service.py +0 -0
  415. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/communication/__init__.py +0 -0
  416. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/__init__.py +0 -0
  417. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/base.py +0 -0
  418. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/cache_manager.py +0 -0
  419. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/interfaces/__init__.py +0 -0
  420. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/interfaces/agent.py +0 -0
  421. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/interfaces/communication.py +0 -0
  422. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/interfaces/infrastructure.py +0 -0
  423. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/interfaces/service.py +0 -0
  424. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/interfaces.py +0 -0
  425. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/memory_manager.py +0 -0
  426. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/path_resolver.py +0 -0
  427. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/service_container.py +0 -0
  428. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/core/service_interfaces.py +0 -0
  429. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/__init__.py +0 -0
  430. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/__init__.py +0 -0
  431. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/agent_check.py +0 -0
  432. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/base_check.py +0 -0
  433. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -0
  434. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/common_issues_check.py +0 -0
  435. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/configuration_check.py +0 -0
  436. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/filesystem_check.py +0 -0
  437. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/installation_check.py +0 -0
  438. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/instructions_check.py +0 -0
  439. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/mcp_check.py +0 -0
  440. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/monitor_check.py +0 -0
  441. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/checks/startup_log_check.py +0 -0
  442. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/diagnostic_runner.py +0 -0
  443. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/doctor_reporter.py +0 -0
  444. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/diagnostics/models.py +0 -0
  445. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/event_aggregator.py +0 -0
  446. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/event_bus/__init__.py +0 -0
  447. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/event_bus/config.py +0 -0
  448. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/event_bus/direct_relay.py +0 -0
  449. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/event_bus/event_bus.py +0 -0
  450. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/event_bus/relay.py +0 -0
  451. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/__init__.py +0 -0
  452. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/consumers/__init__.py +0 -0
  453. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/consumers/dead_letter.py +0 -0
  454. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/consumers/logging.py +0 -0
  455. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/consumers/metrics.py +0 -0
  456. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/consumers/socketio.py +0 -0
  457. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/core.py +0 -0
  458. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/interfaces.py +0 -0
  459. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/producers/__init__.py +0 -0
  460. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/producers/hook.py +0 -0
  461. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/events/producers/system.py +0 -0
  462. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/exceptions.py +0 -0
  463. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/__init__.py +0 -0
  464. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/content_assembler.py +0 -0
  465. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/content_validator.py +0 -0
  466. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/deployment_manager.py +0 -0
  467. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -0
  468. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -0
  469. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +0 -0
  470. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +0 -0
  471. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +0 -0
  472. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +0 -0
  473. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +0 -0
  474. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/header.py +0 -0
  475. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +0 -0
  476. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +0 -0
  477. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +0 -0
  478. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +0 -0
  479. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +0 -0
  480. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/section_manager.py +0 -0
  481. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/framework_claude_md_generator/version_manager.py +0 -0
  482. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/hook_service.py +0 -0
  483. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/__init__.py +0 -0
  484. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/context_preservation.py +0 -0
  485. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/daemon_manager.py +0 -0
  486. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/logging.py +0 -0
  487. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/__init__.py +0 -0
  488. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/aggregator.py +0 -0
  489. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/base.py +0 -0
  490. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/legacy.py +0 -0
  491. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/network.py +0 -0
  492. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/process.py +0 -0
  493. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/resources.py +0 -0
  494. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring/service.py +0 -0
  495. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/infrastructure/monitoring.py +0 -0
  496. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/__init__.py +0 -0
  497. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/auto_configure.py +0 -0
  498. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/config/__init__.py +0 -0
  499. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/config/config_loader.py +0 -0
  500. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/config/config_schema.py +0 -0
  501. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/config/configuration.py +0 -0
  502. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/__init__.py +0 -0
  503. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/base.py +0 -0
  504. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/exceptions.py +0 -0
  505. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/interfaces.py +0 -0
  506. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/process_pool.py +0 -0
  507. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -0
  508. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -0
  509. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/main.py +0 -0
  510. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/registry/__init__.py +0 -0
  511. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -0
  512. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -0
  513. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/server/__init__.py +0 -0
  514. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -0
  515. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -0
  516. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -0
  517. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/__init__.py +0 -0
  518. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -0
  519. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -0
  520. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -0
  521. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -0
  522. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -0
  523. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -0
  524. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/__init__.py +0 -0
  525. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/builder.py +0 -0
  526. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/cache/__init__.py +0 -0
  527. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/cache/shared_prompt_cache.py +0 -0
  528. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/cache/simple_cache.py +0 -0
  529. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/indexed_memory.py +0 -0
  530. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/optimizer.py +0 -0
  531. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory/router.py +0 -0
  532. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/memory_hook_service.py +0 -0
  533. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/monitor_build_service.py +0 -0
  534. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/port_manager.py +0 -0
  535. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/__init__.py +0 -0
  536. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/analyzer.py +0 -0
  537. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/analyzer_refactored.py +0 -0
  538. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/analyzer_v2.py +0 -0
  539. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/architecture_analyzer.py +0 -0
  540. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/dependency_analyzer.py +0 -0
  541. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/language_analyzer.py +0 -0
  542. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/metrics_collector.py +0 -0
  543. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/project/registry.py +0 -0
  544. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/recovery_manager.py +0 -0
  545. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/response_tracker.py +0 -0
  546. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/runner_configuration_service.py +0 -0
  547. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/session_management_service.py +0 -0
  548. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/shared/__init__.py +0 -0
  549. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/shared/async_service_base.py +0 -0
  550. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/shared/config_service_base.py +0 -0
  551. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/shared/lifecycle_service_base.py +0 -0
  552. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/shared/manager_base.py +0 -0
  553. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/shared/service_factory.py +0 -0
  554. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/__init__.py +0 -0
  555. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/client_proxy.py +0 -0
  556. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/event_normalizer.py +0 -0
  557. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/__init__.py +0 -0
  558. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/base.py +0 -0
  559. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/code_analysis.py +0 -0
  560. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/connection.py +0 -0
  561. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/connection_handler.py +0 -0
  562. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/file.py +0 -0
  563. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/git.py +0 -0
  564. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/hook.py +0 -0
  565. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/memory.py +0 -0
  566. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/project.py +0 -0
  567. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/handlers/registry.py +0 -0
  568. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/migration_utils.py +0 -0
  569. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/server/__init__.py +0 -0
  570. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/server/broadcaster.py +0 -0
  571. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/server/connection_manager.py +0 -0
  572. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/server/core.py +0 -0
  573. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/server/eventbus_integration.py +0 -0
  574. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio/server/main.py +0 -0
  575. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio_client_manager.py +0 -0
  576. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/socketio_server.py +0 -0
  577. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/subprocess_launcher_service.py +0 -0
  578. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/system_instructions_service.py +0 -0
  579. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_manager.py +0 -0
  580. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_services/__init__.py +0 -0
  581. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_services/crud_service.py +0 -0
  582. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_services/formatter_service.py +0 -0
  583. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_services/search_service.py +0 -0
  584. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_services/validation_service.py +0 -0
  585. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/ticket_services/workflow_service.py +0 -0
  586. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/utility_service.py +0 -0
  587. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_control/__init__.py +0 -0
  588. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_control/branch_strategy.py +0 -0
  589. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_control/conflict_resolution.py +0 -0
  590. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_control/git_operations.py +0 -0
  591. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_control/semantic_versioning.py +0 -0
  592. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_control/version_parser.py +0 -0
  593. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/version_service.py +0 -0
  594. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/visualization/__init__.py +0 -0
  595. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/services/visualization/mermaid_generator.py +0 -0
  596. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/storage/__init__.py +0 -0
  597. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/storage/state_storage.py +0 -0
  598. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/ticket_wrapper.py +0 -0
  599. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/tools/__init__.py +0 -0
  600. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/tools/__main__.py +0 -0
  601. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/tools/code_tree_builder.py +0 -0
  602. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/tools/code_tree_events.py +0 -0
  603. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/tools/socketio_debug.py +0 -0
  604. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/__init__.py +0 -0
  605. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/agent_dependency_loader.py +0 -0
  606. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/config_manager.py +0 -0
  607. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/console.py +0 -0
  608. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/dependency_cache.py +0 -0
  609. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/dependency_manager.py +0 -0
  610. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/dependency_strategies.py +0 -0
  611. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/environment_context.py +0 -0
  612. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/error_handler.py +0 -0
  613. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/file_utils.py +0 -0
  614. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/framework_detection.py +0 -0
  615. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/import_migration_example.py +0 -0
  616. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/imports.py +0 -0
  617. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/path_operations.py +0 -0
  618. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/robust_installer.py +0 -0
  619. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/session_logging.py +0 -0
  620. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/utils/subprocess_utils.py +0 -0
  621. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/validation/__init__.py +0 -0
  622. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/validation/agent_validator.py +0 -0
  623. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm/validation/frontmatter_validator.py +0 -0
  624. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm.egg-info/dependency_links.txt +0 -0
  625. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm.egg-info/entry_points.txt +0 -0
  626. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm.egg-info/requires.txt +0 -0
  627. {claude_mpm-4.1.24 → claude_mpm-4.1.25}/src/claude_mpm.egg-info/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ 324
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.1.24
3
+ Version: 4.1.25
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.25
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-mpm"
7
- version = "4.1.24"
7
+ version = "4.1.25"
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.24"
251
+ version = "4.1.25"
252
252
  version_files = [
253
253
  "VERSION",
254
254
  "src/claude_mpm/VERSION",
@@ -0,0 +1 @@
1
+ 4.1.25
@@ -0,0 +1,2 @@
1
+ import{U as e}from"./unified-data-viewer.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
@@ -1,2 +1,2 @@
1
- class e{constructor(e,t){this.container=document.getElementById(e),this.socketClient=t,this.events=[],this.filteredEvents=[],this.selectedEventIndex=-1,this.filteredEventElements=[],this.autoScroll=!0,this.searchFilter="",this.typeFilter="",this.sessionFilter="",this.eventTypeCount={},this.availableEventTypes=new Set,this.errorCount=0,this.eventsThisMinute=0,this.lastMinute=(new Date).getMinutes(),this.init()}init(){this.setupEventHandlers(),this.setupKeyboardNavigation(),this.socketClient.onEventUpdate((e,t)=>{this.events=Array.isArray(e)?e:[],this.updateDisplay()})}setupEventHandlers(){const e=document.getElementById("events-search-input");e&&e.addEventListener("input",e=>{this.searchFilter=e.target.value.toLowerCase(),this.applyFilters()});const t=document.getElementById("events-type-filter");t&&t.addEventListener("change",e=>{this.typeFilter=e.target.value,this.applyFilters()})}setupKeyboardNavigation(){}handleArrowNavigation(e){if(0===this.filteredEventElements.length)return;let t=this.selectedEventIndex+e;t>=this.filteredEventElements.length?t=0:t<0&&(t=this.filteredEventElements.length-1),this.showEventDetails(t)}applyFilters(){this.events&&Array.isArray(this.events)||(console.warn("EventViewer: events array is not initialized, using empty array"),this.events=[]),this.filteredEvents=this.events.filter(e=>{if(this.searchFilter){if(![e.type||"",e.subtype||"",JSON.stringify(e.data||{})].join(" ").toLowerCase().includes(this.searchFilter))return!1}if(this.typeFilter){const t=e.type&&""!==e.type.trim()?e.type:"";if((e.subtype&&t?`${t}.${e.subtype}`:t)!==this.typeFilter)return!1}return!(this.sessionFilter&&""!==this.sessionFilter&&(!e.data||e.data.session_id!==this.sessionFilter))}),this.renderEvents(),this.updateMetrics()}updateEventTypeDropdown(){const e=document.getElementById("events-type-filter");if(!e)return;const t=new Set;this.events&&Array.isArray(this.events)||(console.warn("EventViewer: events array is not initialized in updateEventTypeDropdown"),this.events=[]),this.events.forEach(e=>{if(e.type&&""!==e.type.trim()){const n=e.subtype?`${e.type}.${e.subtype}`:e.type;t.add(n)}});const n=Array.from(t).sort(),s=Array.from(this.availableEventTypes).sort();if(JSON.stringify(n)===JSON.stringify(s))return;this.availableEventTypes=t;const i=e.value;e.innerHTML='<option value="">All Events</option>';Array.from(t).sort().forEach(t=>{const n=document.createElement("option");n.value=t,n.textContent=t,e.appendChild(n)}),i&&t.has(i)?e.value=i:i&&!t.has(i)&&(e.value="",this.typeFilter="")}updateDisplay(){this.updateEventTypeDropdown(),this.applyFilters()}renderEvents(){const e=document.getElementById("events-list");if(!e)return;const t=e.scrollTop+e.clientHeight>=e.scrollHeight-10;if(0===this.filteredEvents.length)return e.innerHTML=`\n <div class="no-events">\n ${0===this.events.length?"Connect to Socket.IO server to see events...":"No events match current filters..."}\n </div>\n `,void(this.filteredEventElements=[]);const n=this.filteredEvents.map((e,t)=>{const n=new Date(e.timestamp).toLocaleTimeString();return`\n <div class="event-item single-row ${e.type?`event-${e.type}`:"event-default"} ${t===this.selectedEventIndex?"selected":""}"\n onclick="eventViewer.showEventDetails(${t})"\n data-index="${t}">\n <span class="event-single-row-content">\n <span class="event-content-main">${this.formatSingleRowEventContent(e)}</span>\n <span class="event-timestamp">${n}</span>\n </span>\n ${this.createInlineEditDiffViewer(e,t)}\n </div>\n `}).join("");e.innerHTML=n,this.filteredEventElements=Array.from(e.querySelectorAll(".event-item")),window.dashboard&&"events"===window.dashboard.currentTab&&window.dashboard.tabNavigation&&window.dashboard.tabNavigation.events&&(window.dashboard.tabNavigation.events.items=this.filteredEventElements),this.filteredEvents.length>0&&t&&this.autoScroll&&requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight})}formatEventType(e){return e.type&&e.subtype?e.type===e.subtype||"generic"===e.subtype?e.type:`${e.type}.${e.subtype}`:e.type?e.type:e.originalEventName?e.originalEventName:"unknown"}formatEventData(e){if(!e.data)return"No data";switch(e.type){case"session":return this.formatSessionEvent(e);case"claude":return this.formatClaudeEvent(e);case"agent":return this.formatAgentEvent(e);case"hook":return this.formatHookEvent(e);case"todo":return this.formatTodoEvent(e);case"memory":return this.formatMemoryEvent(e);case"log":return this.formatLogEvent(e);case"code":return this.formatCodeEvent(e);default:return this.formatGenericEvent(e)}}formatSessionEvent(e){const t=e.data;return"started"===e.subtype?`<strong>Session started:</strong> ${t.session_id||"Unknown"}`:"ended"===e.subtype?`<strong>Session ended:</strong> ${t.session_id||"Unknown"}`:`<strong>Session:</strong> ${JSON.stringify(t)}`}formatClaudeEvent(e){const t=e.data;if("request"===e.subtype){const e=t.prompt||t.message||"";return`<strong>Request:</strong> ${e.length>100?e.substring(0,100)+"...":e}`}if("response"===e.subtype){const e=t.response||t.content||"";return`<strong>Response:</strong> ${e.length>100?e.substring(0,100)+"...":e}`}return`<strong>Claude:</strong> ${JSON.stringify(t)}`}formatAgentEvent(e){const t=e.data;return"loaded"===e.subtype?`<strong>Agent loaded:</strong> ${t.agent_type||t.name||"Unknown"}`:"executed"===e.subtype?`<strong>Agent executed:</strong> ${t.agent_type||t.name||"Unknown"}`:`<strong>Agent:</strong> ${JSON.stringify(t)}`}formatHookEvent(e){const t=e.data,n=t.event_type||e.subtype||"unknown";switch(n){case"user_prompt":const s=t.prompt_text||t.prompt_preview||"";return`<strong>User Prompt:</strong> ${(s.length>80?s.substring(0,80)+"...":s)||"No prompt text"}`;case"pre_tool":const i=t.tool_name||"Unknown tool";return`<strong>Pre-Tool (${t.operation_type||"operation"}):</strong> ${i}`;case"post_tool":const o=t.tool_name||"Unknown tool";return`<strong>Post-Tool (${t.success?"success":t.status||"failed"}):</strong> ${o}${t.duration_ms?` (${t.duration_ms}ms)`:""}`;case"notification":return`<strong>Notification (${t.notification_type||"notification"}):</strong> ${t.message_preview||t.message||"No message"}`;case"stop":const r=t.reason||"unknown";return`<strong>Stop (${t.stop_type||"normal"}):</strong> ${r}`;case"subagent_start":const a=t.agent_type||t.agent||t.subagent_type||"Unknown",l=t.prompt||t.description||t.task||"No description",c=l.length>60?l.substring(0,60)+"...":l;return`<strong>Subagent Start (${this.formatAgentType(a)}):</strong> ${c}`;case"subagent_stop":const d=t.agent_type||t.agent||t.subagent_type||"Unknown",p=t.reason||t.stop_reason||"completed",g=this.formatAgentType(d),u=t.structured_response?.task_completed;return`<strong>Subagent Stop (${g})${void 0!==u?u?" ✓":" ✗":""}:</strong> ${p}`;default:const h=t.hook_name||t.name||t.event_type||"Unknown";return`<strong>Hook ${e.subtype||n}:</strong> ${h}`}}formatTodoEvent(e){const t=e.data;if(t.todos&&Array.isArray(t.todos)){const e=t.todos.length;return`<strong>Todo updated:</strong> ${e} item${1!==e?"s":""}`}return`<strong>Todo:</strong> ${JSON.stringify(t)}`}formatMemoryEvent(e){const t=e.data;return`<strong>Memory ${t.operation||"unknown"}:</strong> ${t.key||"Unknown key"}`}formatLogEvent(e){const t=e.data,n=t.level||"info",s=t.message||"",i=s.length>80?s.substring(0,80)+"...":s;return`<strong>[${n.toUpperCase()}]</strong> ${i}`}formatCodeEvent(e){const t=e.data||{};if("progress"===e.subtype){const e=t.message||"Processing...",n=t.percentage;return void 0!==n?`<strong>Progress:</strong> ${e} (${Math.round(n)}%)`:`<strong>Progress:</strong> ${e}`}if("analysis:queued"===e.subtype)return`<strong>Queued:</strong> Analysis for ${t.path||"Unknown path"}`;if("analysis:start"===e.subtype)return`<strong>Started:</strong> Analyzing ${t.path||"Unknown path"}`;if("analysis:complete"===e.subtype){return`<strong>Complete:</strong> Analysis finished${t.duration?` (${t.duration.toFixed(2)}s)`:""}`}if("analysis:error"===e.subtype)return`<strong>Error:</strong> ${t.message||"Analysis failed"}`;if("analysis:cancelled"===e.subtype)return`<strong>Cancelled:</strong> Analysis stopped for ${t.path||"Unknown path"}`;if("file:start"===e.subtype)return`<strong>File:</strong> Processing ${t.file||"Unknown file"}`;if("file:complete"===e.subtype){const e=void 0!==t.nodes_count?` (${t.nodes_count} nodes)`:"";return`<strong>File done:</strong> ${t.file||"Unknown file"}${e}`}if("node:found"===e.subtype)return`<strong>Node:</strong> Found ${t.node_type||"element"} "${t.name||"unnamed"}"`;if("error"===e.subtype)return`<strong>Error:</strong> ${t.error||"Unknown error"} in ${t.file||"file"}`;const n=JSON.stringify(t);return`<strong>Code:</strong> ${n.length>100?n.substring(0,100)+"...":n}`}formatGenericEvent(e){const t=e.data;return"string"==typeof t?t.length>100?t.substring(0,100)+"...":t:JSON.stringify(t)}formatAgentType(e){const t={research:"Research",architect:"Architect",engineer:"Engineer",qa:"QA",pm:"PM",project_manager:"PM",research_agent:"Research",architect_agent:"Architect",engineer_agent:"Engineer",qa_agent:"QA",unknown:"Unknown"},n=(e||"unknown").toLowerCase();if(t[n])return t[n];const s=e.match(/^(\w+)(?:_agent|Agent)?$/i);return s&&s[1]?s[1].charAt(0).toUpperCase()+s[1].slice(1).toLowerCase():e.charAt(0).toUpperCase()+e.slice(1)}formatSingleRowEventContent(e){const t=this.formatEventType(e),n=e.data||{},s=e.source&&"system"!==e.source?`[${e.source}] `:"";let i="";switch(e.type){case"hook":const t=e.tool_name||n.tool_name||"Unknown",s=e.subtype||"Unknown";if("pre_tool"===s||"post_tool"===s){const e=n.operation_type||"",o="post_tool"===s&&void 0!==n.success?n.success?"✓":"✗":"";i=`${t}${e?` (${e})`:""}${o?` ${o}`:""}`}else if("user_prompt"===s){const e=n.prompt_text||n.prompt_preview||"";i=(e.length>60?e.substring(0,60)+"...":e)||"No prompt text"}else if("subagent_start"===s){const e=n.agent_type||n.agent||n.subagent_type||"Unknown",t=this.formatAgentType(e),s=n.prompt||n.description||n.task||"",o=s.length>40?s.substring(0,40)+"...":s;i=o?`${t} - ${o}`:t}else if("subagent_stop"===s){const e=n.agent_type||n.agent||n.subagent_type||"Unknown",t=this.formatAgentType(e),s=n.reason||n.stop_reason||"completed",o=n.structured_response?.task_completed,r=void 0!==o?o?"✓":"✗":"";i=`${t}${r?" "+r:""} - ${s}`}else if("stop"===s){const e=n.reason||"completed";i=`${n.stop_type||"normal"} - ${e}`}else i=t;break;case"agent":const o=e.subagent_type||n.subagent_type||"PM",r=n.status||"";i=`${o}${r?` - ${r}`:""}`;break;case"todo":if(n.todos&&Array.isArray(n.todos)){i=`${n.todos.length} items (${n.todos.filter(e=>"completed"===e.status).length} completed, ${n.todos.filter(e=>"in_progress"===e.status).length} in progress)`}else i="Todo update";break;case"memory":i=`${n.operation||"unknown"}: ${n.key||"unknown"}${n.value?` = ${JSON.stringify(n.value).substring(0,30)}...`:""}`;break;case"session":i=`ID: ${n.session_id||"unknown"}`;break;case"claude":if("request"===e.subtype){const e=n.prompt||n.message||"";i=(e.length>60?e.substring(0,60)+"...":e)||"Empty request"}else if("response"===e.subtype){const e=n.response||n.content||"";i=(e.length>60?e.substring(0,60)+"...":e)||"Empty response"}else i=n.message||"Claude interaction";break;case"log":const a=n.level||"info",l=n.message||"",c=l.length>60?l.substring(0,60)+"...":l;i=`[${a.toUpperCase()}] ${c}`;break;case"test":i=n.test_name||n.name||"Test";break;default:if("string"==typeof n)i=n.length>60?n.substring(0,60)+"...":n;else if(n.message)i=n.message.length>60?n.message.substring(0,60)+"...":n.message;else if(n.name)i=n.name;else if(Object.keys(n).length>0){const e=Object.keys(n).find(e=>!["timestamp","id"].includes(e));if(e){const t=n[e];i=`${e}: ${"object"==typeof t?JSON.stringify(t).substring(0,40)+"...":t}`}}}const o=`${s}${t}`;return i?`${o} - ${i}`:o}getHookDisplayName(e,t){const n={pre_tool:"Pre-Tool",post_tool:"Post-Tool",user_prompt:"User-Prompt",stop:"Stop",subagent_start:"Subagent-Start",subagent_stop:"Subagent-Stop",notification:"Notification"};if(n[e])return n[e];return String(e||"unknown").replace(/_/g," ")}getEventCategory(e){const t=e.data||{},n=e.tool_name||t.tool_name||"";return["Read","Write","Edit","MultiEdit"].includes(n)?"file_operations":["Bash","grep","Glob"].includes(n)?"system_operations":"TodoWrite"===n?"task_management":"Task"===n||"subagent_start"===e.subtype||"subagent_stop"===e.subtype?"agent_delegation":"stop"===e.subtype?"session_control":"general"}showEventDetails(e){if(!this.filteredEvents||!Array.isArray(this.filteredEvents))return void console.warn("EventViewer: filteredEvents array is not initialized");if(e<0||e>=this.filteredEvents.length)return;this.selectedEventIndex=e;const t=this.filteredEvents[e];window.dashboard&&(window.dashboard.tabNavigation&&window.dashboard.tabNavigation.events&&(window.dashboard.tabNavigation.events.selectedIndex=e),window.dashboard.selectCard&&window.dashboard.selectCard("events",e,"event",t)),this.filteredEventElements.forEach((t,n)=>{t.classList.toggle("selected",n===e)}),document.dispatchEvent(new CustomEvent("eventSelected",{detail:{event:t,index:e}}));const n=this.filteredEventElements[e];n&&n.scrollIntoView({behavior:"smooth",block:"nearest"})}clearSelection(){this.selectedEventIndex=-1,this.filteredEventElements.forEach(e=>{e.classList.remove("selected")}),window.dashboard&&(window.dashboard.tabNavigation&&window.dashboard.tabNavigation.events&&(window.dashboard.tabNavigation.events.selectedIndex=-1),window.dashboard.clearCardSelection&&window.dashboard.clearCardSelection()),document.dispatchEvent(new CustomEvent("eventSelectionCleared"))}updateMetrics(){this.eventTypeCount={},this.errorCount=0,this.events&&Array.isArray(this.events)||(console.warn("EventViewer: events array is not initialized in updateMetrics"),this.events=[]),this.events.forEach(e=>{const t=e.type||"unknown";this.eventTypeCount[t]=(this.eventTypeCount[t]||0)+1,"log"===e.type&&e.data&&["error","critical"].includes(e.data.level)&&this.errorCount++});const e=(new Date).getMinutes();e!==this.lastMinute&&(this.lastMinute=e,this.eventsThisMinute=0);const t=new Date(Date.now()-6e4);this.eventsThisMinute=this.events.filter(e=>new Date(e.timestamp)>t).length,this.updateMetricsUI()}updateMetricsUI(){const e=document.getElementById("total-events"),t=document.getElementById("events-per-minute"),n=document.getElementById("unique-types"),s=document.getElementById("error-count");e&&(e.textContent=this.events.length),t&&(t.textContent=this.eventsThisMinute),n&&(n.textContent=Object.keys(this.eventTypeCount).length),s&&(s.textContent=this.errorCount)}exportEvents(){const e=JSON.stringify(this.filteredEvents,null,2),t=new Blob([e],{type:"application/json"}),n=URL.createObjectURL(t),s=document.createElement("a");s.href=n,s.download=`claude-mpm-events-${(new Date).toISOString().split("T")[0]}.json`,s.click(),URL.revokeObjectURL(n)}clearEvents(){this.socketClient.clearEvents(),this.selectedEventIndex=-1,this.updateDisplay()}setSessionFilter(e){this.sessionFilter=e,this.applyFilters()}getFilters(){return{search:this.searchFilter,type:this.typeFilter,session:this.sessionFilter}}getFilteredEvents(){return this.filteredEvents}getAllEvents(){return this.events}createInlineEditDiffViewer(e,t){const n=e.data||{},s=e.tool_name||n.tool_name||"";if(!["Edit","MultiEdit"].includes(s))return"";let i=[];if("Edit"===s){const t=e.tool_parameters||n.tool_parameters||{};t.old_string&&t.new_string&&i.push({old_string:t.old_string,new_string:t.new_string,file_path:t.file_path||"unknown"})}else if("MultiEdit"===s){const t=e.tool_parameters||n.tool_parameters||{};t.edits&&Array.isArray(t.edits)&&(i=t.edits.map(e=>({...e,file_path:t.file_path||"unknown"})))}if(0===i.length)return"";const o=`edit-diff-${t}`,r=i.length>1;let a="";return i.forEach((e,t)=>{const n=this.createDiffHtml(e.old_string,e.new_string);a+=`\n <div class="edit-diff-section">\n ${r?`<div class="edit-diff-header">Edit ${t+1}</div>`:""}\n <div class="diff-content">${n}</div>\n </div>\n `}),`\n <div class="inline-edit-diff-viewer">\n <div class="diff-toggle-header" onclick="eventViewer.toggleEditDiff('${o}', event)">\n <span class="diff-toggle-icon">📋</span>\n <span class="diff-toggle-text">Show ${r?i.length+" edits":"edit"}</span>\n <span class="diff-toggle-arrow">▼</span>\n </div>\n <div id="${o}" class="diff-content-container" style="display: none;">\n ${a}\n </div>\n </div>\n `}createDiffHtml(e,t){const n=e.split("\n"),s=t.split("\n");let i="",o=0,r=0;for(;o<n.length||r<s.length;){const e=o<n.length?n[o]:null,t=r<s.length?s[r]:null;null===e?(i+=`<div class="diff-line diff-added">+ ${this.escapeHtml(t)}</div>`,r++):null===t?(i+=`<div class="diff-line diff-removed">- ${this.escapeHtml(e)}</div>`,o++):e===t?(i+=`<div class="diff-line diff-unchanged"> ${this.escapeHtml(e)}</div>`,o++,r++):(i+=`<div class="diff-line diff-removed">- ${this.escapeHtml(e)}</div>`,i+=`<div class="diff-line diff-added">+ ${this.escapeHtml(t)}</div>`,o++,r++)}return`<div class="diff-container">${i}</div>`}toggleEditDiff(e,t){t.stopPropagation();const n=document.getElementById(e),s=t.currentTarget.querySelector(".diff-toggle-arrow");if(n){const e="none"!==n.style.display;n.style.display=e?"none":"block",s&&(s.textContent=e?"▼":"▲")}}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}}window.EventViewer=e;class t{constructor(e,t){this.eventViewer=e,this.agentInference=t,this.agentEvents=[],this.filteredAgentEvents=[],this.filteredToolEvents=[],this.filteredFileEvents=[],this.selectedSessionId=null,this.fileTrackingCache=new Map,this.trackingCheckTimeout=3e4,console.log("Event processor initialized")}getFilteredEventsForTab(e){const t=this.eventViewer.events;console.log(`getFilteredEventsForTab(${e}) - using RAW events: ${t.length} total`);const n=window.sessionManager;if(n&&n.selectedSessionId){const e=n.getEventsForSession(n.selectedSessionId);return console.log(`Filtering by session ${n.selectedSessionId}: ${e.length} events`),e}return t}applyAgentsFilters(e){const t=document.getElementById("agents-search-input"),n=document.getElementById("agents-type-filter"),s=t?t.value.toLowerCase():"",i=n?n.value:"";return e.filter(e=>{if(s){if(![e.agentName||"",e.type||"",e.isImplied?"implied":"explicit"].join(" ").toLowerCase().includes(s))return!1}if(i){if(!(e.agentName||"unknown").toLowerCase().includes(i.toLowerCase()))return!1}return!0})}applyToolsFilters(e){const t=document.getElementById("tools-search-input"),n=document.getElementById("tools-type-filter"),s=t?t.value.toLowerCase():"",i=n?n.value:"";return e.filter(e=>{if(s){if(![e.tool_name||"",e.agent_type||"",e.type||"",e.subtype||""].join(" ").toLowerCase().includes(s))return!1}if(i){if((e.tool_name||"")!==i)return!1}return!0})}applyToolCallFilters(e){const t=document.getElementById("tools-search-input"),n=document.getElementById("tools-type-filter"),s=t?t.value.toLowerCase():"",i=n?n.value:"";return e.filter(([e,t])=>{if(s){if(![t.tool_name||"",t.agent_type||"","tool_call"].join(" ").toLowerCase().includes(s))return!1}if(i){if((t.tool_name||"")!==i)return!1}return!0})}applyFilesFilters(e){const t=document.getElementById("files-search-input"),n=document.getElementById("files-type-filter"),s=t?t.value.toLowerCase():"",i=n?n.value:"";return e.filter(([e,t])=>{if(this.selectedSessionId){const e=t.operations.filter(e=>e.sessionId===this.selectedSessionId);if(0===e.length)return!1;t={...t,operations:e,lastOperation:e[e.length-1]?.timestamp||t.lastOperation}}if(s){if(![e,...t.operations.map(e=>e.operation),...t.operations.map(e=>e.agent)].join(" ").toLowerCase().includes(s))return!1}if(i){if(!t.operations.map(e=>e.operation).includes(i))return!1}return!0})}extractOperation(e){if(!e)return"unknown";const t=e.toLowerCase();return t.includes("read")?"read":t.includes("write")?"write":t.includes("edit")?"edit":t.includes("create")?"create":t.includes("delete")?"delete":t.includes("move")||t.includes("rename")?"move":"other"}extractToolFromHook(e){if(!e)return"";const t=e.match(/^(?:Pre|Post)(.+)Use$/);return t?t[1]:""}extractToolFromSubtype(e){if(!e)return"";if(e.includes("_")){return e.split("_")[0]||""}return e}extractToolTarget(e,t,n){const s=t||n||{};switch(e?.toLowerCase()){case"read":case"write":case"edit":return s.file_path||s.path||"";case"bash":return s.command||"";case"grep":return s.pattern||"";case"task":return s.subagent_type||s.agent_type||"";default:const e=Object.keys(s),t=["path","file_path","command","pattern","query","target"];for(const n of t)if(s[n])return s[n];return e.length>0?`${e[0]}: ${s[e[0]]}`:""}}generateAgentHTML(e){const t=this.agentInference.getUniqueAgentInstances();return this.applyAgentsFilters(t).map((e,t)=>{const n=e.agentName,s=this.formatTimestamp(e.firstTimestamp||e.timestamp),i=e.isImplied?"implied":"explicit",o=e.totalEventCount||e.eventCount||0;return`\n <div class="event-item single-row event-agent" onclick="${`dashboard.selectCard('agents', ${t}, 'agent_instance', '${e.id}'); dashboard.showAgentInstanceDetails('${e.id}');`}">\n <span class="event-single-row-content">\n <span class="event-content-main">${`${n} (${i}, ${o} events)`}</span>\n <span class="event-timestamp">${s}</span>\n </span>\n </div>\n `}).join("")}generateToolHTML(e){return this.applyToolCallFilters(e).map(([e,t],n)=>{const s=t.tool_name||"Unknown",i=t.agent_type||"Unknown",o=this.formatTimestamp(t.timestamp);return`\n <div class="event-item single-row event-tool ${"completed"===(t.post_event?"completed":"pending")?"status-success":"status-pending"}" onclick="dashboard.selectCard('tools', ${n}, 'toolCall', '${e}'); dashboard.showToolCallDetails('${e}')">\n <span class="event-single-row-content">\n <span class="event-content-main">${`${s} (${"pm"===i.toLowerCase()?"pm":i})`}</span>\n <span class="event-timestamp">${o}</span>\n </span>\n </div>\n `}).join("")}generateFileHTML(e){return this.applyFilesFilters(e).map(([e,t],n)=>{const s=t.operations.map(e=>e.operation),i=this.formatTimestamp(t.lastOperation),o={};s.forEach(e=>{o[e]=(o[e]||0)+1});const r=Object.entries(o).map(([e,t])=>`${e}(${t})`).join(", "),a=[...new Set(t.operations.map(e=>e.agent))],l=a.length>1?`by ${a.length} agents`:`by ${a[0]||"unknown"}`;return`\n <div class="event-item single-row file-item" onclick="dashboard.selectCard('files', ${n}, 'file', '${e}'); dashboard.showFileDetails('${e}')">\n <span class="event-single-row-content">\n <span class="event-content-main">${`${this.getRelativeFilePath(e)} ${r} ${l}`}</span>\n <span class="event-timestamp">${i}</span>\n </span>\n </div>\n `}).join("")}getFileOperationIcon(e){return e.includes("write")||e.includes("create")?"📝":e.includes("edit")?"✏️":e.includes("read")?"👁️":e.includes("delete")?"🗑️":e.includes("move")?"📦":"📄"}getRelativeFilePath(e){if(!e)return"";const t=e.split("/");return t.length>3?".../"+t.slice(-2).join("/"):e}formatTimestamp(e){if(!e)return"";return new Date(e).toLocaleTimeString()}setSelectedSessionId(e){this.selectedSessionId=e}getSelectedSessionId(){return this.selectedSessionId}getUniqueToolInstances(e){return this.applyToolCallFilters(e)}getUniqueFileInstances(e){return this.applyFilesFilters(e)}async isFileTracked(e,t){const n=`${t}:${e}`,s=Date.now(),i=this.fileTrackingCache.get(n);if(i&&s-i.timestamp<this.trackingCheckTimeout)return i.is_tracked;try{const i=window.socket;return i?new Promise(o=>{const r=t=>{if(t.file_path===e){const e=t.success&&t.is_tracked;this.fileTrackingCache.set(n,{is_tracked:e,timestamp:s}),i.off("file_tracked_response",r),o(e)}};i.on("file_tracked_response",r),i.emit("check_file_tracked",{file_path:e,working_dir:t}),setTimeout(()=>{i.off("file_tracked_response",r),o(!1)},5e3)}):(console.warn("No socket connection available for git tracking check"),!1)}catch(o){return console.error("Error checking file tracking status:",o),!1}}generateGitDiffIcon(e,t,n){const s=`git-icon-${e.replace(/[^a-zA-Z0-9]/g,"-")}-${t}`,i=`\n <span id="${s}" class="git-diff-icon"\n onclick="event.stopPropagation(); showGitDiffModal('${e}', '${t}')"\n title="View git diff for this file operation"\n style="margin-left: 8px; cursor: pointer; font-size: 16px;">\n 📋\n </span>\n `;return this.isFileTracked(e,n).then(e=>{const t=document.getElementById(s);t&&(e?(t.innerHTML="📋",t.title="View git diff for this file operation",t.classList.add("tracked-file")):(t.innerHTML="📋❌",t.title="File not tracked by git - click to see details",t.classList.add("untracked-file")))}).catch(e=>{console.error("Error updating git diff icon:",e)}),i}showAgentInstanceDetails(e){const t=this.agentInference.getPMDelegations().get(e);if(!t)return void console.error("Agent instance not found:",e);console.log("Showing agent instance details for:",e,t);const n=`\n <div class="agent-instance-details">\n <h3>Agent Instance: ${t.agentName}</h3>\n <p><strong>Type:</strong> ${t.isImplied?"Implied PM Delegation":"Explicit PM Delegation"}</p>\n <p><strong>Start Time:</strong> ${this.formatTimestamp(t.timestamp)}</p>\n <p><strong>Event Count:</strong> ${t.agentEvents.length}</p>\n <p><strong>Session:</strong> ${t.sessionId}</p>\n ${t.pmCall?`<p><strong>PM Call:</strong> Task delegation to ${t.agentName}</p>`:"<p><strong>Note:</strong> Implied delegation (no explicit PM call found)</p>"}\n </div>\n `;console.log("Agent instance details HTML:",n)}}export{e as E,t as a};
1
+ class e{constructor(e,t){this.container=document.getElementById(e),this.socketClient=t,this.events=[],this.filteredEvents=[],this.selectedEventIndex=-1,this.filteredEventElements=[],this.autoScroll=!0,this.searchFilter="",this.typeFilter="",this.sessionFilter="",this.eventTypeCount={},this.availableEventTypes=new Set,this.errorCount=0,this.eventsThisMinute=0,this.lastMinute=(new Date).getMinutes(),this.init()}init(){this.setupEventHandlers(),this.setupKeyboardNavigation(),this.socketClient.onEventUpdate((e,t)=>{this.events=Array.isArray(e)?e:[],this.updateDisplay()})}setupEventHandlers(){const e=document.getElementById("events-search-input");e&&e.addEventListener("input",e=>{this.searchFilter=e.target.value.toLowerCase(),this.applyFilters()});const t=document.getElementById("events-type-filter");t&&t.addEventListener("change",e=>{this.typeFilter=e.target.value,this.applyFilters()})}setupKeyboardNavigation(){}handleArrowNavigation(e){if(0===this.filteredEventElements.length)return;let t=this.selectedEventIndex+e;t>=this.filteredEventElements.length?t=0:t<0&&(t=this.filteredEventElements.length-1),this.showEventDetails(t)}applyFilters(){this.events&&Array.isArray(this.events)||(console.warn("EventViewer: events array is not initialized, using empty array"),this.events=[]),this.filteredEvents=this.events.filter(e=>{if(this.searchFilter){if(![e.type||"",e.subtype||"",JSON.stringify(e.data||{})].join(" ").toLowerCase().includes(this.searchFilter))return!1}if(this.typeFilter){const t=e.type&&""!==e.type.trim()?e.type:"";if((e.subtype&&t?`${t}.${e.subtype}`:t)!==this.typeFilter)return!1}return!(this.sessionFilter&&""!==this.sessionFilter&&(!e.data||e.data.session_id!==this.sessionFilter))}),this.renderEvents(),this.updateMetrics()}updateEventTypeDropdown(){const e=document.getElementById("events-type-filter");if(!e)return;const t=new Set;this.events&&Array.isArray(this.events)||(console.warn("EventViewer: events array is not initialized in updateEventTypeDropdown"),this.events=[]),this.events.forEach(e=>{if(e.type&&""!==e.type.trim()){const n=e.subtype?`${e.type}.${e.subtype}`:e.type;t.add(n)}});const n=Array.from(t).sort(),s=Array.from(this.availableEventTypes).sort();if(JSON.stringify(n)===JSON.stringify(s))return;this.availableEventTypes=t;const o=e.value;e.innerHTML='<option value="">All Events</option>';Array.from(t).sort().forEach(t=>{const n=document.createElement("option");n.value=t,n.textContent=t,e.appendChild(n)}),o&&t.has(o)?e.value=o:o&&!t.has(o)&&(e.value="",this.typeFilter="")}updateDisplay(){this.updateEventTypeDropdown(),this.applyFilters()}renderEvents(){const e=document.getElementById("events-list");if(!e)return;const t=e.scrollTop+e.clientHeight>=e.scrollHeight-10;if(0===this.filteredEvents.length)return e.innerHTML=`\n <div class="no-events">\n ${0===this.events.length?"Connect to Socket.IO server to see events...":"No events match current filters..."}\n </div>\n `,void(this.filteredEventElements=[]);const n=this.filteredEvents.map((e,t)=>{const n=new Date(e.timestamp).toLocaleTimeString();return`\n <div class="event-item single-row ${e.type?`event-${e.type}`:"event-default"} ${t===this.selectedEventIndex?"selected":""}"\n onclick="eventViewer.showEventDetails(${t})"\n data-index="${t}">\n <span class="event-single-row-content">\n <span class="event-content-main">${this.formatSingleRowEventContent(e)}</span>\n <span class="event-timestamp">${n}</span>\n </span>\n ${this.createInlineEditDiffViewer(e,t)}\n </div>\n `}).join("");e.innerHTML=n,this.filteredEventElements=Array.from(e.querySelectorAll(".event-item")),window.dashboard&&"events"===window.dashboard.currentTab&&window.dashboard.tabNavigation&&window.dashboard.tabNavigation.events&&(window.dashboard.tabNavigation.events.items=this.filteredEventElements),this.filteredEvents.length>0&&t&&this.autoScroll&&requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight})}formatEventType(e){return e.type&&e.subtype?e.type===e.subtype||"generic"===e.subtype?e.type:`${e.type}.${e.subtype}`:e.type?e.type:e.originalEventName?e.originalEventName:"unknown"}formatEventData(e){if(!e.data)return"No data";switch(e.type){case"session":return this.formatSessionEvent(e);case"claude":return this.formatClaudeEvent(e);case"agent":return this.formatAgentEvent(e);case"hook":return this.formatHookEvent(e);case"todo":return this.formatTodoEvent(e);case"memory":return this.formatMemoryEvent(e);case"log":return this.formatLogEvent(e);case"code":return this.formatCodeEvent(e);default:return this.formatGenericEvent(e)}}formatSessionEvent(e){const t=e.data;return"started"===e.subtype?`<strong>Session started:</strong> ${t.session_id||"Unknown"}`:"ended"===e.subtype?`<strong>Session ended:</strong> ${t.session_id||"Unknown"}`:`<strong>Session:</strong> ${JSON.stringify(t)}`}formatClaudeEvent(e){const t=e.data;if("request"===e.subtype){const e=t.prompt||t.message||"";return`<strong>Request:</strong> ${e.length>100?e.substring(0,100)+"...":e}`}if("response"===e.subtype){const e=t.response||t.content||"";return`<strong>Response:</strong> ${e.length>100?e.substring(0,100)+"...":e}`}return`<strong>Claude:</strong> ${JSON.stringify(t)}`}formatAgentEvent(e){const t=e.data;return"loaded"===e.subtype?`<strong>Agent loaded:</strong> ${t.agent_type||t.name||"Unknown"}`:"executed"===e.subtype?`<strong>Agent executed:</strong> ${t.agent_type||t.name||"Unknown"}`:`<strong>Agent:</strong> ${JSON.stringify(t)}`}formatHookEvent(e){const t=e.data,n=t.event_type||e.subtype||"unknown";switch(n){case"user_prompt":const s=t.prompt_text||t.prompt_preview||"";return`<strong>User Prompt:</strong> ${(s.length>80?s.substring(0,80)+"...":s)||"No prompt text"}`;case"pre_tool":const o=t.tool_name||"Unknown tool";return`<strong>Pre-Tool (${t.operation_type||"operation"}):</strong> ${o}`;case"post_tool":const i=t.tool_name||"Unknown tool";return`<strong>Post-Tool (${t.success?"success":t.status||"failed"}):</strong> ${i}${t.duration_ms?` (${t.duration_ms}ms)`:""}`;case"notification":return`<strong>Notification (${t.notification_type||"notification"}):</strong> ${t.message_preview||t.message||"No message"}`;case"stop":const r=t.reason||"unknown";return`<strong>Stop (${t.stop_type||"normal"}):</strong> ${r}`;case"subagent_start":const a=t.agent_type||t.agent||t.subagent_type||"Unknown",l=t.prompt||t.description||t.task||"No description",d=l.length>60?l.substring(0,60)+"...":l;return`<strong>Subagent Start (${this.formatAgentType(a)}):</strong> ${d}`;case"subagent_stop":const c=t.agent_type||t.agent||t.subagent_type||"Unknown",p=t.reason||t.stop_reason||"completed",g=this.formatAgentType(c),u=t.structured_response?.task_completed;return`<strong>Subagent Stop (${g})${void 0!==u?u?" ✓":" ✗":""}:</strong> ${p}`;default:const h=t.hook_name||t.name||t.event_type||"Unknown";return`<strong>Hook ${e.subtype||n}:</strong> ${h}`}}formatTodoEvent(e){const t=e.data;if(t.todos&&Array.isArray(t.todos)){const e=t.todos.length;return`<strong>Todo updated:</strong> ${e} item${1!==e?"s":""}`}return`<strong>Todo:</strong> ${JSON.stringify(t)}`}formatMemoryEvent(e){const t=e.data;return`<strong>Memory ${t.operation||"unknown"}:</strong> ${t.key||"Unknown key"}`}formatLogEvent(e){const t=e.data,n=t.level||"info",s=t.message||"",o=s.length>80?s.substring(0,80)+"...":s;return`<strong>[${n.toUpperCase()}]</strong> ${o}`}formatCodeEvent(e){const t=e.data||{};if("progress"===e.subtype){const e=t.message||"Processing...",n=t.percentage;return void 0!==n?`<strong>Progress:</strong> ${e} (${Math.round(n)}%)`:`<strong>Progress:</strong> ${e}`}if("analysis:queued"===e.subtype)return`<strong>Queued:</strong> Analysis for ${t.path||"Unknown path"}`;if("analysis:start"===e.subtype)return`<strong>Started:</strong> Analyzing ${t.path||"Unknown path"}`;if("analysis:complete"===e.subtype){return`<strong>Complete:</strong> Analysis finished${t.duration?` (${t.duration.toFixed(2)}s)`:""}`}if("analysis:error"===e.subtype)return`<strong>Error:</strong> ${t.message||"Analysis failed"}`;if("analysis:cancelled"===e.subtype)return`<strong>Cancelled:</strong> Analysis stopped for ${t.path||"Unknown path"}`;if("file:start"===e.subtype)return`<strong>File:</strong> Processing ${t.file||"Unknown file"}`;if("file:complete"===e.subtype){const e=void 0!==t.nodes_count?` (${t.nodes_count} nodes)`:"";return`<strong>File done:</strong> ${t.file||"Unknown file"}${e}`}if("node:found"===e.subtype)return`<strong>Node:</strong> Found ${t.node_type||"element"} "${t.name||"unnamed"}"`;if("error"===e.subtype)return`<strong>Error:</strong> ${t.error||"Unknown error"} in ${t.file||"file"}`;const n=JSON.stringify(t);return`<strong>Code:</strong> ${n.length>100?n.substring(0,100)+"...":n}`}formatGenericEvent(e){const t=e.data;return"string"==typeof t?t.length>100?t.substring(0,100)+"...":t:JSON.stringify(t)}formatAgentType(e){const t={research:"Research",architect:"Architect",engineer:"Engineer",qa:"QA",pm:"PM",project_manager:"PM",research_agent:"Research",architect_agent:"Architect",engineer_agent:"Engineer",qa_agent:"QA",unknown:"Unknown"},n=(e||"unknown").toLowerCase();if(t[n])return t[n];const s=e.match(/^(\w+)(?:_agent|Agent)?$/i);return s&&s[1]?s[1].charAt(0).toUpperCase()+s[1].slice(1).toLowerCase():e.charAt(0).toUpperCase()+e.slice(1)}formatSingleRowEventContent(e){const t=this.formatEventType(e),n=e.data||{},s=e.source&&"system"!==e.source?`[${e.source}] `:"";let o="";switch(e.type){case"hook":const t=e.tool_name||n.tool_name||"Unknown",s=e.subtype||"Unknown";if("pre_tool"===s||"post_tool"===s){const e=n.operation_type||"",i="post_tool"===s&&void 0!==n.success?n.success?"✓":"✗":"";o=`${t}${e?` (${e})`:""}${i?` ${i}`:""}`}else if("user_prompt"===s){const e=n.prompt_text||n.prompt_preview||"";o=(e.length>60?e.substring(0,60)+"...":e)||"No prompt text"}else if("subagent_start"===s){const e=n.agent_type||n.agent||n.subagent_type||"Unknown",t=this.formatAgentType(e),s=n.prompt||n.description||n.task||"",i=s.length>40?s.substring(0,40)+"...":s;o=i?`${t} - ${i}`:t}else if("subagent_stop"===s){const e=n.agent_type||n.agent||n.subagent_type||"Unknown",t=this.formatAgentType(e),s=n.reason||n.stop_reason||"completed",i=n.structured_response?.task_completed,r=void 0!==i?i?"✓":"✗":"";o=`${t}${r?" "+r:""} - ${s}`}else if("stop"===s){const e=n.reason||"completed";o=`${n.stop_type||"normal"} - ${e}`}else o=t;break;case"agent":const i=e.subagent_type||n.subagent_type||"PM",r=n.status||"";o=`${i}${r?` - ${r}`:""}`;break;case"todo":if(n.todos&&Array.isArray(n.todos)){o=`${n.todos.length} items (${n.todos.filter(e=>"completed"===e.status).length} completed, ${n.todos.filter(e=>"in_progress"===e.status).length} in progress)`}else o="Todo update";break;case"memory":o=`${n.operation||"unknown"}: ${n.key||"unknown"}${n.value?` = ${JSON.stringify(n.value).substring(0,30)}...`:""}`;break;case"session":o=`ID: ${n.session_id||"unknown"}`;break;case"claude":if("request"===e.subtype){const e=n.prompt||n.message||"";o=(e.length>60?e.substring(0,60)+"...":e)||"Empty request"}else if("response"===e.subtype){const e=n.response||n.content||"";o=(e.length>60?e.substring(0,60)+"...":e)||"Empty response"}else o=n.message||"Claude interaction";break;case"log":const a=n.level||"info",l=n.message||"",d=l.length>60?l.substring(0,60)+"...":l;o=`[${a.toUpperCase()}] ${d}`;break;case"test":o=n.test_name||n.name||"Test";break;default:if("string"==typeof n)o=n.length>60?n.substring(0,60)+"...":n;else if(n.message)o=n.message.length>60?n.message.substring(0,60)+"...":n.message;else if(n.name)o=n.name;else if(Object.keys(n).length>0){const e=Object.keys(n).find(e=>!["timestamp","id"].includes(e));if(e){const t=n[e];o=`${e}: ${"object"==typeof t?JSON.stringify(t).substring(0,40)+"...":t}`}}}const i=`${s}${t}`;return o?`${i} - ${o}`:i}getHookDisplayName(e,t){const n={pre_tool:"Pre-Tool",post_tool:"Post-Tool",user_prompt:"User-Prompt",stop:"Stop",subagent_start:"Subagent-Start",subagent_stop:"Subagent-Stop",notification:"Notification"};if(n[e])return n[e];return String(e||"unknown").replace(/_/g," ")}getEventCategory(e){const t=e.data||{},n=e.tool_name||t.tool_name||"";return["Read","Write","Edit","MultiEdit"].includes(n)?"file_operations":["Bash","grep","Glob"].includes(n)?"system_operations":"TodoWrite"===n?"task_management":"Task"===n||"subagent_start"===e.subtype||"subagent_stop"===e.subtype?"agent_delegation":"stop"===e.subtype?"session_control":"general"}showEventDetails(e){if(!this.filteredEvents||!Array.isArray(this.filteredEvents))return void console.warn("EventViewer: filteredEvents array is not initialized");if(e<0||e>=this.filteredEvents.length)return;this.selectedEventIndex=e;const t=this.filteredEvents[e];window.dashboard&&(window.dashboard.tabNavigation&&window.dashboard.tabNavigation.events&&(window.dashboard.tabNavigation.events.selectedIndex=e),window.dashboard.selectCard&&window.dashboard.selectCard("events",e,"event",t)),this.filteredEventElements.forEach((t,n)=>{t.classList.toggle("selected",n===e)}),document.dispatchEvent(new CustomEvent("eventSelected",{detail:{event:t,index:e}}));const n=this.filteredEventElements[e];n&&n.scrollIntoView({behavior:"smooth",block:"nearest"})}clearSelection(){this.selectedEventIndex=-1,this.filteredEventElements.forEach(e=>{e.classList.remove("selected")}),window.dashboard&&(window.dashboard.tabNavigation&&window.dashboard.tabNavigation.events&&(window.dashboard.tabNavigation.events.selectedIndex=-1),window.dashboard.clearCardSelection&&window.dashboard.clearCardSelection()),document.dispatchEvent(new CustomEvent("eventSelectionCleared"))}updateMetrics(){this.eventTypeCount={},this.errorCount=0,this.events&&Array.isArray(this.events)||(console.warn("EventViewer: events array is not initialized in updateMetrics"),this.events=[]),this.events.forEach(e=>{const t=e.type||"unknown";this.eventTypeCount[t]=(this.eventTypeCount[t]||0)+1,"log"===e.type&&e.data&&["error","critical"].includes(e.data.level)&&this.errorCount++});const e=(new Date).getMinutes();e!==this.lastMinute&&(this.lastMinute=e,this.eventsThisMinute=0);const t=new Date(Date.now()-6e4);this.eventsThisMinute=this.events.filter(e=>new Date(e.timestamp)>t).length,this.updateMetricsUI()}updateMetricsUI(){const e=document.getElementById("total-events"),t=document.getElementById("events-per-minute"),n=document.getElementById("unique-types"),s=document.getElementById("error-count");e&&(e.textContent=this.events.length),t&&(t.textContent=this.eventsThisMinute),n&&(n.textContent=Object.keys(this.eventTypeCount).length),s&&(s.textContent=this.errorCount)}exportEvents(){const e=JSON.stringify(this.filteredEvents,null,2),t=new Blob([e],{type:"application/json"}),n=URL.createObjectURL(t),s=document.createElement("a");s.href=n,s.download=`claude-mpm-events-${(new Date).toISOString().split("T")[0]}.json`,s.click(),URL.revokeObjectURL(n)}clearEvents(){this.socketClient.clearEvents(),this.selectedEventIndex=-1,this.updateDisplay()}setSessionFilter(e){this.sessionFilter=e,this.applyFilters()}getFilters(){return{search:this.searchFilter,type:this.typeFilter,session:this.sessionFilter}}getFilteredEvents(){return this.filteredEvents}getAllEvents(){return this.events}createInlineEditDiffViewer(e,t){const n=e.data||{},s=e.tool_name||n.tool_name||"";if(!["Edit","MultiEdit"].includes(s))return"";let o=[];if("Edit"===s){const t=e.tool_parameters||n.tool_parameters||{};t.old_string&&t.new_string&&o.push({old_string:t.old_string,new_string:t.new_string,file_path:t.file_path||"unknown"})}else if("MultiEdit"===s){const t=e.tool_parameters||n.tool_parameters||{};t.edits&&Array.isArray(t.edits)&&(o=t.edits.map(e=>({...e,file_path:t.file_path||"unknown"})))}if(0===o.length)return"";const i=`edit-diff-${t}`,r=o.length>1;let a="";return o.forEach((e,t)=>{const n=this.createDiffHtml(e.old_string,e.new_string);a+=`\n <div class="edit-diff-section">\n ${r?`<div class="edit-diff-header">Edit ${t+1}</div>`:""}\n <div class="diff-content">${n}</div>\n </div>\n `}),`\n <div class="inline-edit-diff-viewer">\n <div class="diff-toggle-header" onclick="eventViewer.toggleEditDiff('${i}', event)">\n <span class="diff-toggle-icon">📋</span>\n <span class="diff-toggle-text">Show ${r?o.length+" edits":"edit"}</span>\n <span class="diff-toggle-arrow">▼</span>\n </div>\n <div id="${i}" class="diff-content-container" style="display: none;">\n ${a}\n </div>\n </div>\n `}createDiffHtml(e,t){const n=e.split("\n"),s=t.split("\n");let o="",i=0,r=0;for(;i<n.length||r<s.length;){const e=i<n.length?n[i]:null,t=r<s.length?s[r]:null;null===e?(o+=`<div class="diff-line diff-added">+ ${this.escapeHtml(t)}</div>`,r++):null===t?(o+=`<div class="diff-line diff-removed">- ${this.escapeHtml(e)}</div>`,i++):e===t?(o+=`<div class="diff-line diff-unchanged"> ${this.escapeHtml(e)}</div>`,i++,r++):(o+=`<div class="diff-line diff-removed">- ${this.escapeHtml(e)}</div>`,o+=`<div class="diff-line diff-added">+ ${this.escapeHtml(t)}</div>`,i++,r++)}return`<div class="diff-container">${o}</div>`}toggleEditDiff(e,t){t.stopPropagation();const n=document.getElementById(e),s=t.currentTarget.querySelector(".diff-toggle-arrow");if(n){const e="none"!==n.style.display;n.style.display=e?"none":"block",s&&(s.textContent=e?"▼":"▲")}}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}}window.EventViewer=e;class t{constructor(e,t){this.eventViewer=e,this.agentInference=t,this.agentEvents=[],this.filteredAgentEvents=[],this.filteredToolEvents=[],this.filteredFileEvents=[],this.selectedSessionId=null,console.log("Event processor initialized")}getFilteredEventsForTab(e){const t=this.eventViewer.events;console.log(`getFilteredEventsForTab(${e}) - using RAW events: ${t.length} total`);const n=window.sessionManager;if(n&&n.selectedSessionId){const e=n.getEventsForSession(n.selectedSessionId);return console.log(`Filtering by session ${n.selectedSessionId}: ${e.length} events`),e}return t}applyAgentsFilters(e){const t=document.getElementById("agents-search-input"),n=document.getElementById("agents-type-filter"),s=t?t.value.toLowerCase():"",o=n?n.value:"";return e.filter(e=>{if(s){if(![e.agentName||"",e.type||"",e.isImplied?"implied":"explicit"].join(" ").toLowerCase().includes(s))return!1}if(o){if(!(e.agentName||"unknown").toLowerCase().includes(o.toLowerCase()))return!1}return!0})}applyToolsFilters(e){const t=document.getElementById("tools-search-input"),n=document.getElementById("tools-type-filter"),s=t?t.value.toLowerCase():"",o=n?n.value:"";return e.filter(e=>{if(s){if(![e.tool_name||"",e.agent_type||"",e.type||"",e.subtype||""].join(" ").toLowerCase().includes(s))return!1}if(o){if((e.tool_name||"")!==o)return!1}return!0})}applyToolCallFilters(e){const t=document.getElementById("tools-search-input"),n=document.getElementById("tools-type-filter"),s=t?t.value.toLowerCase():"",o=n?n.value:"";return e.filter(([e,t])=>{if(s){if(![t.tool_name||"",t.agent_type||"","tool_call"].join(" ").toLowerCase().includes(s))return!1}if(o){if((t.tool_name||"")!==o)return!1}return!0})}applyFilesFilters(e){const t=document.getElementById("files-search-input"),n=document.getElementById("files-type-filter"),s=t?t.value.toLowerCase():"",o=n?n.value:"";return e.filter(([e,t])=>{if(this.selectedSessionId){const e=t.operations.filter(e=>e.sessionId===this.selectedSessionId);if(0===e.length)return!1;t={...t,operations:e,lastOperation:e[e.length-1]?.timestamp||t.lastOperation}}if(s){if(![e,...t.operations.map(e=>e.operation),...t.operations.map(e=>e.agent)].join(" ").toLowerCase().includes(s))return!1}if(o){if(!t.operations.map(e=>e.operation).includes(o))return!1}return!0})}extractOperation(e){if(!e)return"unknown";const t=e.toLowerCase();return t.includes("read")?"read":t.includes("write")?"write":t.includes("edit")?"edit":t.includes("create")?"create":t.includes("delete")?"delete":t.includes("move")||t.includes("rename")?"move":"other"}extractToolFromHook(e){if(!e)return"";const t=e.match(/^(?:Pre|Post)(.+)Use$/);return t?t[1]:""}extractToolFromSubtype(e){if(!e)return"";if(e.includes("_")){return e.split("_")[0]||""}return e}extractToolTarget(e,t,n){const s=t||n||{};switch(e?.toLowerCase()){case"read":case"write":case"edit":return s.file_path||s.path||"";case"bash":return s.command||"";case"grep":return s.pattern||"";case"task":return s.subagent_type||s.agent_type||"";default:const e=Object.keys(s),t=["path","file_path","command","pattern","query","target"];for(const n of t)if(s[n])return s[n];return e.length>0?`${e[0]}: ${s[e[0]]}`:""}}generateAgentHTML(e){const t=this.agentInference.getUniqueAgentInstances();return this.applyAgentsFilters(t).map((e,t)=>{const n=e.agentName,s=this.formatTimestamp(e.firstTimestamp||e.timestamp),o=e.isImplied?"implied":"explicit",i=e.totalEventCount||e.eventCount||0;return`\n <div class="event-item single-row event-agent" onclick="${`dashboard.selectCard('agents', ${t}, 'agent_instance', '${e.id}'); dashboard.showAgentInstanceDetails('${e.id}');`}">\n <span class="event-single-row-content">\n <span class="event-content-main">${`${n} (${o}, ${i} events)`}</span>\n <span class="event-timestamp">${s}</span>\n </span>\n </div>\n `}).join("")}generateToolHTML(e){return this.applyToolCallFilters(e).map(([e,t],n)=>{const s=t.tool_name||"Unknown",o=t.agent_type||"Unknown",i=this.formatTimestamp(t.timestamp);return`\n <div class="event-item single-row event-tool ${"completed"===(t.post_event?"completed":"pending")?"status-success":"status-pending"}" onclick="dashboard.selectCard('tools', ${n}, 'toolCall', '${e}'); dashboard.showToolCallDetails('${e}')">\n <span class="event-single-row-content">\n <span class="event-content-main">${`${s} (${"pm"===o.toLowerCase()?"pm":o})`}</span>\n <span class="event-timestamp">${i}</span>\n </span>\n </div>\n `}).join("")}generateFileHTML(e){return this.applyFilesFilters(e).map(([e,t],n)=>{const s=t.operations.map(e=>e.operation),o=this.formatTimestamp(t.lastOperation),i={};s.forEach(e=>{i[e]=(i[e]||0)+1});const r=Object.entries(i).map(([e,t])=>`${e}(${t})`).join(", "),a=[...new Set(t.operations.map(e=>e.agent))],l=a.length>1?`by ${a.length} agents`:`by ${a[0]||"unknown"}`;return`\n <div class="event-item single-row file-item" onclick="dashboard.selectCard('files', ${n}, 'file', '${e}'); dashboard.showFileDetails('${e}')">\n <span class="event-single-row-content">\n <span class="event-content-main">${`${this.getRelativeFilePath(e)} ${r} ${l}`}</span>\n <span class="event-timestamp">${o}</span>\n </span>\n </div>\n `}).join("")}getFileOperationIcon(e){return e.includes("write")||e.includes("create")?"📝":e.includes("edit")?"✏️":e.includes("read")?"👁️":e.includes("delete")?"🗑️":e.includes("move")?"📦":"📄"}getRelativeFilePath(e){if(!e)return"";const t=e.split("/");return t.length>3?".../"+t.slice(-2).join("/"):e}formatTimestamp(e){if(!e)return"";return new Date(e).toLocaleTimeString()}setSelectedSessionId(e){this.selectedSessionId=e}getSelectedSessionId(){return this.selectedSessionId}getUniqueToolInstances(e){return this.applyToolCallFilters(e)}getUniqueFileInstances(e){return this.applyFilesFilters(e)}showAgentInstanceDetails(e){const t=this.agentInference.getPMDelegations().get(e);if(!t)return void console.error("Agent instance not found:",e);console.log("Showing agent instance details for:",e,t);const n=`\n <div class="agent-instance-details">\n <h3>Agent Instance: ${t.agentName}</h3>\n <p><strong>Type:</strong> ${t.isImplied?"Implied PM Delegation":"Explicit PM Delegation"}</p>\n <p><strong>Start Time:</strong> ${this.formatTimestamp(t.timestamp)}</p>\n <p><strong>Event Count:</strong> ${t.agentEvents.length}</p>\n <p><strong>Session:</strong> ${t.sessionId}</p>\n ${t.pmCall?`<p><strong>PM Call:</strong> Task delegation to ${t.agentName}</p>`:"<p><strong>Note:</strong> Implied delegation (no explicit PM call found)</p>"}\n </div>\n `;console.log("Agent instance details HTML:",n)}}export{e as E,t as a};
2
2
  //# sourceMappingURL=event-viewer.js.map
@@ -0,0 +1,2 @@
1
+ import{U as t}from"./unified-data-viewer.js";class e{constructor(e){this.container=document.getElementById(e),this.dataContainer=null,this.jsonContainer=null,this.currentEvent=null,this.eventsByClass=new Map,this.globalJsonExpanded="true"===localStorage.getItem("dashboard-json-expanded"),this.keyboardListenerAdded=!1,this.unifiedViewer=new t("module-data-content"),this.init()}init(){this.setupContainers(),this.setupEventHandlers(),this.showEmptyState()}setupContainers(){this.dataContainer=document.getElementById("module-data-content"),this.jsonContainer=null,this.dataContainer||console.error("Module viewer data container not found")}setupEventHandlers(){document.addEventListener("eventSelected",t=>{this.showEventDetails(t.detail.event)}),document.addEventListener("eventSelectionCleared",()=>{this.showEmptyState()}),document.addEventListener("socketEventUpdate",t=>{this.updateEventsByClass(t.detail.events)})}showEmptyState(){this.dataContainer&&(this.dataContainer.innerHTML='\n <div class="module-empty">\n <p>Click on an event to view structured data</p>\n <p class="module-hint">Data is organized by event type</p>\n </div>\n '),this.currentEvent=null}showEventDetails(t){if(this.currentEvent=t,!this.unifiedViewer)return console.warn("ModuleViewer: UnifiedDataViewer not available"),this.renderStructuredData(t),void this.renderJsonData(t);this.unifiedViewer.display(t,"event")}renderStructuredData(t){if(!this.dataContainer)return;const e=this.createContextualHeader(t),n=this.createEventStructuredView(t),s=this.createCollapsibleJsonSection(t);this.dataContainer.innerHTML=e+n+s,this.initializeJsonToggle()}renderJsonData(t){}ingest(t){Array.isArray(t)?t.length>0?this.showEventDetails(t[0]):this.showEmptyState():t&&"object"==typeof t?this.showEventDetails(t):this.showEmptyState()}updateEventsByClass(t){this.eventsByClass.clear(),t.forEach(t=>{const e=this.getEventClass(t);this.eventsByClass.has(e)||this.eventsByClass.set(e,[]),this.eventsByClass.get(e).push(t)})}getEventClass(t){if(!t.type)return"unknown";switch(t.type){case"session":return"Session Management";case"claude":return"Claude Interactions";case"agent":return"Agent Operations";case"hook":return"Hook System";case"todo":return"Task Management";case"memory":return"Memory Operations";case"log":return"System Logs";case"connection":return"Connection Events";default:return"Other Events"}}createContextualHeader(t){const e=this.formatTimestamp(t.timestamp),n=t.data||{};let s="";switch(t.type){case"hook":const o=this.extractToolName(n),a=this.extractAgent(t)||"Unknown";if(o)s=`${o}: ${a} ${e}`;else{s=`${this.getHookDisplayName(t,n)}: ${a} ${e}`}break;case"agent":s=`Agent: ${n.agent_type||n.name||"Unknown"} ${e}`;break;case"todo":s=`TodoWrite: ${this.extractAgent(t)||"PM"} ${e}`;break;case"memory":s=`Memory: ${n.operation||"Unknown"} ${e}`;break;case"session":case"claude":case"log":case"connection":s=`Event: ${t.type}.${t.subtype||"default"} ${e}`;break;default:const r=this.extractFileName(n);if(r)s=`File: ${r} ${e}`;else{s=`Event: ${t.type||"Unknown"}.${t.subtype||"default"} ${e}`}}return`\n <div class="contextual-header">\n <h3 class="contextual-header-text">${s}</h3>\n </div>\n `}createEventStructuredView(t){const e=this.getEventClass(t),n=(this.eventsByClass.get(e)||[]).length;let s=`\n <div class="structured-view-section">\n ${this.createEventDetailCard(t.type,t,n)}\n </div>\n `;switch(t.type){case"agent":s+=this.createAgentStructuredView(t);break;case"hook":"Task"===t.data?.tool_name&&t.data?.tool_parameters?.subagent_type?s+=this.createAgentStructuredView(t):s+=this.createHookStructuredView(t);break;case"todo":s+=this.createTodoStructuredView(t);break;case"memory":s+=this.createMemoryStructuredView(t);break;case"claude":s+=this.createClaudeStructuredView(t);break;case"session":s+=this.createSessionStructuredView(t);break;default:s+=this.createGenericStructuredView(t)}return s}createEventDetailCard(t,e,n){const s=new Date(e.timestamp).toLocaleString();return`\n <div class="event-detail-card">\n <div class="event-detail-header">\n <div class="event-detail-title">\n ${this.getEventIcon(t)} ${t||"Unknown"}.${e.subtype||"default"}\n </div>\n <div class="event-detail-time">${s}</div>\n </div>\n <div class="event-detail-content">\n ${this.createProperty("Event ID",e.id||"N/A")}\n ${this.createProperty("Type",`${t}.${e.subtype||"default"}`)}\n ${this.createProperty("Class Events",n)}\n ${e.data&&e.data.session_id?this.createProperty("Session",e.data.session_id):""}\n </div>\n </div>\n `}createAgentStructuredView(t){const e=t.data||{};if("hook"===t.type&&"Task"===e.tool_name&&e.tool_parameters?.subagent_type){const n=e.tool_parameters;return`\n <div class="structured-view-section">\n <div class="structured-data">\n ${this.createProperty("Agent Type",n.subagent_type)}\n ${this.createProperty("Task Type","Subagent Delegation")}\n ${this.createProperty("Phase",t.subtype||"pre_tool")}\n ${n.description?this.createProperty("Description",n.description):""}\n ${n.prompt?this.createProperty("Prompt Preview",this.truncateText(n.prompt,200)):""}\n ${e.session_id?this.createProperty("Session ID",e.session_id):""}\n ${e.working_directory?this.createProperty("Working Directory",e.working_directory):""}\n </div>\n ${n.prompt?`\n <div class="prompt-section">\n <div class="contextual-header">\n <h3 class="contextual-header-text">📝 Task Prompt</h3>\n </div>\n <div class="structured-data">\n <div class="task-prompt" style="white-space: pre-wrap; max-height: 300px; overflow-y: auto; padding: 10px; background: #f8fafc; border-radius: 6px; font-family: monospace; font-size: 12px; line-height: 1.4;">\n ${n.prompt}\n </div>\n </div>\n </div>\n `:""}\n </div>\n `}return`\n <div class="structured-view-section">\n <div class="structured-data">\n ${this.createProperty("Agent Type",e.agent_type||e.subagent_type||"Unknown")}\n ${this.createProperty("Name",e.name||"N/A")}\n ${this.createProperty("Phase",t.subtype||"N/A")}\n ${e.config?this.createProperty("Config","object"==typeof e.config?Object.keys(e.config).join(", "):String(e.config)):""}\n ${e.capabilities?this.createProperty("Capabilities",e.capabilities.join(", ")):""}\n ${e.result?this.createProperty("Result","object"==typeof e.result?"[Object]":String(e.result)):""}\n </div>\n </div>\n `}createHookStructuredView(t){const e=t.data||{},n=this.extractFilePathFromHook(e),s=this.extractToolInfoFromHook(e),o=this.createInlineToolResultContent(e,t);return`\n <div class="structured-view-section">\n <div class="structured-data">\n ${this.createProperty("Hook Name",this.getHookDisplayName(t,e))}\n ${this.createProperty("Event Type",e.event_type||t.subtype||"N/A")}\n ${n?this.createProperty("File Path",n):""}\n ${s.tool_name?this.createProperty("Tool",s.tool_name):""}\n ${s.operation_type?this.createProperty("Operation",s.operation_type):""}\n ${e.session_id?this.createProperty("Session ID",e.session_id):""}\n ${e.working_directory?this.createProperty("Working Directory",e.working_directory):""}\n ${e.duration_ms?this.createProperty("Duration",`${e.duration_ms}ms`):""}\n ${o}\n </div>\n </div>\n `}createInlineToolResultContent(t,e=null){const n=t.result_summary,s=e?.subtype||t.event_type||t.phase,o="post_tool"===s||s?.includes("post");if(window.DEBUG_TOOL_RESULTS&&console.log("🔧 createInlineToolResultContent debug:",{hasResultSummary:!!n,eventPhase:s,isPostTool:o,eventSubtype:e?.subtype,dataEventType:t.event_type,dataPhase:t.phase,toolName:t.tool_name,resultSummaryKeys:n?Object.keys(n):[]}),!n)return"";if("pre_tool"===s||s?.includes("pre")&&!s?.includes("post"))return"";let a="";if(n.has_output&&n.output_preview&&(a+=`\n ${this.createProperty("Output",this.truncateText(n.output_preview,200))}\n ${n.output_lines?this.createProperty("Output Lines",n.output_lines):""}\n `),n.has_error&&n.error_preview&&(a+=`\n ${this.createProperty("Error",this.truncateText(n.error_preview,200))}\n `),!n.has_output&&!n.has_error&&Object.keys(n).length>3){a+=Object.entries(n).filter(([t,e])=>!["has_output","has_error","exit_code"].includes(t)&&void 0!==e).map(([t,e])=>this.createProperty(this.formatFieldName(t),String(e))).join("")}return a}createToolResultSection(t,e=null){const n=t.result_summary,s=e?.subtype||t.event_type||t.phase,o="post_tool"===s||s?.includes("post");if(window.DEBUG_TOOL_RESULTS&&console.log("🔧 createToolResultSection debug:",{hasResultSummary:!!n,eventPhase:s,isPostTool:o,eventSubtype:e?.subtype,dataEventType:t.event_type,dataPhase:t.phase,toolName:t.tool_name,resultSummaryKeys:n?Object.keys(n):[]}),!n)return"";if("pre_tool"===s||s?.includes("pre")&&!s?.includes("post"))return"";let a="⏳",r="tool-running",i="Unknown";!0===t.success?(a="✅",r="tool-success",i="Success"):!1===t.success?(a="❌",r="tool-failure",i="Failed"):0===t.exit_code?(a="✅",r="tool-success",i="Completed"):2===t.exit_code?(a="⚠️",r="tool-blocked",i="Blocked"):void 0!==t.exit_code&&0!==t.exit_code&&(a="❌",r="tool-failure",i="Error");let l="";if(l+=`\n <div class="tool-result-status ${r}">\n <span class="tool-result-icon">${a}</span>\n <span class="tool-result-text">${i}</span>\n ${void 0!==t.exit_code?`<span class="tool-exit-code">Exit Code: ${t.exit_code}</span>`:""}\n </div>\n `,n.has_output&&n.output_preview&&(l+=`\n <div class="tool-result-output">\n <div class="tool-result-label">📄 Output:</div>\n <div class="tool-result-preview">\n <pre>${this.escapeHtml(n.output_preview)}</pre>\n </div>\n ${n.output_lines?`<div class="tool-result-meta">Lines: ${n.output_lines}</div>`:""}\n </div>\n `),n.has_error&&n.error_preview&&(l+=`\n <div class="tool-result-error">\n <div class="tool-result-label">⚠️ Error:</div>\n <div class="tool-result-preview error-preview">\n <pre>${this.escapeHtml(n.error_preview)}</pre>\n </div>\n </div>\n `),!n.has_output&&!n.has_error&&Object.keys(n).length>3){const t=Object.entries(n).filter(([t,e])=>!["has_output","has_error","exit_code"].includes(t)&&void 0!==e).map(([t,e])=>this.createProperty(this.formatFieldName(t),String(e))).join("");t&&(l+=`\n <div class="tool-result-other">\n <div class="tool-result-label">📊 Result Details:</div>\n <div class="structured-data">\n ${t}\n </div>\n </div>\n `)}return l.trim()?`\n <div class="tool-result-section">\n <div class="contextual-header">\n <h3 class="contextual-header-text">🔧 Tool Result</h3>\n </div>\n <div class="tool-result-content">\n ${l}\n </div>\n </div>\n `:""}isWriteOperation(t,e){if(["Write","Edit","MultiEdit","NotebookEdit"].includes(t))return!0;if(e.tool_parameters){const t=e.tool_parameters;if(t.content||t.new_string||t.edits)return!0;if(t.edit_mode&&"read"!==t.edit_mode)return!0}return!("post_tool"!==e.event_type&&"pre_tool"!==e.event_type||!t||!(t.toLowerCase().includes("write")||t.toLowerCase().includes("edit")||t.toLowerCase().includes("modify")))}isReadOnlyOperation(t){if(!t)return!0;const e=t.toLowerCase();return!!["read"].includes(e)||!["write","edit","multiedit","create","delete","move","copy"].includes(e)}createTodoStructuredView(t){const e=t.data||{};let n="";return e.todos&&Array.isArray(e.todos)&&(n+=`\n <div class="todo-checklist">\n ${e.todos.map(t=>`\n <div class="todo-item todo-${t.status||"pending"}">\n <span class="todo-status">${this.getTodoStatusIcon(t.status)}</span>\n <span class="todo-content">${t.content||"No content"}</span>\n <span class="todo-priority priority-${t.priority||"medium"}">${this.getTodoPriorityIcon(t.priority)}</span>\n </div>\n `).join("")}\n </div>\n `),n}createMemoryStructuredView(t){const e=t.data||{};return`\n <div class="structured-view-section">\n <div class="structured-data">\n ${this.createProperty("Operation",e.operation||"Unknown")}\n ${this.createProperty("Key",e.key||"N/A")}\n ${e.value?this.createProperty("Value","object"==typeof e.value?"[Object]":String(e.value)):""}\n ${e.namespace?this.createProperty("Namespace",e.namespace):""}\n ${e.metadata?this.createProperty("Metadata","object"==typeof e.metadata?"[Object]":String(e.metadata)):""}\n </div>\n </div>\n `}createClaudeStructuredView(t){const e=t.data||{};return`\n <div class="structured-view-section">\n <div class="structured-data">\n ${this.createProperty("Type",t.subtype||"N/A")}\n ${e.prompt?this.createProperty("Prompt",this.truncateText(e.prompt,200)):""}\n ${e.message?this.createProperty("Message",this.truncateText(e.message,200)):""}\n ${e.response?this.createProperty("Response",this.truncateText(e.response,200)):""}\n ${e.content?this.createProperty("Content",this.truncateText(e.content,200)):""}\n ${e.tokens?this.createProperty("Tokens",e.tokens):""}\n ${e.model?this.createProperty("Model",e.model):""}\n </div>\n </div>\n `}createSessionStructuredView(t){const e=t.data||{};return`\n <div class="structured-view-section">\n <div class="structured-data">\n ${this.createProperty("Action",t.subtype||"N/A")}\n ${this.createProperty("Session ID",e.session_id||"N/A")}\n ${e.working_directory?this.createProperty("Working Dir",e.working_directory):""}\n ${e.git_branch?this.createProperty("Git Branch",e.git_branch):""}\n ${e.agent_type?this.createProperty("Agent Type",e.agent_type):""}\n </div>\n </div>\n `}createGenericStructuredView(t){const e=t.data||{},n=Object.keys(e);return 0===n.length?"":`\n <div class="structured-view-section">\n <div class="structured-data">\n ${n.map(t=>this.createProperty(t,"object"==typeof e[t]?"[Object]":String(e[t]))).join("")}\n </div>\n </div>\n `}createCollapsibleJsonSection(t){const e="json-section-"+Math.random().toString(36).substr(2,9),n=this.formatJSON(t),s=this.globalJsonExpanded;return`\n <div class="collapsible-json-section" id="${e}">\n <div class="json-toggle-header"\n onclick="window.moduleViewer.toggleJsonSection()"\n role="button"\n tabindex="0"\n aria-expanded="${s?"true":"false"}"\n onkeydown="if(event.key==='Enter'||event.key===' '){window.moduleViewer.toggleJsonSection();event.preventDefault();}">\n <span class="json-toggle-text">Raw JSON</span>\n <span class="json-toggle-arrow">${s?"▲":"▼"}</span>\n </div>\n <div class="json-content-collapsible" style="display: ${s?"block":"none"};" aria-hidden="${!s}">\n <div class="json-display" onclick="window.moduleViewer.copyJsonToClipboard(event)">\n <pre>${n}</pre>\n </div>\n </div>\n </div>\n `}async copyJsonToClipboard(t){const e=t.currentTarget.getBoundingClientRect(),n=t.clientX-e.left,s=t.clientY-e.top;if(n>e.width-50&&s<30){const e=t.currentTarget.querySelector("pre");if(e)try{await navigator.clipboard.writeText(e.textContent),this.showNotification("JSON copied to clipboard","success")}catch(o){console.error("Failed to copy JSON:",o),this.showNotification("Failed to copy JSON","error")}t.stopPropagation()}}initializeJsonToggle(){window.moduleViewer=this,this.globalJsonExpanded&&setTimeout(()=>{this.updateAllJsonSections()},0),this.keyboardListenerAdded||(this.keyboardListenerAdded=!0,document.addEventListener("keydown",t=>{t.target.classList.contains("json-toggle-header")&&("Enter"!==t.key&&" "!==t.key||(this.toggleJsonSection(),t.preventDefault()))}))}toggleJsonSection(){this.globalJsonExpanded=!this.globalJsonExpanded,localStorage.setItem("dashboard-json-expanded",this.globalJsonExpanded.toString()),this.updateAllJsonSections(),document.dispatchEvent(new CustomEvent("jsonToggleChanged",{detail:{expanded:this.globalJsonExpanded}}))}updateAllJsonSections(){const t=document.querySelectorAll(".json-content-collapsible"),e=document.querySelectorAll(".json-toggle-arrow"),n=document.querySelectorAll(".json-toggle-header");t.forEach((t,s)=>{this.globalJsonExpanded?(t.style.display="block",t.setAttribute("aria-hidden","false"),e[s]&&(e[s].textContent="▲"),n[s]&&n[s].setAttribute("aria-expanded","true")):(t.style.display="none",t.setAttribute("aria-hidden","true"),e[s]&&(e[s].textContent="▼"),n[s]&&n[s].setAttribute("aria-expanded","false"))}),this.globalJsonExpanded&&t.length>0&&setTimeout(()=>{const e=t[0];e&&e.scrollIntoView({behavior:"smooth",block:"nearest"})},100)}createProperty(t,e){const n=this.truncateText(String(e),300);return this.isFilePathProperty(t,e)?`\n <div class="event-property">\n <span class="event-property-key">${t}:</span>\n <span class="event-property-value">\n ${this.createClickableFilePath(e)}\n </span>\n </div>\n `:`\n <div class="event-property">\n <span class="event-property-key">${t}:</span>\n <span class="event-property-value">${n}</span>\n </div>\n `}isFilePathProperty(t,e){if(["File Path","file_path","notebook_path","Full Path","Working Directory","working_directory"].some(e=>t.toLowerCase().includes(e.toLowerCase()))){const t=String(e);return t.length>0&&(t.includes("/")||t.includes("\\"))&&t.length<500}return!1}createClickableFilePath(t){const e=this.truncateText(String(t),300);return`\n <span class="clickable-file-path"\n onclick="showFileViewerModal('${t.replace(/'/g,"\\'")}')"\n title="Click to view file contents with syntax highlighting&#10;Path: ${t}">\n ${e}\n </span>\n `}getEventIcon(t){const e={session:"📱",claude:"🤖",agent:"🎯",hook:"🔗",todo:"✅",memory:"🧠",log:"📝",connection:"🔌",unknown:"❓"};return e[t]||e.unknown}getTodoStatusIcon(t){const e={completed:"✅",in_progress:"🔄",pending:"⏳",cancelled:"❌"};return e[t]||e.pending}getTodoPriorityIcon(t){const e={high:"🔴",medium:"🟡",low:"🟢"};return e[t]||e.medium}getHookDisplayName(t,e){if(e.hook_name)return e.hook_name;if(e.name)return e.name;const n=t.subtype||e.event_type,s={user_prompt:"User Prompt",pre_tool:"Tool Execution (Pre)",post_tool:"Tool Execution (Post)",notification:"Notification",stop:"Session Stop",subagent_stop:"Subagent Stop"};if(s[n])return s[n];if("string"==typeof t.type&&t.type.startsWith("hook.")){const e=t.type.replace("hook.","");if(s[e])return s[e]}return n?n.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "):"Unknown Hook"}extractFilePathFromHook(t){return t.tool_parameters&&t.tool_parameters.file_path?t.tool_parameters.file_path:t.file_path?t.file_path:t.tool_input&&t.tool_input.file_path?t.tool_input.file_path:t.tool_parameters&&t.tool_parameters.notebook_path?t.tool_parameters.notebook_path:null}extractToolInfoFromHook(t){return{tool_name:t.tool_name||t.tool_parameters&&t.tool_parameters.tool_name,operation_type:t.operation_type||t.tool_parameters&&t.tool_parameters.operation_type}}truncateText(t,e){return!t||t.length<=e?t:t.substring(0,e)+"..."}formatOperationDetails(t){if(!t||"object"!=typeof t)return"";let e="";if(t.parameters&&t.parameters.command&&(e+=`<br><strong>Command:</strong> <code>${this.escapeHtml(t.parameters.command)}</code>`),void 0!==t.success&&(e+="<br><strong>Status:</strong> "+(t.success?"✅ Success":"❌ Failed")),void 0!==t.exit_code&&null!==t.exit_code&&(e+=`<br><strong>Exit Code:</strong> ${t.exit_code}`),void 0!==t.duration_ms&&null!==t.duration_ms){e+=`<br><strong>Duration:</strong> ${t.duration_ms>1e3?`${(t.duration_ms/1e3).toFixed(2)}s`:`${t.duration_ms}ms`}`}return t.error&&(e+=`<br><strong>Error:</strong> ${this.escapeHtml(this.truncateText(t.error,200))}`),e}escapeHtml(t){if(!t)return"";const e=document.createElement("div");return e.textContent=t,e.innerHTML}formatJSON(t){try{return JSON.stringify(t,null,2)}catch(e){return String(t)}}formatTimestamp(t){if(!t)return"Unknown time";try{return new Date(t).toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0})}catch(e){return"Invalid time"}}escapeHtml(t){if(!t)return"";const e=document.createElement("div");return e.textContent=t,e.innerHTML}formatFieldName(t){return t.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}extractToolName(t){if(t.tool_name)return t.tool_name;if(t.tool_parameters&&t.tool_parameters.tool_name)return t.tool_parameters.tool_name;if(t.tool_input&&t.tool_input.tool_name)return t.tool_input.tool_name;if(t.tool_parameters){if(t.tool_parameters.file_path||t.tool_parameters.notebook_path)return"FileOperation";if(t.tool_parameters.pattern)return"Search";if(t.tool_parameters.command)return"Bash";if(t.tool_parameters.todos)return"TodoWrite"}return null}extractAgent(t){if(t._agentName&&"Unknown Agent"!==t._agentName)return t._agentName;if(t._inference&&t._inference.agentName&&"Unknown"!==t._inference.agentName)return t._inference.agentName;if(t.agent)return t.agent;if(t.agent_type)return t.agent_type;if(t.agent_name)return t.agent_name;if(t.session_id&&"string"==typeof t.session_id){const e=t.session_id.split("_");if(e.length>1)return e[0].toUpperCase()}return t.todos||"TodoWrite"===t.tool_name?"PM":null}extractFileName(t){const e=this.extractFilePathFromHook(t);if(e){const t=e.split("/");return t[t.length-1]}return t.filename?t.filename:t.file?t.file:null}clear(){this.unifiedViewer&&this.unifiedViewer.clear(),this.showEmptyState()}showToolCall(t,e){if(!t)return void this.showEmptyState();const n=t.tool_name||"Unknown Tool",s=t.agent_type||"PM",o=this.formatTimestamp(t.timestamp),a=t.pre_event,r=t.post_event,i=a?.tool_parameters||{},l=a?this.extractToolTarget(n,i):"Unknown target",c=t.duration_ms?`${t.duration_ms}ms`:"-",d=void 0!==t.success?t.success:null;void 0!==t.exit_code&&t.exit_code;let p=t.result_summary||"No summary available";if("object"==typeof p&&null!==p){const t=[];void 0!==p.exit_code&&t.push(`Exit Code: ${p.exit_code}`),void 0!==p.has_output&&t.push("Has Output: "+(p.has_output?"Yes":"No")),void 0!==p.has_error&&t.push("Has Error: "+(p.has_error?"Yes":"No")),void 0!==p.output_lines&&t.push(`Output Lines: ${p.output_lines}`),p.output_preview&&t.push(`Output Preview: ${p.output_preview}`),p.error_preview&&t.push(`Error Preview: ${p.error_preview}`)}let u="⏳",m="Running...",h="tool-running";r&&(!0===d?(u="✅",m="Success",h="tool-success"):!1===d?(u="❌",m="Failed",h="tool-failure"):(u="⏳",m="Completed",h="tool-completed"));const g=`\n <div class="contextual-header">\n <h3 class="contextual-header-text">${n}: ${s} ${o}</h3>\n </div>\n `;if("TodoWrite"===n&&i.todos){const e=`\n <div class="todo-checklist">\n ${i.todos.map(t=>{const e=this.getTodoStatusIcon(t.status),n=this.getTodoPriorityIcon(t.priority);return`\n <div class="todo-item todo-${t.status||"pending"}">\n <span class="todo-status">${e}</span>\n <span class="todo-content">${t.content||"No content"}</span>\n <span class="todo-priority priority-${t.priority||"medium"}">${n}</span>\n </div>\n `}).join("")}\n </div>\n `,n={toolCall:t,preEvent:a,postEvent:r},s=this.createCollapsibleJsonSection(n);this.dataContainer&&(this.dataContainer.innerHTML=g+e+s),this.initializeJsonToggle()}else if("Grep"===n||"Search"===n||i&&i.pattern&&!i.file_path){const e=i.pattern||"No pattern specified",o=i.path||i.directory||".",l=i.type||i.glob||"all files";let d="";t.result_summary&&(d="string"==typeof t.result_summary?t.result_summary:t.result_summary.output_preview?t.result_summary.output_preview:JSON.stringify(t.result_summary,null,2));const p=`\n <div class="structured-view-section">\n <div class="tool-call-details">\n <div class="tool-call-info ${h}">\n <div class="structured-field">\n <strong>Tool Name:</strong> ${n}\n </div>\n <div class="structured-field">\n <strong>Agent:</strong> ${s}\n </div>\n <div class="structured-field">\n <strong>Status:</strong> ${u} ${m}\n </div>\n <div class="structured-field">\n <strong>Search Pattern:</strong> <code>${e}</code>\n </div>\n <div class="structured-field">\n <strong>Search Path:</strong> ${o}\n </div>\n <div class="structured-field">\n <strong>File Type:</strong> ${l}\n </div>\n <div class="structured-field">\n <strong>Started:</strong> ${new Date(t.timestamp).toLocaleString()}\n </div>\n ${c&&"-"!==c?`\n <div class="structured-field">\n <strong>Duration:</strong> ${c}\n </div>\n `:""}\n </div>\n\n <div class="search-view-action" style="margin-top: 20px;">\n <button class="btn-view-search" data-search-params='${JSON.stringify(i)}' data-search-results='${JSON.stringify(d).replace(/'/g,"&#39;")}' onclick="window.showSearchViewerModal(JSON.parse(this.getAttribute('data-search-params')), JSON.parse(this.getAttribute('data-search-results')))">\n 🔍 View Search Details\n </button>\n </div>\n\n ${this.createToolResultFromToolCall(t)}\n </div>\n </div>\n `,v={toolCall:t,preEvent:a,postEvent:r},y=this.createCollapsibleJsonSection(v);this.dataContainer&&(this.dataContainer.innerHTML=g+p+y),this.initializeJsonToggle()}else{const e=`\n <div class="structured-view-section">\n <div class="tool-call-details">\n <div class="tool-call-info ${h}">\n <div class="structured-field">\n <strong>Tool Name:</strong> ${n}\n </div>\n <div class="structured-field">\n <strong>Agent:</strong> ${s}\n </div>\n <div class="structured-field">\n <strong>Status:</strong> ${u} ${m}\n </div>\n <div class="structured-field">\n <strong>Target:</strong> ${l}\n </div>\n <div class="structured-field">\n <strong>Started:</strong> ${new Date(t.timestamp).toLocaleString()}\n </div>\n ${c&&"-"!==c?`\n <div class="structured-field">\n <strong>Duration:</strong> ${c}\n </div>\n `:""}\n ${t.session_id?`\n <div class="structured-field">\n <strong>Session ID:</strong> ${t.session_id}\n </div>\n `:""}\n </div>\n\n ${this.createToolResultFromToolCall(t)}\n </div>\n </div>\n `,o={toolCall:t,preEvent:a,postEvent:r},i=this.createCollapsibleJsonSection(o);this.dataContainer&&(this.dataContainer.innerHTML=g+e+i),this.initializeJsonToggle()}}showFileOperations(e,n){if(!e||!n)return void this.showEmptyState();this.unifiedViewer||(this.unifiedViewer=new t("module-data-content"));const s={file_path:n,operations:e.operations||[],lastOperation:e.lastOperation,...e};this.unifiedViewer.display(s,"file_operation");const o=document.querySelector(".module-data-header h5");if(o){const t=n.split("/").pop()||n;o.textContent=`📄 File: ${t}`}this.checkAndShowTrackControl(n)}showErrorMessage(t,e){const n=`\n <div class="module-error">\n <div class="error-header">\n <h3>❌ ${t}</h3>\n </div>\n <div class="error-message">\n <p>${e}</p>\n </div>\n </div>\n `,s={title:t,message:e},o=this.createCollapsibleJsonSection(s);this.dataContainer&&(this.dataContainer.innerHTML=n+o),this.initializeJsonToggle()}showAgentEvent(t,e){this.showAgentSpecificDetails(t,e)}showAgentSpecificDetails(t,e){if(!t)return void this.showEmptyState();const n=window.dashboard?.agentInference,s=window.dashboard?.eventViewer;if(!n||!s)return console.warn("AgentInference or EventViewer not available, falling back to single event view"),void this.showEventDetails(t);const o=n.getInferredAgentForEvent(t),a=o?.agentName||this.extractAgent(t)||"Unknown",r=s.events||[],i=this.getAgentSpecificEvents(r,a,n);console.log(`Showing details for agent: ${a}, found ${i.length} related events`);const l=this.extractAgentSpecificData(a,i);this.renderAgentSpecificView(a,l,t)}getAgentSpecificEvents(t,e,n){return t.filter(t=>{const s=n.getInferredAgentForEvent(t);return(s?.agentName||this.extractAgent(t)||"Unknown").toLowerCase()===e.toLowerCase()})}extractAgentSpecificData(t,e){const n={agentName:t,totalEvents:e.length,prompt:null,todos:[],toolsCalled:[],sessions:new Set,firstSeen:null,lastSeen:null,eventTypes:new Set};return e.forEach(e=>{const s=e.data||{},o=new Date(e.timestamp);(!n.firstSeen||o<n.firstSeen)&&(n.firstSeen=o),(!n.lastSeen||o>n.lastSeen)&&(n.lastSeen=o),(e.session_id||s.session_id)&&n.sessions.add(e.session_id||s.session_id);const a=e.hook_event_name||e.type||"unknown";if(n.eventTypes.add(a),"hook"===e.type&&"Task"===s.tool_name&&s.tool_parameters){const e=s.tool_parameters;e.prompt&&!n.prompt&&(n.prompt=e.prompt),e.description&&!n.description&&(n.description=e.description),e.subagent_type===t&&e.prompt&&(n.prompt=e.prompt)}if(!s.prompt||s.agent_type!==t&&s.subagent_type!==t||(n.prompt=s.prompt),"todo"===e.type||"hook"===e.type&&"TodoWrite"===s.tool_name){const t=s.todos||s.tool_parameters?.todos;t&&Array.isArray(t)&&t.forEach(t=>{const e=n.todos.findIndex(e=>e.id===t.id||e.content===t.content);e>=0?n.todos[e]={...n.todos[e],...t,timestamp:o}:n.todos.push({...t,timestamp:o})})}if("hook"===e.type&&s.tool_name){const t=e.subtype||s.event_type,a=this.generateToolCallId(s.tool_name,s.tool_parameters,o);"pre_tool"===t?(n._preToolEvents||(n._preToolEvents=new Map),n._preToolEvents.set(a,{toolName:s.tool_name,timestamp:o,target:this.extractToolTarget(s.tool_name,s.tool_parameters,null),parameters:s.tool_parameters})):"post_tool"===t&&(n._postToolEvents||(n._postToolEvents=new Map),n._postToolEvents.set(a,{toolName:s.tool_name,timestamp:o,success:s.success,duration:s.duration_ms,resultSummary:s.result_summary,exitCode:s.exit_code}))}}),n.todos.sort((t,e)=>(e.timestamp||0)-(t.timestamp||0)),n.toolsCalled=this.consolidateToolCalls(n._preToolEvents,n._postToolEvents),delete n._preToolEvents,delete n._postToolEvents,n.toolsCalled.sort((t,e)=>e.timestamp-t.timestamp),n}generateToolCallId(t,e,n){const s=Math.floor(n.getTime()/5e3);let o="";if(e){const t=[];e.file_path&&t.push(e.file_path),e.command&&t.push(e.command.substring(0,50)),e.pattern&&t.push(e.pattern),e.subagent_type&&t.push(e.subagent_type),e.notebook_path&&t.push(e.notebook_path),e.url&&t.push(e.url),e.prompt&&t.push(e.prompt.substring(0,30)),o=t.join("|")}return o||(o="default"),`${t}:${s}:${o}`}consolidateToolCalls(t,e){const n=[],s=new Set;t||(t=new Map),e||(e=new Map);for(const[o,a]of t){if(s.has(o))continue;const t=e.get(o),r={toolName:a.toolName,timestamp:a.timestamp,target:a.target,parameters:a.parameters,status:this.determineToolCallStatus(a,t),statusIcon:this.getToolCallStatusIcon(a,t),phase:t?"completed":"running"};t&&(r.success=t.success,r.duration=t.duration,r.resultSummary=t.resultSummary,r.exitCode=t.exitCode,r.completedAt=t.timestamp),n.push(r),s.add(o)}for(const[o,a]of e){if(s.has(o))continue;const t={toolName:a.toolName,timestamp:a.timestamp,target:"Unknown target",parameters:null,status:this.determineToolCallStatus(null,a),statusIcon:this.getToolCallStatusIcon(null,a),phase:"completed",success:a.success,duration:a.duration,resultSummary:a.resultSummary,exitCode:a.exitCode,completedAt:a.timestamp};n.push(t),s.add(o)}return n}determineToolCallStatus(t,e){return e?!0===e.success?"Success":!1===e.success?"Failed":0===e.exitCode?"Completed":2===e.exitCode?"Blocked":void 0!==e.exitCode&&0!==e.exitCode?"Error":"Completed":"Running..."}getToolCallStatusIcon(t,e){return e?!0===e.success?"✅":!1===e.success?"❌":0===e.exitCode?"✅":2===e.exitCode?"⚠️":void 0!==e.exitCode&&0!==e.exitCode?"❌":"✅":"⏳"}estimateTokenCount(t){if(!t||"string"!=typeof t)return 0;const e=t.trim().split(/\s+/).length,n=Math.ceil(t.length/4);return Math.max(1.3*e,n)}trimPromptWhitespace(t){return t&&"string"==typeof t?t=(t=(t=t.trim()).replace(/\n\s*\n\s*\n+/g,"\n\n")).split("\n").map(t=>t.replace(/\s+$/,"")).join("\n"):""}renderAgentSpecificView(t,e,n){const s=this.formatTimestamp(n.timestamp),o=`\n <div class="contextual-header">\n <h3 class="contextual-header-text">🤖 ${t} Agent Details ${s}</h3>\n </div>\n `;let a=`\n <div class="agent-overview-section">\n <div class="structured-data">\n ${this.createProperty("Agent Name",t)}\n ${this.createProperty("Total Events",e.totalEvents)}\n ${this.createProperty("Active Sessions",e.sessions.size)}\n ${this.createProperty("Event Types",Array.from(e.eventTypes).join(", "))}\n ${e.firstSeen?this.createProperty("First Seen",e.firstSeen.toLocaleString()):""}\n ${e.lastSeen?this.createProperty("Last Seen",e.lastSeen.toLocaleString()):""}\n </div>\n </div>\n `;if(e.prompt){const t=this.trimPromptWhitespace(e.prompt);a+=`\n <div class="agent-prompt-section">\n <div class="contextual-header">\n <h3 class="contextual-header-text">📝 Agent Task Prompt</h3>\n <div class="prompt-stats" style="font-size: 11px; color: #64748b; margin-top: 4px;">\n ~${Math.round(this.estimateTokenCount(t))} tokens • ${t.trim().split(/\s+/).length} words • ${t.length} characters\n </div>\n </div>\n <div class="structured-data">\n <div class="agent-prompt" style="white-space: pre-wrap; max-height: 300px; overflow-y: auto; padding: 10px; background: #f8fafc; border-radius: 6px; font-family: monospace; font-size: 12px; line-height: 1.4; border: 1px solid #e2e8f0;">\n ${this.escapeHtml(t)}\n </div>\n </div>\n </div>\n `}e.todos.length>0&&(a+=`\n <div class="agent-todos-section">\n <div class="contextual-header">\n <h3 class="contextual-header-text">✅ Agent Todo List (${e.todos.length} items)</h3>\n </div>\n <div class="todo-checklist">\n ${e.todos.map(t=>`\n <div class="todo-item todo-${t.status||"pending"}">\n <span class="todo-status">${this.getTodoStatusIcon(t.status)}</span>\n <span class="todo-content">${t.content||"No content"}</span>\n <span class="todo-priority priority-${t.priority||"medium"}">${this.getTodoPriorityIcon(t.priority)}</span>\n ${t.timestamp?`<span class="todo-timestamp">${new Date(t.timestamp).toLocaleTimeString()}</span>`:""}\n </div>\n `).join("")}\n </div>\n </div>\n `),e.toolsCalled.length>0&&(a+=`\n <div class="agent-tools-section">\n <div class="contextual-header">\n <h3 class="contextual-header-text">🔧 Tools Called by Agent (${e.toolsCalled.length} calls)</h3>\n </div>\n <div class="tools-list">\n ${e.toolsCalled.map(e=>{let n="";return"✅"===e.statusIcon?n="status-success":"❌"===e.statusIcon?n="status-failed":"⚠️"===e.statusIcon?n="status-blocked":"⏳"===e.statusIcon&&(n="status-running"),`\n <div class="tool-call-item">\n <div class="tool-call-header">\n <div style="display: flex; align-items: center; gap: 12px; flex: 1;">\n <span class="tool-name">🔧 ${e.toolName}</span>\n <span class="tool-agent">${t}</span>\n <span class="tool-status-indicator ${n}">${e.statusIcon} ${e.status}</span>\n </div>\n <span class="tool-timestamp" style="margin-left: auto;">${e.timestamp.toLocaleTimeString()}</span>\n </div>\n <div class="tool-call-details">\n ${e.target?`<span class="tool-target">Target: ${e.target}</span>`:""}\n ${e.duration?`<span class="tool-duration">Duration: ${e.duration}ms</span>`:""}\n ${e.completedAt&&e.completedAt!==e.timestamp?`<span class="tool-completed">Completed: ${e.completedAt.toLocaleTimeString()}</span>`:""}\n </div>\n </div>\n `}).join("")}\n </div>\n </div>\n `);const r={agentName:t,agentData:e,originalEvent:n},i=this.createCollapsibleJsonSection(r);this.dataContainer&&(this.dataContainer.innerHTML=o+a+i),this.initializeJsonToggle()}createToolResultFromToolCall(t){if(!t.result_summary)return"";const e={event_type:"post_tool",result_summary:t.result_summary,success:t.success,exit_code:t.exit_code},n=this.createInlineToolResultContent(e,{subtype:"post_tool"});return n.trim()?`\n <div class="tool-result-inline">\n <div class="structured-data">\n ${n}\n </div>\n </div>\n `:""}extractToolTarget(t,e,n){const s=e||n||{};switch(t?.toLowerCase()){case"write":case"read":case"edit":case"multiedit":return s.file_path||"Unknown file";case"bash":return s.command?`${s.command.substring(0,50)}${s.command.length>50?"...":""}`:"Unknown command";case"grep":return s.pattern?`Pattern: ${s.pattern}`:"Unknown pattern";case"glob":return s.pattern?`Pattern: ${s.pattern}`:"Unknown glob";case"todowrite":return`${s.todos?.length||0} todos`;case"task":return s.subagent_type||s.agent_type||"Subagent delegation";default:return s.file_path?s.file_path:s.pattern?`Pattern: ${s.pattern}`:s.command?`Command: ${s.command.substring(0,30)}...`:s.path?s.path:"Unknown target"}}getOperationIcon(t){return{read:"👁️",write:"✏️",edit:"📝",multiedit:"📝",create:"🆕",delete:"🗑️",move:"📦",copy:"📋"}[t?.toLowerCase()]||"📄"}getCurrentEvent(){return this.currentEvent}async checkAndShowTrackControl(t){if(t)try{const e=window.socket||window.dashboard?.socketClient?.socket;if(!e)return void console.warn("No socket connection available for git tracking check");let n=window.dashboard?.currentWorkingDir;if(!n||"Unknown"===n||""===n.trim()){const t=document.getElementById("footer-working-dir");n=t?.textContent?.trim()&&"Unknown"!==t.textContent.trim()?t.textContent.trim():".",console.log("[MODULE-VIEWER-DEBUG] Working directory fallback used:",n)}const s=new Promise((n,s)=>{const o=s=>{s.file_path===t&&(e.off("file_tracked_response",o),n(s))};e.on("file_tracked_response",o),setTimeout(()=>{e.off("file_tracked_response",o),s(new Error("Request timeout"))},5e3)});e.emit("check_file_tracked",{file_path:t,working_dir:n});const o=await s;this.displayTrackingStatus(t,o)}catch(e){console.error("Error checking file tracking status:",e),this.displayTrackingStatus(t,{success:!1,error:e.message,file_path:t})}}displayTrackingStatus(t,e){const n=`git-track-status-${t.replace(/[^a-zA-Z0-9]/g,"-")}`,s=document.getElementById(n);s&&(e.success&&!1===e.is_tracked?s.innerHTML=`\n <div class="untracked-file-notice">\n <span class="untracked-icon">⚠️</span>\n <span class="untracked-text">This file is not tracked by git</span>\n <button class="track-file-button"\n onclick="window.moduleViewer.trackFile('${t}')"\n title="Add this file to git tracking">\n <span class="git-icon">📁</span> Track File\n </button>\n </div>\n `:e.success&&!0===e.is_tracked?s.innerHTML='\n <div class="tracked-file-notice">\n <span class="tracked-icon">✅</span>\n <span class="tracked-text">This file is tracked by git</span>\n </div>\n ':e.success||(s.innerHTML=`\n <div class="tracking-error-notice">\n <span class="error-icon">❌</span>\n <span class="error-text">Could not check git status: ${e.error||"Unknown error"}</span>\n </div>\n `))}async trackFile(t){if(t)try{const e=window.socket||window.dashboard?.socketClient?.socket;if(!e)return void console.warn("No socket connection available for git add");let n=window.dashboard?.currentWorkingDir;if(!n||"Unknown"===n||""===n.trim()){const t=document.getElementById("footer-working-dir");n=t?.textContent?.trim()&&"Unknown"!==t.textContent.trim()?t.textContent.trim():".",console.log("[MODULE-VIEWER-DEBUG] Working directory fallback used:",n)}const s=`git-track-status-${t.replace(/[^a-zA-Z0-9]/g,"-")}`,o=document.getElementById(s);o&&(o.innerHTML='\n <div class="tracking-file-notice">\n <span class="loading-icon">⏳</span>\n <span class="loading-text">Adding file to git tracking...</span>\n </div>\n ');const a=new Promise((n,s)=>{const o=s=>{s.file_path===t&&(e.off("git_add_response",o),n(s))};e.on("git_add_response",o),setTimeout(()=>{e.off("git_add_response",o),s(new Error("Request timeout"))},1e4)});e.emit("git_add_file",{file_path:t,working_dir:n}),console.log("📁 Git add request sent:",{filePath:t,workingDir:n});const r=await a;console.log("📦 Git add result:",r),r.success?(o&&(o.innerHTML='\n <div class="tracked-file-notice">\n <span class="tracked-icon">✅</span>\n <span class="tracked-text">File successfully added to git tracking</span>\n </div>\n '),this.showNotification("File tracked successfully","success")):(o&&(o.innerHTML=`\n <div class="tracking-error-notice">\n <span class="error-icon">❌</span>\n <span class="error-text">Failed to track file: ${r.error||"Unknown error"}</span>\n <button class="track-file-button"\n onclick="window.moduleViewer.trackFile('${t}')"\n title="Try again">\n <span class="git-icon">📁</span> Retry\n </button>\n </div>\n `),this.showNotification(`Failed to track file: ${r.error}`,"error"))}catch(e){console.error("❌ Failed to track file:",e);const n=`git-track-status-${t.replace(/[^a-zA-Z0-9]/g,"-")}`,s=document.getElementById(n);s&&(s.innerHTML=`\n <div class="tracking-error-notice">\n <span class="error-icon">❌</span>\n <span class="error-text">Error: ${e.message}</span>\n <button class="track-file-button"\n onclick="window.moduleViewer.trackFile('${t}')"\n title="Try again">\n <span class="git-icon">📁</span> Retry\n </button>\n </div>\n `),this.showNotification(`Error tracking file: ${e.message}`,"error")}}showNotification(t,e="info"){const n=document.createElement("div");n.className=`notification notification-${e}`,n.innerHTML=`\n <span class="notification-icon">${"success"===e?"✅":"error"===e?"❌":"ℹ️"}</span>\n <span class="notification-message">${t}</span>\n `,n.style.cssText=`\n position: fixed;\n top: 20px;\n right: 20px;\n background: ${"success"===e?"#d4edda":"error"===e?"#f8d7da":"#d1ecf1"};\n color: ${"success"===e?"#155724":"error"===e?"#721c24":"#0c5460"};\n border: 1px solid ${"success"===e?"#c3e6cb":"error"===e?"#f5c6cb":"#bee5eb"};\n border-radius: 6px;\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 500;\n z-index: 2000;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n gap: 8px;\n max-width: 400px;\n animation: slideIn 0.3s ease-out;\n `;const s=document.createElement("style");s.textContent="\n @keyframes slideIn {\n from { transform: translateX(100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n @keyframes slideOut {\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(100%); opacity: 0; }\n }\n ",document.head.appendChild(s),document.body.appendChild(n),setTimeout(()=>{n.style.animation="slideOut 0.3s ease-in",setTimeout(()=>{n.parentNode&&n.parentNode.removeChild(n),s.parentNode&&s.parentNode.removeChild(s)},300)},5e3)}showAgentInstance(t){if(!t)return void this.showEmptyState();const e={type:"pm_delegation",subtype:t.agentName,agent_type:t.agentName,timestamp:t.timestamp,session_id:t.sessionId,metadata:{delegation_type:"explicit",event_count:t.agentEvents.length,pm_call:t.pmCall||null,agent_events:t.agentEvents}};console.log("Showing PM delegation details:",t),this.showAgentSpecificDetails(e,0)}showImpliedAgent(t){if(!t)return void this.showEmptyState();const e={type:"implied_delegation",subtype:t.agentName,agent_type:t.agentName,timestamp:t.timestamp,session_id:t.sessionId,metadata:{delegation_type:"implied",event_count:t.eventCount,pm_call:null,note:"No explicit PM call found - inferred from agent activity"}};console.log("Showing implied agent details:",t),this.showAgentSpecificDetails(e,0)}}window.ModuleViewer=e,window.enableToolResultDebugging=function(){window.DEBUG_TOOL_RESULTS=!0,console.log("🔧 Tool result debugging enabled. Click on tool events to see debug info.")},window.disableToolResultDebugging=function(){window.DEBUG_TOOL_RESULTS=!1,console.log("🔧 Tool result debugging disabled.")};export{e as M};
2
+ //# sourceMappingURL=module-viewer.js.map
@@ -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":if(s.name&&(s.params||s.tool_parameters)){const a=this.convertToolToFileOperation(s);this.displayFileOperation(a)}else 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":"Read"!==s.name&&"Write"!==s.name&&"Edit"!==s.name&&"MultiEdit"!==s.name&&"Grep"!==s.name&&"Glob"!==s.name||!s.params?.file_path&&!s.tool_parameters?.file_path?s.event_type&&(s.hook_name||s.subtype)?"hook":"generic":"file_operation":"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 t=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(t)} ${t}</span>\n </div>\n `;const n=s.tool_parameters||s.data?.tool_parameters;n&&(n.file_path&&(a+=`\n <div class="detail-row">\n <span class="detail-label">File:</span>\n <span class="detail-value code">${n.file_path}</span>\n </div>\n `),n.command&&(a+=`\n <div class="detail-row">\n <span class="detail-label">Command:</span>\n <pre class="code-snippet">${this.escapeHtml(n.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),t=s.name||s.agentName||"Unknown Agent",n=this.formatStatus(s.status);let e=`\n <div class="unified-viewer-header">\n <h6>${a} ${t}</h6>\n <span class="unified-viewer-status">${n}</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(n)}">${n}</span>\n </div>\n `,s.tools&&s.tools.length>0){const a=s.tools.filter(s=>"in_progress"===s.status),t=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, ${t.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",t=this.getToolIcon(a),n=this.formatStatus(s.status);if("TodoWrite"===a)return void this.displayTodoWriteTool(s);let e=`\n <div class="unified-viewer-header">\n <h6>${t} ${a}</h6>\n <span class="unified-viewer-status">${n}</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">${n}</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),t=(s.params||s.tool_parameters||{}).todos||[];let n=`\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(t.length>0){const s=this.getTodoStatusCounts(t);n+=`\n <div class="todo-status-line">\n <span class="status-inline">✅ ${s.completed} Done</span>\n <span class="status-inline">🔄 ${s.in_progress} Active</span>\n <span class="status-inline">⏳ ${s.pending} Pending</span>\n </div>\n `,n+='\n <div class="todo-list-primary">\n ',t.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="todo-item ${s.status}">\n <span class="todo-icon ${i}">${t}</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 `}),n+="\n </div>\n "}else n+='\n <div class="detail-row">\n <span class="detail-value">No todos in list</span>\n </div>\n ';s.callCount&&s.callCount>1&&(n+=`\n <div class="detail-row">\n <span class="detail-label">Updates:</span>\n <span class="detail-value">${s.callCount}</span>\n </div>\n `),n+=this.createCollapsibleJSON(s,"Full Details"),n+="</div>",this.container.innerHTML=n}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 t='\n <div class="unified-viewer-header">\n <h6>📋 Todo List</h6>\n </div>\n <div class="unified-viewer-content">\n ';a.length>0?(t+='\n <div class="todo-list-primary">\n ',a.forEach(s=>{const a=this.getCheckboxIcon(s.status),n="in_progress"===s.status&&s.activeForm||s.content,e=this.formatStatusClass(s.status);t+=`\n <div class="todo-item ${s.status}">\n <span class="todo-icon ${e}">${a}</span>\n <span class="todo-text">${this.escapeHtml(n)}</span>\n <span class="todo-status-text ${e}">${s.status.replace("_"," ")}</span>\n </div>\n `}),t+="\n </div>\n "):t+='\n <div class="detail-section">\n <div class="no-todos">No todo items found</div>\n </div>\n ',t+="</div>",this.container.innerHTML=t}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?s.file_path.split("/").pop():"Unknown File"}</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="primary-data">\n <div class="detail-row highlight">\n <span class="detail-label">📁 File Path:</span>\n <span class="detail-value code">${s.file_path}</span>\n </div>\n `;s.file_path&&(a+=`\n <div class="file-actions">\n <button class="file-action-btn view-file-btn" \n onclick="window.showFileViewerModal && window.showFileViewerModal('${s.file_path}')"\n title="View file contents with syntax highlighting">\n 👁️ View File Contents\n </button>\n </div>\n `),a+="</div>",s.operations&&Array.isArray(s.operations)&&(a+=`\n <div class="detail-section">\n <span class="detail-section-title">Operations (${s.operations.length}):</span>\n <div class="operations-list">\n ${s.operations.map((s,a)=>`\n <div class="operation-item">\n <div class="operation-header">\n <span class="operation-type">${this.getOperationIcon(s.operation)} ${s.operation}</span>\n <span class="operation-timestamp">${this.formatTimestamp(s.timestamp)}</span>\n </div>\n <div class="operation-details">\n <span class="operation-agent">by ${s.agent||"Unknown"}</span>\n ${s.workingDirectory?`<span class="operation-dir">in ${s.workingDirectory}</span>`:""}\n </div>\n </div>\n `).join("")}\n </div>\n </div>\n `),a+=this.createCollapsibleJSON(s,"Full File Data"),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 t=["id","name","type","status","timestamp","text","content","message"];for(let n of t)if(void 0!==s[n]){let t=s[n];"string"==typeof t&&t.length>200&&(t=t.substring(0,200)+"..."),a+=`\n <div class="detail-row">\n <span class="detail-label">${n}:</span>\n <span class="detail-value">${this.escapeHtml(String(t))}</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||{},t=s.subtype||s.event_type||"unknown";let n=`\n <div class="detail-row">\n <span class="detail-label">Hook Type:</span>\n <span class="detail-value">${t}</span>\n </div>\n `;switch(t){case"user_prompt":const s=a.prompt_text||a.prompt_preview||"";n+=`\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":n+=`\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&&(n+=`\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"===t&&a.duration_ms&&(n+=`\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":n+=`\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"===t&&a.prompt&&(n+=`\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"===t&&a.reason&&(n+=`\n <div class="detail-row">\n <span class="detail-label">Reason:</span>\n <span class="detail-value">${a.reason}</span>\n </div>\n `)}return n}formatAgentEventDetails(s){const a=s.data||{};let t="";return(a.agent_type||a.name)&&(t+=`\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&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Action:</span>\n <span class="detail-value">${s.subtype}</span>\n </div>\n `),t}formatTodoEventDetails(s){const a=s.data||{};let t="";if(a.todos&&Array.isArray(a.todos)){const s=this.getTodoStatusCounts(a.todos);t+=`\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 t}formatSessionEventDetails(s){const a=s.data||{};let t="";return a.session_id&&(t+=`\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&&(t+=`\n <div class="detail-row">\n <span class="detail-label">Action:</span>\n <span class="detail-value">${s.subtype}</span>\n </div>\n `),t}formatGenericEventDetails(s){const a=s.data||{};let t="";const n=["message","description","value","result"];for(let e of n)if(void 0!==a[e]){let s=a[e];"string"==typeof s&&s.length>200&&(s=s.substring(0,200)+"..."),t+=`\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 t}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 t=Object.keys(s);return`\n <div class="detail-section">\n <span class="detail-section-title">${a} (${t.length}):</span>\n <div class="params-list">\n ${t.map(a=>{const t=s[a];return`\n <div class="param-item">\n <div class="param-key">${a}:</div>\n <div class="param-value">${this.formatParameterValue(t)}</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 t=`\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 n=this.getCheckboxIcon(s.status),e="in_progress"===s.status&&s.activeForm||s.content,i=this.formatStatusClass(s.status);t+=`\n <div class="param-todo-item ${s.status}">\n <div class="param-todo-checkbox">\n <span class="param-checkbox-icon ${i}">${n}</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 `}),t+="\n </div>\n </div>\n ",t}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]||"❓"}getOperationIcon(s){return{read:"👁️",write:"✍️",edit:"✏️",delete:"🗑️",create:"📝",search:"🔍",list:"📂",copy:"📋",move:"📦",bash:"💻"}[s.toLowerCase()]||"📄"}convertToolToFileOperation(s){const a=s.params||s.tool_parameters||{},t=a.file_path||a.path||a.notebook_path;if(!t)return s;const n={operation:s.name.toLowerCase(),timestamp:s.timestamp||(new Date).toISOString(),agent:"Activity Tool",sessionId:s.sessionId||"unknown",details:{parameters:a,tool_name:s.name,status:s.status||"completed"}};return{file_path:t,operations:[n],lastOperation:n.timestamp,originalTool: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 t=`json-details-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,n=this.cleanDataForDisplay(s);return`\n <div class="collapsible-json-section">\n <button class="collapsible-json-toggle" onclick="\n const content = document.getElementById('${t}');\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="${t}" class="collapsible-json-content" style="display: none;">\n <pre class="json-viewer">${this.escapeHtml(JSON.stringify(n,null,2))}</pre>\n </div>\n </div>\n `}cleanDataForDisplay(s){const a=new WeakSet;return JSON.parse(JSON.stringify(s,(s,t)=>{if("object"==typeof t&&null!==t){if(a.has(t))return"[Circular Reference]";a.add(t)}return"string"==typeof t&&t.length>1e3?t.substring(0,1e3)+"... [truncated]":"function"==typeof t?"[Function]":t}))}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.js.map