claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (502) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +38 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Unified Data Viewer Component
3
- *
3
+ *
4
4
  * Consolidates all data formatting and display logic from event-driven tabs
5
5
  * (Activity, Events, Agents) into a single, reusable component.
6
- *
6
+ *
7
7
  * WHY: Eliminates code duplication across multiple components and provides
8
8
  * consistent data display formatting throughout the dashboard.
9
- *
9
+ *
10
10
  * DESIGN DECISION: Auto-detects data type and applies appropriate formatting,
11
11
  * while allowing manual type specification for edge cases.
12
12
  */
@@ -16,21 +16,21 @@ class UnifiedDataViewer {
16
16
  this.container = document.getElementById(containerId);
17
17
  this.currentData = null;
18
18
  this.currentType = null;
19
-
19
+
20
20
  // Global JSON visibility state - synchronized with localStorage
21
21
  // This ensures all JSON sections maintain consistent state
22
22
  this.globalJsonExpanded = localStorage.getItem('dashboard-json-expanded') === 'true';
23
-
23
+
24
24
  // Separate state for "Full Event Data" sections - uses its own localStorage key
25
25
  // This allows independent control of Full Event Data visibility
26
26
  this.fullEventDataExpanded = localStorage.getItem('dashboard-full-event-expanded') === 'true';
27
-
27
+
28
28
  // Listen for global JSON toggle changes from other components
29
29
  document.addEventListener('jsonToggleChanged', (e) => {
30
30
  this.globalJsonExpanded = e.detail.expanded;
31
31
  this.updateAllJsonSections();
32
32
  });
33
-
33
+
34
34
  // Listen for full event data toggle changes
35
35
  document.addEventListener('fullEventToggleChanged', (e) => {
36
36
  this.fullEventDataExpanded = e.detail.expanded;
@@ -111,16 +111,16 @@ class UnifiedDataViewer {
111
111
  return 'event';
112
112
  }
113
113
 
114
- // Agent detection
115
- if (data.agent_name || data.agentName ||
114
+ // Agent detection
115
+ if (data.agent_name || data.agentName ||
116
116
  (data.name && (data.status === 'active' || data.status === 'completed'))) {
117
117
  return 'agent';
118
118
  }
119
119
 
120
120
  // Tool detection - PRIORITY: Check if it's a tool first
121
121
  // This includes TodoWrite tools which should always be displayed as tools, not todos
122
- if (data.tool_name || data.name === 'TodoWrite' || data.name === 'Read' ||
123
- data.tool_parameters || (data.params && data.icon) ||
122
+ if (data.tool_name || data.name === 'TodoWrite' || data.name === 'Read' ||
123
+ data.tool_parameters || (data.params && data.icon) ||
124
124
  (data.name && data.type === 'tool')) {
125
125
  return 'tool';
126
126
  }
@@ -151,7 +151,7 @@ class UnifiedDataViewer {
151
151
  }
152
152
 
153
153
  // File tool detection - handle file tools as file operations when they have file_path
154
- if ((data.name === 'Read' || data.name === 'Write' || data.name === 'Edit' ||
154
+ if ((data.name === 'Read' || data.name === 'Write' || data.name === 'Edit' ||
155
155
  data.name === 'MultiEdit' || data.name === 'Grep' || data.name === 'Glob') &&
156
156
  (data.params?.file_path || data.tool_parameters?.file_path)) {
157
157
  // Convert file tool to file operation format for better display
@@ -174,7 +174,7 @@ class UnifiedDataViewer {
174
174
  displayEvent(data) {
175
175
  const eventType = this.formatEventType(data);
176
176
  const timestamp = this.formatTimestamp(data.timestamp);
177
-
177
+
178
178
  let html = `
179
179
  <div class="unified-viewer-header">
180
180
  <h6>${eventType}</h6>
@@ -186,7 +186,7 @@ class UnifiedDataViewer {
186
186
  // PRIMARY DATA: Event-specific key details
187
187
  html += `<div class="primary-data">`;
188
188
  html += this.formatEventDetails(data);
189
-
189
+
190
190
  // Show important tool parameters inline if present
191
191
  if (data.tool_name || data.data?.tool_name) {
192
192
  const toolName = data.tool_name || data.data.tool_name;
@@ -196,7 +196,7 @@ class UnifiedDataViewer {
196
196
  <span class="detail-value">${this.getToolIcon(toolName)} ${toolName}</span>
197
197
  </div>
198
198
  `;
199
-
199
+
200
200
  // Show key parameters for specific tools
201
201
  const params = data.tool_parameters || data.data?.tool_parameters;
202
202
  if (params) {
@@ -236,7 +236,7 @@ class UnifiedDataViewer {
236
236
  const agentIcon = this.getAgentIcon(data.name || data.agentName);
237
237
  const agentName = data.name || data.agentName || 'Unknown Agent';
238
238
  const status = this.formatStatus(data.status);
239
-
239
+
240
240
  let html = `
241
241
  <div class="unified-viewer-header">
242
242
  <h6>${agentIcon} ${agentName}</h6>
@@ -247,7 +247,7 @@ class UnifiedDataViewer {
247
247
 
248
248
  // PRIMARY DATA: Key agent information
249
249
  html += `<div class="primary-data">`;
250
-
250
+
251
251
  // Status with visual indicator
252
252
  html += `
253
253
  <div class="detail-row highlight">
@@ -261,7 +261,7 @@ class UnifiedDataViewer {
261
261
  // Show active tools prominently
262
262
  const activeTools = data.tools.filter(t => t.status === 'in_progress');
263
263
  const completedTools = data.tools.filter(t => t.status === 'completed');
264
-
264
+
265
265
  if (activeTools.length > 0) {
266
266
  html += `
267
267
  <div class="active-tools-section">
@@ -277,7 +277,7 @@ class UnifiedDataViewer {
277
277
  });
278
278
  html += `</div></div>`;
279
279
  }
280
-
280
+
281
281
  html += `
282
282
  <div class="detail-row">
283
283
  <span class="detail-label">Tools Summary:</span>
@@ -297,7 +297,7 @@ class UnifiedDataViewer {
297
297
  </div>
298
298
  `;
299
299
  }
300
-
300
+
301
301
  html += `</div>`;
302
302
 
303
303
  // SECONDARY DATA: Collapsible JSON viewer
@@ -315,13 +315,13 @@ class UnifiedDataViewer {
315
315
  const toolName = data.name || data.tool_name || 'Unknown Tool';
316
316
  const toolIcon = this.getToolIcon(toolName);
317
317
  const status = this.formatStatus(data.status);
318
-
318
+
319
319
  // Special handling for TodoWrite tool
320
320
  if (toolName === 'TodoWrite') {
321
321
  this.displayTodoWriteTool(data);
322
322
  return;
323
323
  }
324
-
324
+
325
325
  let html = `
326
326
  <div class="unified-viewer-header">
327
327
  <h6>${toolIcon} ${toolName}</h6>
@@ -332,7 +332,7 @@ class UnifiedDataViewer {
332
332
 
333
333
  // PRIMARY DATA: Show important tool-specific information first
334
334
  const params = data.params || data.tool_parameters || {};
335
-
335
+
336
336
  // Tool-specific primary data display
337
337
  if (toolName === 'Read' || toolName === 'Edit' || toolName === 'Write') {
338
338
  // File tools - show file path prominently
@@ -435,7 +435,7 @@ class UnifiedDataViewer {
435
435
 
436
436
  // Collapsible JSON viewer for full details
437
437
  html += this.createCollapsibleJSON(data, 'Full Tool Details');
438
-
438
+
439
439
  html += '</div>';
440
440
  this.container.innerHTML = html;
441
441
  }
@@ -447,7 +447,7 @@ class UnifiedDataViewer {
447
447
  const status = this.formatStatus(data.status);
448
448
  const params = data.params || data.tool_parameters || {};
449
449
  const todos = params.todos || [];
450
-
450
+
451
451
  let html = `
452
452
  <div class="unified-viewer-header">
453
453
  <h6>📝 TodoWrite</h6>
@@ -459,7 +459,7 @@ class UnifiedDataViewer {
459
459
  // PRIMARY DATA: Todo list and status summary immediately after title
460
460
  if (todos.length > 0) {
461
461
  const statusCounts = this.getTodoStatusCounts(todos);
462
-
462
+
463
463
  // Status summary - horizontal single line format
464
464
  html += `
465
465
  <div class="todo-status-line">
@@ -473,13 +473,13 @@ class UnifiedDataViewer {
473
473
  html += `
474
474
  <div class="todo-list-primary">
475
475
  `;
476
-
476
+
477
477
  todos.forEach((todo, index) => {
478
478
  const statusIcon = this.getCheckboxIcon(todo.status);
479
- const displayText = todo.status === 'in_progress' ?
479
+ const displayText = todo.status === 'in_progress' ?
480
480
  (todo.activeForm || todo.content) : todo.content;
481
481
  const statusClass = this.formatStatusClass(todo.status);
482
-
482
+
483
483
  html += `
484
484
  <div class="todo-item ${todo.status}">
485
485
  <span class="todo-icon ${statusClass}">${statusIcon}</span>
@@ -488,7 +488,7 @@ class UnifiedDataViewer {
488
488
  </div>
489
489
  `;
490
490
  });
491
-
491
+
492
492
  html += `
493
493
  </div>
494
494
  `;
@@ -512,7 +512,7 @@ class UnifiedDataViewer {
512
512
 
513
513
  // Collapsible JSON viewer for full details
514
514
  html += this.createCollapsibleJSON(data, 'Full Details');
515
-
515
+
516
516
  html += '</div>';
517
517
  this.container.innerHTML = html;
518
518
  }
@@ -524,7 +524,7 @@ class UnifiedDataViewer {
524
524
  // Handle different data structures for standalone todos
525
525
  let todos;
526
526
  let toolName = 'Todo List';
527
-
527
+
528
528
  if (data.todos && Array.isArray(data.todos)) {
529
529
  todos = data.todos;
530
530
  } else if (Array.isArray(data)) {
@@ -534,7 +534,7 @@ class UnifiedDataViewer {
534
534
  } else {
535
535
  todos = [];
536
536
  }
537
-
537
+
538
538
  let html = `
539
539
  <div class="unified-viewer-header">
540
540
  <h6>📋 ${toolName}</h6>
@@ -547,13 +547,13 @@ class UnifiedDataViewer {
547
547
  html += `
548
548
  <div class="todo-list-primary">
549
549
  `;
550
-
550
+
551
551
  todos.forEach((todo) => {
552
552
  const statusIcon = this.getCheckboxIcon(todo.status);
553
- const displayText = todo.status === 'in_progress' ?
553
+ const displayText = todo.status === 'in_progress' ?
554
554
  (todo.activeForm || todo.content) : todo.content;
555
555
  const statusClass = this.formatStatusClass(todo.status);
556
-
556
+
557
557
  html += `
558
558
  <div class="todo-item ${todo.status}">
559
559
  <span class="todo-icon ${statusClass}">${statusIcon}</span>
@@ -562,7 +562,7 @@ class UnifiedDataViewer {
562
562
  </div>
563
563
  `;
564
564
  });
565
-
565
+
566
566
  html += `
567
567
  </div>
568
568
  `;
@@ -591,7 +591,7 @@ class UnifiedDataViewer {
591
591
  </div>
592
592
  <div class="unified-viewer-content">
593
593
  `;
594
-
594
+
595
595
  // PRIMARY DATA: The instruction text itself
596
596
  html += `
597
597
  <div class="primary-data">
@@ -609,7 +609,7 @@ class UnifiedDataViewer {
609
609
  if (Object.keys(data).length > 3) {
610
610
  html += this.createCollapsibleJSON(data, 'Full Instruction Data');
611
611
  }
612
-
612
+
613
613
  html += '</div>';
614
614
  this.container.innerHTML = html;
615
615
  }
@@ -673,7 +673,7 @@ class UnifiedDataViewer {
673
673
  const isSingleFile = this.isSingleFileOperation(data);
674
674
  const fileIcon = this.getFileIcon(data.file_path);
675
675
  const fileType = this.getFileType(data.file_path);
676
-
676
+
677
677
  let html = `
678
678
  <div class="unified-viewer-header ${isSingleFile ? 'single-file-header' : ''}">
679
679
  <h6>${fileIcon} File: ${fileName}</h6>
@@ -684,7 +684,7 @@ class UnifiedDataViewer {
684
684
  <div class="primary-data">
685
685
  <div class="detail-row highlight">
686
686
  <span class="detail-label">📁 File Path:</span>
687
- <span class="detail-value code clickable-file-path"
687
+ <span class="detail-value code clickable-file-path"
688
688
  onclick="window.showFileViewerModal && window.showFileViewerModal('${data.file_path}')"
689
689
  title="Click to view file contents\\nKeyboard: Hover + V key or Ctrl/Cmd + Click\\nFile: ${data.file_path}"
690
690
  tabindex="0"
@@ -697,16 +697,16 @@ class UnifiedDataViewer {
697
697
  // Enhanced file viewing for single file operations
698
698
  if (data.file_path) {
699
699
  const shouldShowPreview = this.shouldShowInlinePreview(data);
700
-
700
+
701
701
  html += `
702
702
  <div class="file-actions ${isSingleFile ? 'single-file-actions' : ''}">
703
- <button class="file-action-btn view-file-btn ${isSingleFile ? 'primary-action' : ''}"
703
+ <button class="file-action-btn view-file-btn ${isSingleFile ? 'primary-action' : ''}"
704
704
  onclick="window.showFileViewerModal && window.showFileViewerModal('${data.file_path}')"
705
705
  title="View file contents with syntax highlighting">
706
706
  ${fileIcon} View File Contents
707
707
  </button>
708
708
  ${isSingleFile && this.isTextFile(data.file_path) ? `
709
- <button class="file-action-btn inline-preview-btn"
709
+ <button class="file-action-btn inline-preview-btn"
710
710
  onclick="window.unifiedDataViewer && window.unifiedDataViewer.toggleInlinePreview('${data.file_path}', this)"
711
711
  title="Toggle inline preview">
712
712
  📖 Quick Preview
@@ -714,7 +714,7 @@ class UnifiedDataViewer {
714
714
  ` : ''}
715
715
  </div>
716
716
  `;
717
-
717
+
718
718
  // Add inline preview container for single file operations
719
719
  if (isSingleFile && shouldShowPreview) {
720
720
  const previewId = this.generatePreviewId(data.file_path);
@@ -762,7 +762,7 @@ class UnifiedDataViewer {
762
762
  */
763
763
  displayHook(data) {
764
764
  const hookType = data.event_type || data.subtype || 'unknown';
765
-
765
+
766
766
  let html = `
767
767
  <div class="unified-viewer-header">
768
768
  <h6>🔗 Hook: ${hookType}</h6>
@@ -791,14 +791,14 @@ class UnifiedDataViewer {
791
791
  if (typeof data === 'object' && data !== null) {
792
792
  // Display meaningful properties
793
793
  const meaningfulProps = ['id', 'name', 'type', 'status', 'timestamp', 'text', 'content', 'message'];
794
-
794
+
795
795
  for (let prop of meaningfulProps) {
796
796
  if (data[prop] !== undefined) {
797
797
  let value = data[prop];
798
798
  if (typeof value === 'string' && value.length > 200) {
799
799
  value = value.substring(0, 200) + '...';
800
800
  }
801
-
801
+
802
802
  html += `
803
803
  <div class="detail-row">
804
804
  <span class="detail-label">${prop}:</span>
@@ -837,7 +837,7 @@ class UnifiedDataViewer {
837
837
  */
838
838
  formatEventDetails(event) {
839
839
  const data = event.data || {};
840
-
840
+
841
841
  switch (event.type) {
842
842
  case 'hook':
843
843
  return this.formatHookDetails(event);
@@ -858,7 +858,7 @@ class UnifiedDataViewer {
858
858
  formatHookDetails(event) {
859
859
  const data = event.data || {};
860
860
  const hookType = event.subtype || event.event_type || 'unknown';
861
-
861
+
862
862
  let html = `
863
863
  <div class="detail-row">
864
864
  <span class="detail-label">Hook Type:</span>
@@ -1048,7 +1048,7 @@ class UnifiedDataViewer {
1048
1048
  formatEventData(event) {
1049
1049
  const data = event.data;
1050
1050
  if (!data || Object.keys(data).length === 0) return '';
1051
-
1051
+
1052
1052
  return `
1053
1053
  <div class="detail-section">
1054
1054
  <span class="detail-section-title">Event Data:</span>
@@ -1104,11 +1104,11 @@ class UnifiedDataViewer {
1104
1104
  }
1105
1105
  } else if (typeof value === 'object' && value !== null) {
1106
1106
  // Special handling for todos array - display as formatted list instead of raw JSON
1107
- if (Array.isArray(value) && value.length > 0 &&
1107
+ if (Array.isArray(value) && value.length > 0 &&
1108
1108
  value[0].hasOwnProperty('content') && value[0].hasOwnProperty('status')) {
1109
1109
  return this.formatTodosAsParameter(value);
1110
1110
  }
1111
-
1111
+
1112
1112
  try {
1113
1113
  return `<pre class="param-json">${this.escapeHtml(JSON.stringify(value, null, 2))}</pre>`;
1114
1114
  } catch (e) {
@@ -1124,7 +1124,7 @@ class UnifiedDataViewer {
1124
1124
  */
1125
1125
  formatTodosAsParameter(todos) {
1126
1126
  const statusCounts = this.getTodoStatusCounts(todos);
1127
-
1127
+
1128
1128
  let html = `
1129
1129
  <div class="param-todos">
1130
1130
  <div class="param-todos-header">
@@ -1135,13 +1135,13 @@ class UnifiedDataViewer {
1135
1135
  </div>
1136
1136
  <div class="param-todos-list">
1137
1137
  `;
1138
-
1138
+
1139
1139
  todos.forEach((todo, index) => {
1140
1140
  const statusIcon = this.getCheckboxIcon(todo.status);
1141
- const displayText = todo.status === 'in_progress' ?
1141
+ const displayText = todo.status === 'in_progress' ?
1142
1142
  (todo.activeForm || todo.content) : todo.content;
1143
1143
  const statusClass = this.formatStatusClass(todo.status);
1144
-
1144
+
1145
1145
  html += `
1146
1146
  <div class="param-todo-item ${todo.status}">
1147
1147
  <div class="param-todo-checkbox">
@@ -1154,12 +1154,12 @@ class UnifiedDataViewer {
1154
1154
  </div>
1155
1155
  `;
1156
1156
  });
1157
-
1157
+
1158
1158
  html += `
1159
1159
  </div>
1160
1160
  </div>
1161
1161
  `;
1162
-
1162
+
1163
1163
  return html;
1164
1164
  }
1165
1165
 
@@ -1179,7 +1179,7 @@ class UnifiedDataViewer {
1179
1179
  */
1180
1180
  getFileIcon(filePath) {
1181
1181
  if (!filePath) return '📄';
1182
-
1182
+
1183
1183
  const ext = filePath.split('.').pop()?.toLowerCase();
1184
1184
  const iconMap = {
1185
1185
  // Code files
@@ -1199,7 +1199,7 @@ class UnifiedDataViewer {
1199
1199
  'swift': '🦉',
1200
1200
  'kt': '🅺',
1201
1201
  'scala': '🎯',
1202
-
1202
+
1203
1203
  // Web files
1204
1204
  'html': '🌐',
1205
1205
  'htm': '🌐',
@@ -1208,7 +1208,7 @@ class UnifiedDataViewer {
1208
1208
  'sass': '🎨',
1209
1209
  'less': '🎨',
1210
1210
  'vue': '💚',
1211
-
1211
+
1212
1212
  // Config files
1213
1213
  'json': '📋',
1214
1214
  'xml': '📄',
@@ -1218,7 +1218,7 @@ class UnifiedDataViewer {
1218
1218
  'ini': '⚙️',
1219
1219
  'conf': '⚙️',
1220
1220
  'config': '⚙️',
1221
-
1221
+
1222
1222
  // Documentation
1223
1223
  'md': '📝',
1224
1224
  'txt': '📃',
@@ -1226,7 +1226,7 @@ class UnifiedDataViewer {
1226
1226
  'pdf': '📕',
1227
1227
  'doc': '📘',
1228
1228
  'docx': '📘',
1229
-
1229
+
1230
1230
  // Images
1231
1231
  'jpg': '🖼️',
1232
1232
  'jpeg': '🖼️',
@@ -1235,14 +1235,14 @@ class UnifiedDataViewer {
1235
1235
  'svg': '🎨',
1236
1236
  'webp': '🖼️',
1237
1237
  'ico': '🖼️',
1238
-
1238
+
1239
1239
  // Archives
1240
1240
  'zip': '🗜️',
1241
1241
  'tar': '🗜️',
1242
1242
  'gz': '🗜️',
1243
1243
  'rar': '🗜️',
1244
1244
  '7z': '🗜️',
1245
-
1245
+
1246
1246
  // Other
1247
1247
  'sql': '🗃️',
1248
1248
  'db': '🗃️',
@@ -1250,7 +1250,7 @@ class UnifiedDataViewer {
1250
1250
  'env': '🔐',
1251
1251
  'lock': '🔒'
1252
1252
  };
1253
-
1253
+
1254
1254
  return iconMap[ext] || '📄';
1255
1255
  }
1256
1256
 
@@ -1259,7 +1259,7 @@ class UnifiedDataViewer {
1259
1259
  */
1260
1260
  getFileType(filePath) {
1261
1261
  if (!filePath) return null;
1262
-
1262
+
1263
1263
  const ext = filePath.split('.').pop()?.toLowerCase();
1264
1264
  const typeMap = {
1265
1265
  'js': 'JavaScript',
@@ -1287,7 +1287,7 @@ class UnifiedDataViewer {
1287
1287
  'sql': 'SQL',
1288
1288
  'log': 'Log File'
1289
1289
  };
1290
-
1290
+
1291
1291
  return typeMap[ext] || null;
1292
1292
  }
1293
1293
 
@@ -1304,7 +1304,7 @@ class UnifiedDataViewer {
1304
1304
  */
1305
1305
  isTextFile(filePath) {
1306
1306
  if (!filePath) return false;
1307
-
1307
+
1308
1308
  const ext = filePath.split('.').pop()?.toLowerCase();
1309
1309
  const textExtensions = [
1310
1310
  'txt', 'md', 'json', 'xml', 'yaml', 'yml', 'ini', 'conf', 'config',
@@ -1312,7 +1312,7 @@ class UnifiedDataViewer {
1312
1312
  'go', 'rs', 'swift', 'kt', 'scala', 'html', 'htm', 'css', 'scss', 'sass',
1313
1313
  'less', 'vue', 'sql', 'log', 'env', 'gitignore', 'dockerignore'
1314
1314
  ];
1315
-
1315
+
1316
1316
  return textExtensions.includes(ext);
1317
1317
  }
1318
1318
 
@@ -1322,12 +1322,12 @@ class UnifiedDataViewer {
1322
1322
  async toggleInlinePreview(filePath, buttonElement) {
1323
1323
  const containerId = `preview-${this.generatePreviewId(filePath)}`;
1324
1324
  const container = document.getElementById(containerId);
1325
-
1325
+
1326
1326
  if (!container) {
1327
1327
  console.warn('Preview container not found');
1328
1328
  return;
1329
1329
  }
1330
-
1330
+
1331
1331
  if (container.style.display === 'none') {
1332
1332
  // Show preview
1333
1333
  container.style.display = 'block';
@@ -1389,7 +1389,7 @@ class UnifiedDataViewer {
1389
1389
  */
1390
1390
  formatTimestamp(timestamp) {
1391
1391
  if (!timestamp) return 'Unknown time';
1392
-
1392
+
1393
1393
  try {
1394
1394
  const date = new Date(timestamp);
1395
1395
  if (isNaN(date.getTime())) return 'Invalid date';
@@ -1404,16 +1404,16 @@ class UnifiedDataViewer {
1404
1404
  */
1405
1405
  formatStatus(status) {
1406
1406
  if (!status) return 'unknown';
1407
-
1407
+
1408
1408
  const statusMap = {
1409
1409
  'active': '🟢 Active',
1410
- 'completed': '✅ Completed',
1410
+ 'completed': '✅ Completed',
1411
1411
  'in_progress': '🔄 In Progress',
1412
1412
  'pending': '⏳ Pending',
1413
1413
  'error': '❌ Error',
1414
1414
  'failed': '❌ Failed'
1415
1415
  };
1416
-
1416
+
1417
1417
  return statusMap[status] || status;
1418
1418
  }
1419
1419
 
@@ -1450,7 +1450,7 @@ class UnifiedDataViewer {
1450
1450
  getToolIcon(toolName) {
1451
1451
  const icons = {
1452
1452
  'Read': '👁️',
1453
- 'Write': '✍️',
1453
+ 'Write': '✍️',
1454
1454
  'Edit': '✏️',
1455
1455
  'MultiEdit': '📝',
1456
1456
  'Bash': '💻',
@@ -1501,7 +1501,7 @@ class UnifiedDataViewer {
1501
1501
  convertToolToFileOperation(toolData) {
1502
1502
  const params = toolData.params || toolData.tool_parameters || {};
1503
1503
  const filePath = params.file_path || params.path || params.notebook_path;
1504
-
1504
+
1505
1505
  if (!filePath) {
1506
1506
  return toolData; // Return original if no file path
1507
1507
  }
@@ -1533,13 +1533,13 @@ class UnifiedDataViewer {
1533
1533
  */
1534
1534
  getTodoStatusCounts(todos) {
1535
1535
  const counts = { completed: 0, in_progress: 0, pending: 0 };
1536
-
1536
+
1537
1537
  todos.forEach(todo => {
1538
1538
  if (counts.hasOwnProperty(todo.status)) {
1539
1539
  counts[todo.status]++;
1540
1540
  }
1541
1541
  });
1542
-
1542
+
1543
1543
  return counts;
1544
1544
  }
1545
1545
 
@@ -1548,12 +1548,12 @@ class UnifiedDataViewer {
1548
1548
  */
1549
1549
  escapeHtml(text) {
1550
1550
  if (typeof text !== 'string') return '';
1551
-
1551
+
1552
1552
  const div = document.createElement('div');
1553
1553
  div.textContent = text;
1554
1554
  return div.innerHTML;
1555
1555
  }
1556
-
1556
+
1557
1557
  /**
1558
1558
  * Toggle JSON section visibility and update global state
1559
1559
  * WHY: Maintains sticky state across all JSON sections for consistent behavior
@@ -1563,19 +1563,19 @@ class UnifiedDataViewer {
1563
1563
  toggleJsonSection(sectionId, button) {
1564
1564
  // Toggle the global state
1565
1565
  this.globalJsonExpanded = !this.globalJsonExpanded;
1566
-
1566
+
1567
1567
  // Persist the preference to localStorage
1568
1568
  localStorage.setItem('dashboard-json-expanded', this.globalJsonExpanded.toString());
1569
-
1569
+
1570
1570
  // Update ALL JSON sections on the page
1571
1571
  this.updateAllJsonSections();
1572
-
1572
+
1573
1573
  // Dispatch event to notify other components (like module-viewer) of the change
1574
1574
  document.dispatchEvent(new CustomEvent('jsonToggleChanged', {
1575
1575
  detail: { expanded: this.globalJsonExpanded }
1576
1576
  }));
1577
1577
  }
1578
-
1578
+
1579
1579
  /**
1580
1580
  * Toggle Full Event Data section visibility and update state
1581
1581
  * WHY: Maintains separate sticky state for Full Event Data sections
@@ -1585,19 +1585,19 @@ class UnifiedDataViewer {
1585
1585
  toggleFullEventSection(sectionId, button) {
1586
1586
  // Toggle the full event data state
1587
1587
  this.fullEventDataExpanded = !this.fullEventDataExpanded;
1588
-
1588
+
1589
1589
  // Persist the preference to localStorage
1590
1590
  localStorage.setItem('dashboard-full-event-expanded', this.fullEventDataExpanded.toString());
1591
-
1591
+
1592
1592
  // Update ALL Full Event sections on the page
1593
1593
  this.updateAllFullEventSections();
1594
-
1594
+
1595
1595
  // Dispatch event to notify other components of the change
1596
1596
  document.dispatchEvent(new CustomEvent('fullEventToggleChanged', {
1597
1597
  detail: { expanded: this.fullEventDataExpanded }
1598
1598
  }));
1599
1599
  }
1600
-
1600
+
1601
1601
  /**
1602
1602
  * Update all JSON sections on the page to match global state
1603
1603
  * WHY: Ensures all "Structured Data" sections maintain consistent visibility
@@ -1606,7 +1606,7 @@ class UnifiedDataViewer {
1606
1606
  // Find all unified JSON sections (NOT full event sections)
1607
1607
  const allJsonContents = document.querySelectorAll('.unified-json-content');
1608
1608
  const allJsonButtons = document.querySelectorAll('.unified-json-toggle');
1609
-
1609
+
1610
1610
  // Update each JSON section
1611
1611
  allJsonContents.forEach(content => {
1612
1612
  if (this.globalJsonExpanded) {
@@ -1615,7 +1615,7 @@ class UnifiedDataViewer {
1615
1615
  content.style.display = 'none';
1616
1616
  }
1617
1617
  });
1618
-
1618
+
1619
1619
  // Update all button states
1620
1620
  allJsonButtons.forEach(button => {
1621
1621
  const title = button.textContent.substring(2); // Remove arrow
@@ -1628,7 +1628,7 @@ class UnifiedDataViewer {
1628
1628
  }
1629
1629
  });
1630
1630
  }
1631
-
1631
+
1632
1632
  /**
1633
1633
  * Update all Full Event Data sections on the page to match state
1634
1634
  * WHY: Ensures all "Full Event Data" sections maintain consistent visibility
@@ -1637,7 +1637,7 @@ class UnifiedDataViewer {
1637
1637
  // Find all full event sections
1638
1638
  const allFullEventContents = document.querySelectorAll('.full-event-content');
1639
1639
  const allFullEventButtons = document.querySelectorAll('.full-event-toggle');
1640
-
1640
+
1641
1641
  // Update each full event section
1642
1642
  allFullEventContents.forEach(content => {
1643
1643
  if (this.fullEventDataExpanded) {
@@ -1646,7 +1646,7 @@ class UnifiedDataViewer {
1646
1646
  content.style.display = 'none';
1647
1647
  }
1648
1648
  });
1649
-
1649
+
1650
1650
  // Update all button states
1651
1651
  allFullEventButtons.forEach(button => {
1652
1652
  const title = button.textContent.substring(2); // Remove arrow
@@ -1667,26 +1667,26 @@ class UnifiedDataViewer {
1667
1667
  createCollapsibleJSON(data, title = 'Full Details') {
1668
1668
  // Generate unique ID for this collapsible section
1669
1669
  const sectionId = `json-details-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1670
-
1670
+
1671
1671
  // Filter out sensitive or overly verbose properties
1672
1672
  const cleanData = this.cleanDataForDisplay(data);
1673
-
1673
+
1674
1674
  // Determine which state to use based on title
1675
1675
  // "Full Event Data" and similar titles use the fullEventDataExpanded state
1676
1676
  // Other titles use the global JSON state (for backward compatibility)
1677
- const isFullEventData = title.includes('Full Event') || title.includes('Full Details') ||
1677
+ const isFullEventData = title.includes('Full Event') || title.includes('Full Details') ||
1678
1678
  title.includes('Full Agent') || title.includes('Full Tool');
1679
1679
  const isExpanded = isFullEventData ? this.fullEventDataExpanded : this.globalJsonExpanded;
1680
1680
  const display = isExpanded ? 'block' : 'none';
1681
1681
  const arrow = isExpanded ? '▼' : '▶';
1682
1682
  const expandedClass = isExpanded ? 'expanded' : '';
1683
-
1683
+
1684
1684
  // Use different toggle function based on section type
1685
1685
  const toggleFunction = isFullEventData ? 'toggleFullEventSection' : 'toggleJsonSection';
1686
-
1686
+
1687
1687
  return `
1688
1688
  <div class="collapsible-json-section">
1689
- <button class="collapsible-json-toggle ${isFullEventData ? 'full-event-toggle' : 'unified-json-toggle'} ${expandedClass}"
1689
+ <button class="collapsible-json-toggle ${isFullEventData ? 'full-event-toggle' : 'unified-json-toggle'} ${expandedClass}"
1690
1690
  data-section-id="${sectionId}"
1691
1691
  data-is-full-event="${isFullEventData}"
1692
1692
  onclick="window.unifiedDataViewer.${toggleFunction}('${sectionId}', this)">
@@ -1705,7 +1705,7 @@ class UnifiedDataViewer {
1705
1705
  */
1706
1706
  cleanDataForDisplay(data) {
1707
1707
  const seen = new WeakSet();
1708
-
1708
+
1709
1709
  return JSON.parse(JSON.stringify(data, (key, value) => {
1710
1710
  // Handle circular references
1711
1711
  if (typeof value === 'object' && value !== null) {
@@ -1714,17 +1714,17 @@ class UnifiedDataViewer {
1714
1714
  }
1715
1715
  seen.add(value);
1716
1716
  }
1717
-
1717
+
1718
1718
  // Truncate very long strings
1719
1719
  if (typeof value === 'string' && value.length > 1000) {
1720
1720
  return value.substring(0, 1000) + '... [truncated]';
1721
1721
  }
1722
-
1722
+
1723
1723
  // Handle functions
1724
1724
  if (typeof value === 'function') {
1725
1725
  return '[Function]';
1726
1726
  }
1727
-
1727
+
1728
1728
  return value;
1729
1729
  }));
1730
1730
  }
@@ -1776,14 +1776,14 @@ window.UnifiedDataViewer = UnifiedDataViewer;
1776
1776
  if (typeof window !== 'undefined') {
1777
1777
  // Always create/update the global instance
1778
1778
  window.unifiedDataViewer = new UnifiedDataViewer();
1779
-
1779
+
1780
1780
  // Also expose the methods directly on window as a fallback
1781
1781
  window.toggleFullEventSection = function(sectionId, button) {
1782
1782
  if (window.unifiedDataViewer) {
1783
1783
  window.unifiedDataViewer.toggleFullEventSection(sectionId, button);
1784
1784
  }
1785
1785
  };
1786
-
1786
+
1787
1787
  window.toggleJsonSection = function(sectionId, button) {
1788
1788
  if (window.unifiedDataViewer) {
1789
1789
  window.unifiedDataViewer.toggleJsonSection(sectionId, button);
@@ -1798,7 +1798,7 @@ if (typeof window !== 'undefined') {
1798
1798
  if (!window.unifiedDataViewer) {
1799
1799
  window.unifiedDataViewer = new UnifiedDataViewer();
1800
1800
  }
1801
-
1801
+
1802
1802
  // Add keyboard shortcuts for file operations
1803
1803
  document.addEventListener('keydown', function(e) {
1804
1804
  // Ctrl/Cmd + Click on file paths to open file viewer
@@ -1809,7 +1809,7 @@ if (typeof window !== 'undefined') {
1809
1809
  window.showFileViewerModal(filePath);
1810
1810
  }
1811
1811
  }
1812
-
1812
+
1813
1813
  // 'V' key to open file viewer when hovering over clickable file paths
1814
1814
  if (e.key.toLowerCase() === 'v' && document.querySelector('.clickable-file-path:hover')) {
1815
1815
  const hoveredPath = document.querySelector('.clickable-file-path:hover');