claude-mpm 4.25.10__py3-none-any.whl → 5.1.8__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 (507) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +1055 -2230
  4. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  5. claude_mpm/agents/WORKFLOW.md +4 -4
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent_loader.py +10 -35
  9. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +576 -66
  10. claude_mpm/agents/templates/context-management-examples.md +544 -0
  11. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  12. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  13. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  14. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  15. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  16. claude_mpm/cli/__init__.py +28 -3
  17. claude_mpm/cli/commands/__init__.py +2 -0
  18. claude_mpm/cli/commands/agent_source.py +774 -0
  19. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  20. claude_mpm/cli/commands/agents.py +959 -36
  21. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  22. claude_mpm/cli/commands/agents_discover.py +338 -0
  23. claude_mpm/cli/commands/auto_configure.py +537 -239
  24. claude_mpm/cli/commands/config.py +7 -4
  25. claude_mpm/cli/commands/configure.py +924 -45
  26. claude_mpm/cli/commands/configure_navigation.py +63 -46
  27. claude_mpm/cli/commands/doctor.py +10 -2
  28. claude_mpm/cli/commands/local_deploy.py +1 -4
  29. claude_mpm/cli/commands/postmortem.py +401 -0
  30. claude_mpm/cli/commands/run.py +1 -39
  31. claude_mpm/cli/commands/skill_source.py +694 -0
  32. claude_mpm/cli/commands/skills.py +322 -19
  33. claude_mpm/cli/executor.py +22 -3
  34. claude_mpm/cli/interactive/agent_wizard.py +1028 -43
  35. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  36. claude_mpm/cli/parsers/agents_parser.py +256 -4
  37. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  38. claude_mpm/cli/parsers/base_parser.py +25 -0
  39. claude_mpm/cli/parsers/config_parser.py +96 -43
  40. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  41. claude_mpm/cli/parsers/skills_parser.py +7 -0
  42. claude_mpm/cli/parsers/source_parser.py +138 -0
  43. claude_mpm/cli/startup.py +456 -103
  44. claude_mpm/cli/startup_display.py +4 -4
  45. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  46. claude_mpm/commands/mpm-agents-detect.md +9 -0
  47. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  48. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  49. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  50. claude_mpm/commands/mpm-doctor.md +9 -0
  51. claude_mpm/commands/mpm-help.md +14 -2
  52. claude_mpm/commands/mpm-init.md +9 -0
  53. claude_mpm/commands/mpm-monitor.md +9 -0
  54. claude_mpm/commands/mpm-postmortem.md +123 -0
  55. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  56. claude_mpm/commands/mpm-status.md +9 -0
  57. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  58. claude_mpm/commands/mpm-ticket-view.md +552 -0
  59. claude_mpm/commands/mpm-version.md +9 -0
  60. claude_mpm/commands/mpm.md +10 -0
  61. claude_mpm/config/agent_presets.py +488 -0
  62. claude_mpm/config/agent_sources.py +325 -0
  63. claude_mpm/config/skill_presets.py +392 -0
  64. claude_mpm/config/skill_sources.py +590 -0
  65. claude_mpm/constants.py +1 -0
  66. claude_mpm/core/claude_runner.py +5 -34
  67. claude_mpm/core/config.py +16 -0
  68. claude_mpm/core/framework/__init__.py +3 -16
  69. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  70. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  71. claude_mpm/core/interactive_session.py +83 -7
  72. claude_mpm/core/oneshot_session.py +71 -8
  73. claude_mpm/core/protocols/__init__.py +23 -0
  74. claude_mpm/core/protocols/runner_protocol.py +103 -0
  75. claude_mpm/core/protocols/session_protocol.py +131 -0
  76. claude_mpm/core/shared/singleton_manager.py +11 -4
  77. claude_mpm/core/system_context.py +38 -0
  78. claude_mpm/core/unified_config.py +22 -0
  79. claude_mpm/experimental/cli_enhancements.py +1 -5
  80. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  87. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  88. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  89. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  92. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  93. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  94. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  95. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  96. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  97. claude_mpm/models/git_repository.py +198 -0
  98. claude_mpm/services/agents/agent_builder.py +45 -9
  99. claude_mpm/services/agents/agent_preset_service.py +238 -0
  100. claude_mpm/services/agents/agent_selection_service.py +484 -0
  101. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  102. claude_mpm/services/agents/cache_git_manager.py +621 -0
  103. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  104. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  105. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  106. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  107. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  108. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  109. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  110. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  111. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  112. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  113. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  114. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  115. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  116. claude_mpm/services/agents/git_source_manager.py +629 -0
  117. claude_mpm/services/agents/loading/framework_agent_loader.py +1 -4
  118. claude_mpm/services/agents/local_template_manager.py +47 -9
  119. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  120. claude_mpm/services/agents/sources/__init__.py +13 -0
  121. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  122. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  123. claude_mpm/services/agents/startup_sync.py +239 -0
  124. claude_mpm/services/agents/toolchain_detector.py +474 -0
  125. claude_mpm/services/analysis/__init__.py +25 -0
  126. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  127. claude_mpm/services/analysis/postmortem_service.py +765 -0
  128. claude_mpm/services/command_deployment_service.py +200 -6
  129. claude_mpm/services/core/base.py +7 -2
  130. claude_mpm/services/core/interfaces/__init__.py +1 -3
  131. claude_mpm/services/core/interfaces/health.py +1 -4
  132. claude_mpm/services/core/models/__init__.py +2 -11
  133. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  134. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  135. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  136. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  137. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  138. claude_mpm/services/diagnostics/doctor_reporter.py +34 -6
  139. claude_mpm/services/git/__init__.py +21 -0
  140. claude_mpm/services/git/git_operations_service.py +494 -0
  141. claude_mpm/services/github/__init__.py +21 -0
  142. claude_mpm/services/github/github_cli_service.py +397 -0
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  145. claude_mpm/services/instructions/__init__.py +9 -0
  146. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  147. claude_mpm/services/local_ops/__init__.py +3 -13
  148. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  149. claude_mpm/services/local_ops/health_manager.py +1 -4
  150. claude_mpm/services/mcp_config_manager.py +75 -145
  151. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  152. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  153. claude_mpm/services/mcp_service_verifier.py +6 -3
  154. claude_mpm/services/monitor/daemon.py +28 -8
  155. claude_mpm/services/monitor/daemon_manager.py +96 -19
  156. claude_mpm/services/pr/__init__.py +14 -0
  157. claude_mpm/services/pr/pr_template_service.py +329 -0
  158. claude_mpm/services/project/project_organizer.py +4 -0
  159. claude_mpm/services/runner_configuration_service.py +16 -3
  160. claude_mpm/services/session_management_service.py +16 -4
  161. claude_mpm/services/skills/__init__.py +18 -0
  162. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  163. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  164. claude_mpm/services/socketio/server/core.py +1 -4
  165. claude_mpm/services/socketio/server/main.py +1 -3
  166. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  167. claude_mpm/services/unified/unified_deployment.py +1 -5
  168. claude_mpm/services/visualization/__init__.py +1 -5
  169. claude_mpm/templates/questions/__init__.py +2 -7
  170. claude_mpm/templates/questions/pr_strategy.py +1 -4
  171. claude_mpm/templates/questions/project_init.py +1 -4
  172. claude_mpm/templates/questions/ticket_mgmt.py +1 -4
  173. claude_mpm/utils/agent_dependency_loader.py +77 -10
  174. claude_mpm/utils/agent_filters.py +288 -0
  175. claude_mpm/utils/gitignore.py +3 -0
  176. claude_mpm/utils/migration.py +372 -0
  177. claude_mpm/utils/progress.py +387 -0
  178. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +356 -112
  179. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +188 -439
  180. claude_mpm/agents/templates/agent-manager.json +0 -273
  181. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  182. claude_mpm/agents/templates/api_qa.json +0 -183
  183. claude_mpm/agents/templates/clerk-ops.json +0 -235
  184. claude_mpm/agents/templates/code_analyzer.json +0 -101
  185. claude_mpm/agents/templates/content-agent.json +0 -358
  186. claude_mpm/agents/templates/dart_engineer.json +0 -307
  187. claude_mpm/agents/templates/data_engineer.json +0 -225
  188. claude_mpm/agents/templates/documentation.json +0 -238
  189. claude_mpm/agents/templates/engineer.json +0 -210
  190. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  191. claude_mpm/agents/templates/golang_engineer.json +0 -270
  192. claude_mpm/agents/templates/imagemagick.json +0 -264
  193. claude_mpm/agents/templates/java_engineer.json +0 -346
  194. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  195. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  196. claude_mpm/agents/templates/memory_manager.json +0 -158
  197. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  198. claude_mpm/agents/templates/ops.json +0 -185
  199. claude_mpm/agents/templates/php-engineer.json +0 -287
  200. claude_mpm/agents/templates/product_owner.json +0 -338
  201. claude_mpm/agents/templates/project_organizer.json +0 -144
  202. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  203. claude_mpm/agents/templates/python_engineer.json +0 -387
  204. claude_mpm/agents/templates/qa.json +0 -243
  205. claude_mpm/agents/templates/react_engineer.json +0 -239
  206. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  207. claude_mpm/agents/templates/research.json +0 -258
  208. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  209. claude_mpm/agents/templates/rust_engineer.json +0 -275
  210. claude_mpm/agents/templates/security.json +0 -202
  211. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  212. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  213. claude_mpm/agents/templates/ticketing.json +0 -181
  214. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  215. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  216. claude_mpm/agents/templates/version_control.json +0 -159
  217. claude_mpm/agents/templates/web_qa.json +0 -400
  218. claude_mpm/agents/templates/web_ui.json +0 -189
  219. claude_mpm/cli/README.md +0 -253
  220. claude_mpm/cli/commands/mcp_install_commands.py.backup +0 -284
  221. claude_mpm/cli/commands/mpm_init/README.md +0 -365
  222. claude_mpm/cli_module/refactoring_guide.md +0 -253
  223. claude_mpm/commands/mpm-tickets.md +0 -151
  224. claude_mpm/config/agent_capabilities.yaml +0 -658
  225. claude_mpm/config/async_logging_config.yaml +0 -145
  226. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
  227. claude_mpm/d2/.gitignore +0 -22
  228. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +0 -273
  229. claude_mpm/d2/FLASK_INTEGRATION.md +0 -156
  230. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +0 -452
  231. claude_mpm/d2/QUICKSTART.md +0 -186
  232. claude_mpm/d2/README.md +0 -232
  233. claude_mpm/d2/STORE_FIX_SUMMARY.md +0 -167
  234. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +0 -180
  235. claude_mpm/d2/TESTING.md +0 -288
  236. claude_mpm/d2/index.html +0 -118
  237. claude_mpm/d2/package.json +0 -19
  238. claude_mpm/d2/src/App.svelte +0 -110
  239. claude_mpm/d2/src/components/Header.svelte +0 -153
  240. claude_mpm/d2/src/components/MainContent.svelte +0 -74
  241. claude_mpm/d2/src/components/Sidebar.svelte +0 -85
  242. claude_mpm/d2/src/components/tabs/EventsTab.svelte +0 -326
  243. claude_mpm/d2/src/lib/socketio.js +0 -144
  244. claude_mpm/d2/src/main.js +0 -7
  245. claude_mpm/d2/src/stores/events.js +0 -114
  246. claude_mpm/d2/src/stores/socket.js +0 -108
  247. claude_mpm/d2/src/stores/theme.js +0 -65
  248. claude_mpm/d2/svelte.config.js +0 -12
  249. claude_mpm/d2/vite.config.js +0 -15
  250. claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
  251. claude_mpm/dashboard/BUILD_NUMBER +0 -1
  252. claude_mpm/dashboard/README.md +0 -121
  253. claude_mpm/dashboard/VERSION +0 -1
  254. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  255. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +0 -273
  256. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +0 -75
  257. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  258. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +0 -141
  259. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  260. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +0 -36
  261. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  262. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +0 -89
  263. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +0 -215
  264. claude_mpm/dashboard/react/entries/events.tsx +0 -165
  265. claude_mpm/dashboard/react/hooks/useEvents.ts +0 -191
  266. claude_mpm/dashboard/react/hooks/useSocket.ts +0 -225
  267. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  268. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +0 -170
  269. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  270. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  271. claude_mpm/dashboard/static/built/components/activity-tree.js.map +0 -1
  272. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  273. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  274. claude_mpm/dashboard/static/built/components/agent-inference.js.map +0 -1
  275. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  276. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  277. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  278. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  279. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  280. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  281. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  282. claude_mpm/dashboard/static/built/components/code-tree.js.map +0 -1
  283. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  284. claude_mpm/dashboard/static/built/components/code-viewer.js.map +0 -1
  285. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  286. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  287. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  288. claude_mpm/dashboard/static/built/components/event-processor.js.map +0 -1
  289. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  290. claude_mpm/dashboard/static/built/components/event-viewer.js.map +0 -1
  291. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  292. claude_mpm/dashboard/static/built/components/export-manager.js.map +0 -1
  293. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  294. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  295. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  296. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +0 -1
  297. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  298. claude_mpm/dashboard/static/built/components/file-viewer.js.map +0 -1
  299. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  300. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +0 -1
  301. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  302. claude_mpm/dashboard/static/built/components/hud-manager.js.map +0 -1
  303. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  304. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +0 -1
  305. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  306. claude_mpm/dashboard/static/built/components/module-viewer.js.map +0 -1
  307. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  308. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  309. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  310. claude_mpm/dashboard/static/built/components/session-manager.js.map +0 -1
  311. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  312. claude_mpm/dashboard/static/built/components/socket-manager.js.map +0 -1
  313. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  314. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +0 -1
  315. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  316. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +0 -1
  317. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  318. claude_mpm/dashboard/static/built/components/working-directory.js.map +0 -1
  319. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  320. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  321. claude_mpm/dashboard/static/built/dashboard.js.map +0 -1
  322. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  323. claude_mpm/dashboard/static/built/react/events.js +0 -30
  324. claude_mpm/dashboard/static/built/react/events.js.map +0 -1
  325. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  326. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  327. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  328. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  329. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  330. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  331. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  332. claude_mpm/dashboard/static/built/socket-client.js.map +0 -1
  333. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  334. claude_mpm/dashboard/static/events.html +0 -607
  335. claude_mpm/dashboard/static/index.html +0 -635
  336. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +0 -170
  337. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  338. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  339. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  340. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  342. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  343. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  344. claude_mpm/dashboard/static/legacy/files.html +0 -747
  345. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  346. claude_mpm/dashboard/static/monitors.html +0 -431
  347. claude_mpm/dashboard/static/navigation-test-results.md +0 -118
  348. claude_mpm/dashboard/static/production/events.html +0 -659
  349. claude_mpm/dashboard/static/production/main.html +0 -698
  350. claude_mpm/dashboard/static/production/monitors.html +0 -483
  351. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  352. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  353. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  354. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  355. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +0 -36
  356. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
  357. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
  358. claude_mpm/hooks/README.md +0 -143
  359. claude_mpm/hooks/templates/README.md +0 -180
  360. claude_mpm/hooks/templates/settings.json.example +0 -147
  361. claude_mpm/schemas/agent_schema.json +0 -596
  362. claude_mpm/schemas/frontmatter_schema.json +0 -165
  363. claude_mpm/services/event_bus/README.md +0 -244
  364. claude_mpm/services/events/README.md +0 -303
  365. claude_mpm/services/framework_claude_md_generator/README.md +0 -119
  366. claude_mpm/services/mcp_gateway/README.md +0 -185
  367. claude_mpm/services/socketio/handlers/connection.py.backup +0 -217
  368. claude_mpm/services/socketio/handlers/hook.py.backup +0 -154
  369. claude_mpm/services/static/.gitkeep +0 -2
  370. claude_mpm/services/version_control/VERSION +0 -1
  371. claude_mpm/skills/bundled/.gitkeep +0 -2
  372. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  373. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  374. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  375. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  376. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  377. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  378. claude_mpm/skills/bundled/collaboration/git-worktrees.md +0 -317
  379. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  380. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  381. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  382. claude_mpm/skills/bundled/collaboration/stacked-prs.md +0 -251
  383. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  384. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  385. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  386. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  387. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +0 -63
  388. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  389. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  390. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  391. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  392. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  393. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  394. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  395. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  396. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  397. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  398. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  399. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  400. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  401. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  402. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  403. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  404. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  405. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  406. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  407. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +0 -611
  408. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +0 -596
  409. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +0 -260
  410. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +0 -315
  411. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +0 -436
  412. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +0 -433
  413. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +0 -452
  414. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +0 -404
  415. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +0 -420
  416. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +0 -202
  417. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  418. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +0 -54
  419. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +0 -322
  420. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  421. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +0 -202
  422. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  423. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  424. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  425. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  426. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  427. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +0 -202
  428. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  429. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  430. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  431. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  435. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +0 -22
  436. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +0 -2
  437. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +0 -202
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/react/flexlayout-react.md +0 -742
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  459. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +0 -495
  460. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +0 -599
  461. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +0 -535
  462. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +0 -613
  463. claude_mpm/skills/bundled/tauri/tauri-event-system.md +0 -648
  464. claude_mpm/skills/bundled/tauri/tauri-file-system.md +0 -673
  465. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +0 -767
  466. claude_mpm/skills/bundled/tauri/tauri-performance.md +0 -669
  467. claude_mpm/skills/bundled/tauri/tauri-state-management.md +0 -573
  468. claude_mpm/skills/bundled/tauri/tauri-testing.md +0 -384
  469. claude_mpm/skills/bundled/tauri/tauri-window-management.md +0 -628
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +0 -158
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +0 -458
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +0 -411
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +0 -317
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +0 -270
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +0 -436
  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/LICENSE.txt +0 -202
  490. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  491. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  492. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  493. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  494. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  495. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  496. claude_mpm/templates/questions/EXAMPLES.md +0 -501
  497. claude_mpm/tools/README_SOCKETIO_DEBUG.md +0 -224
  498. claude_mpm/tools/code_tree_analyzer/README.md +0 -64
  499. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  500. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  501. /claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +0 -0
  502. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  503. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  504. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  505. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  506. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  507. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -1,2 +0,0 @@
1
- class e{constructor(){this.container=null,this.svg=null,this.initialized=!1,this.fileActivity=new Map,this.sessions=new Map,this.currentSession=null,this.treeData=null,this.d3Tree=null,this.d3Root=null,this.selectedNode=null,this.width=800,this.height=600,this.nodeRadius=5,this.renderInProgress=!1,this.containerObserver=null}initialize(){if(console.log("[CodeViewer] initialize() called"),this.initialized)console.log("[CodeViewer] Already initialized, skipping");else{console.log("[CodeViewer] Starting initialization...");try{this.setupContainer(),console.log("[CodeViewer] Container setup complete"),this.setupEventHandlers(),console.log("[CodeViewer] Event handlers setup complete"),this.subscribeToEvents(),console.log("[CodeViewer] Event subscription complete"),this.processExistingEvents(),console.log("[CodeViewer] Existing events processed"),this.initialized=!0,console.log("[CodeViewer] Initialization complete!")}catch(e){throw console.error("[CodeViewer] Error during initialization:",e),e}}}setupContainer(){const e=document.getElementById("claude-tree-container");e?(this.container=e,this.renderInterface()):console.error("File Tree container not found")}renderInterface(){if(!this.container)return void console.error("[CodeViewer] Container not found, cannot render interface");if(this.renderInProgress)return;const e=this.container.querySelector(".activity-tree-wrapper");this.container.querySelector(".file-tree-empty-state");const t=this.container.querySelector("#claude-activity-tree-svg");if(e&&t)return;this.renderInProgress=!0,this.containerObserver&&this.containerObserver.disconnect(),this.container.innerHTML="",this.container.innerHTML='\n <div class="activity-tree-wrapper" style="height: 100%; display: flex; flex-direction: column;">\n <div class="activity-controls" style="padding: 10px; border-bottom: 1px solid #ddd; background: #f9f9f9; display: flex; align-items: center; gap: 10px;">\n <button id="claude-expand-all-btn" class="control-btn" style="padding: 4px 8px; font-size: 0.9em;">Expand All</button>\n <button id="claude-collapse-all-btn" class="control-btn" style="padding: 4px 8px; font-size: 0.9em;">Collapse All</button>\n <button id="claude-reset-zoom-btn" class="control-btn" style="padding: 4px 8px; font-size: 0.9em;">Reset Zoom</button>\n <div class="stats" id="claude-tree-stats" style="margin-left: auto; font-size: 0.9em; color: #666;"></div>\n </div>\n <div class="tree-container" id="claude-tree-svg-container" style="flex: 1; overflow: hidden; position: relative; background: white;">\n <svg id="claude-activity-tree-svg" style="width: 100%; height: 100%;"></svg>\n </div>\n <div class="legend" style="padding: 5px 10px; border-top: 1px solid #ddd; background: #f9f9f9; font-size: 0.85em; display: flex; gap: 15px;">\n <span class="legend-item"><span style="color: #4CAF50;">●</span> File</span>\n <span class="legend-item"><span style="color: #2196F3;">●</span> Class</span>\n <span class="legend-item"><span style="color: #FF9800;">●</span> Function</span>\n <span class="legend-item"><span style="color: #9C27B0;">●</span> Method</span>\n <span class="legend-item"><span style="color: #F44336;">◆</span> Edited</span>\n <span class="legend-item"><span style="color: #4CAF50;">○</span> Viewed</span>\n </div>\n </div>\n ';const i=document.getElementById("claude-tree-svg-container");if(i){const e=i.getBoundingClientRect();this.width=e.width||800,this.height=e.height||600}this.renderInProgress=!1,this.containerObserver&&this.container&&this.containerObserver.observe(this.container,{childList:!0,subtree:!1})}renderContent(){this._showInternal()}show(){this._showInternal()}_showInternal(){console.log("[CodeViewer] _showInternal() called");const e=document.getElementById("claude-tree-container");if(!e)return void console.error("[CodeViewer] File Tree container not found!");console.log("[CodeViewer] Found container, current HTML length:",e.innerHTML.length),console.log("[CodeViewer] Container children:",e.children.length),this.refreshFromFileToolTracker();let t=!1;if(["#events-list",".events-list",".event-item",".no-events",'[id*="event"]','[class*="event"]'].forEach(i=>{const s=e.querySelectorAll(i);s.length>0&&(console.warn(`[CodeViewer] Found ${s.length} foreign elements matching '${i}', removing...`),s.forEach(e=>e.remove()),t=!0)}),t&&(console.warn("[CodeViewer] Foreign content removed, clearing container completely for fresh start"),e.innerHTML=""),e.setAttribute("data-owner","code-viewer"),e.setAttribute("data-tab-reserved","claude-tree"),e.setAttribute("data-component","CodeViewer"),this.container&&this.container===e||(this.container=e),this.initialized){const e=this.container.querySelector(".activity-tree-wrapper"),t=this.container.querySelector(".file-tree-empty-state");e||t||this.renderInterface()}else this.initialize();this.containerObserver||this.protectContainer(),this.setupControlHandlers();const i=document.getElementById("session-select");i&&(this.currentSession=i.value||null),this.buildTreeData(),this.renderTree(),this.updateStats()}protectContainer(){const e=document.getElementById("claude-tree-container");if(!e)return;this.containerObserver&&this.containerObserver.disconnect();let t=!1;this.containerObserver=new MutationObserver(i=>{for(const n of i){for(const i of n.addedNodes)if(i.nodeType===Node.ELEMENT_NODE){const n=i;if(n.classList?.contains("event-item")||n.classList?.contains("events-list")||n.classList?.contains("no-events")||"events-list"===n.id||"agents-list"===n.id||"tools-list"===n.id||"files-list"===n.id||n.textContent&&(n.textContent.includes("[hook]")||n.textContent.includes("hook.user_prompt")||n.textContent.includes("hook.pre_tool")||n.textContent.includes("hook.post_tool")||n.textContent.includes("Connect to Socket.IO")||n.textContent.includes("No events")||n.textContent.includes("No agent events")||n.textContent.includes("No tool events")||n.textContent.includes("No file operations"))||"DIV"===n.tagName&&!n.classList?.contains("activity-tree-wrapper")&&!n.classList?.contains("file-tree-empty-state")&&!n.classList?.contains("activity-controls")&&!n.classList?.contains("tree-container")&&!n.classList?.contains("legend")&&!n.classList?.contains("stats")&&!n.id?.startsWith("claude-")){try{i.remove()}catch(s){console.warn("[CodeViewer] Failed to remove unwanted node:",s)}t||this.renderInProgress||(t=!0,setTimeout(()=>{t=!1,e.querySelector(".activity-tree-wrapper")||e.querySelector(".file-tree-empty-state")||(this.renderInterface(),this.setupControlHandlers(),this.buildTreeData(),this.renderTree())},50))}}if("childList"===n.type&&n.removedNodes.length>0)for(const e of n.removedNodes)if(e.nodeType===Node.ELEMENT_NODE){const i=e;(i.classList?.contains("activity-tree-wrapper")||i.classList?.contains("file-tree-empty-state"))&&(t||this.renderInProgress||(t=!0,setTimeout(()=>{t=!1,this.renderInterface(),this.setupControlHandlers(),this.buildTreeData(),this.renderTree()},50)))}}}),this.containerObserver.observe(e,{childList:!0,subtree:!1})}setupControlHandlers(){const e=document.getElementById("session-select");e&&!e.hasAttribute("data-tree-listener")&&(e.setAttribute("data-tree-listener","true"),e.addEventListener("change",e=>{this.currentSession=e.target.value||null,this.isTabActive()&&(this.buildTreeData(),this.renderTree(),this.updateStats())}));const t=document.getElementById("claude-expand-all-btn");t&&!t.hasAttribute("data-listener")&&(t.setAttribute("data-listener","true"),t.addEventListener("click",()=>{this.expandAllNodes()}));const i=document.getElementById("claude-collapse-all-btn");i&&!i.hasAttribute("data-listener")&&(i.setAttribute("data-listener","true"),i.addEventListener("click",()=>{this.collapseAllNodes()}));const s=document.getElementById("claude-reset-zoom-btn");s&&!s.hasAttribute("data-listener")&&(s.setAttribute("data-listener","true"),s.addEventListener("click",()=>{this.resetZoom()}))}setupEventHandlers(){}subscribeToEvents(){window.socket&&(window.socket.on("claude_event",e=>{(this.isFileOperationEvent(e)||this.isDirectFileEvent(e))&&setTimeout(()=>{this.refreshFromFileToolTracker(),this.isTabActive()&&(this.buildTreeData(),this.renderTree(),this.updateStats())},100)}),window.socket.on("file:read",e=>{this.handleDirectFileEvent("Read",e)}),window.socket.on("file:write",e=>{this.handleDirectFileEvent("Write",e)}),window.socket.on("file:edit",e=>{this.handleDirectFileEvent("Edit",e)})),window.eventBus&&window.eventBus.on("claude_event",e=>{(this.isFileOperationEvent(e)||this.isDirectFileEvent(e))&&(this.processClaudeEvent(e),this.isTabActive()&&(this.buildTreeData(),this.renderTree(),this.updateStats()))})}isTabActive(){const e=document.getElementById("claude-tree-tab");return e&&e.classList.contains("active")}processExistingEvents(){if(console.log("[CodeViewer] processExistingEvents called"),window.dashboard&&window.dashboard.fileToolTracker)this.refreshFromFileToolTracker();else if(window.dashboard&&window.dashboard.eventStore){const e=window.dashboard.eventStore.getAllEvents();console.log("[CodeViewer] Fallback to eventStore, total events:",e.length);let t=0,i=0;e.forEach(e=>{"hook"===e.type&&console.log("[CodeViewer] Hook event:",{subtype:e.subtype,tool_name:e.data?.tool_name,timestamp:e.timestamp}),this.isFileOperationEvent(e)&&(t++,console.log("[CodeViewer] Found file operation event:",e),this.processClaudeEvent(e),i++)}),console.log("[CodeViewer] processExistingEvents summary:",{totalEvents:e.length,fileOperations:t,processed:i,currentFileActivitySize:this.fileActivity.size})}else console.log("[CodeViewer] No dashboard or eventStore available")}isFileOperationEvent(e){if("hook"===e.type&&("pre_tool"===e.subtype||"post_tool"===e.subtype)&&e.data&&e.data.tool_name){return["Read","Write","Edit","MultiEdit","NotebookEdit"].includes(e.data.tool_name)}return!1}isDirectFileEvent(e){return!!("file_operation"===e.type||e.tool&&["Read","Write","Edit","MultiEdit","NotebookEdit"].includes(e.tool))}handleDirectFileEvent(e,t){const i={type:"file_operation",tool:e,data:{tool_name:e,tool_parameters:t.parameters||t,tool_output:t.output||null,session_id:t.session_id||this.currentSession,working_directory:t.working_directory||"/"},timestamp:t.timestamp||(new Date).toISOString()};this.processClaudeEvent(i),this.isTabActive()&&(this.buildTreeData(),this.renderTree(),this.updateStats())}isFileOperation(e){return["Read","Write","Edit","MultiEdit","NotebookEdit"].includes(e.tool_name)}processClaudeEvent(e){if(!this.isFileOperationEvent(e)&&!this.isDirectFileEvent(e))return;let t,i,s,n,o,r,a;if(this.isFileOperationEvent(e)){const a=e.data||{};t=a.tool_name,i=a.tool_parameters||{},s=a.tool_output,n=e.timestamp||(new Date).toISOString(),o=e.session_id||a.session_id,r=a.working_directory||"/"}else if(this.isDirectFileEvent(e)){const a=e.data||e;t=e.tool||a.tool_name,i=a.tool_parameters||a.parameters||{},s=a.tool_output||a.output,n=e.timestamp||a.timestamp||(new Date).toISOString(),o=e.session_id||a.session_id,r=a.working_directory||"/"}a=i.file_path||i.notebook_path,this.processFileOperation({tool_name:t,tool_parameters:i,tool_output:s,timestamp:n,session_id:o,working_directory:r,filePath:a})}processEvent(e){if(!this.isFileOperation(e))return;const{tool_name:t,tool_parameters:i,tool_output:s,timestamp:n,session_id:o,working_directory:r}=e,a=i?.file_path||i?.notebook_path;this.processFileOperation({tool_name:t,tool_parameters:i,tool_output:s,timestamp:n,session_id:o,working_directory:r,filePath:a})}processFileOperation({tool_name:e,tool_parameters:t,tool_output:i,timestamp:s,session_id:n,working_directory:o,filePath:r}){if(!r)return;n&&!this.sessions.has(n)&&(this.sessions.set(n,{id:n,working_directory:o||"/",files:new Set}),this.updateSessionList()),this.fileActivity.has(r)||this.fileActivity.set(r,{path:r,operations:[],sessions:new Set,working_directories:new Set,lastContent:null,astPaths:[]});const a=this.fileActivity.get(r);if(a.operations.push({type:e,timestamp:s,parameters:t,output:i,session_id:n}),n){a.sessions.add(n);const e=this.sessions.get(n);e&&e.files.add(r)}if(o&&a.working_directories.add(o),"Write"===e&&t.content)a.lastContent=t.content,a.astPaths=this.extractASTPaths(t.content,r);else if("Read"===e&&i?.content)a.lastContent=i.content,a.astPaths=this.extractASTPaths(i.content,r);else if("Edit"===e&&a.lastContent){const e=t.old_string,i=t.new_string;e&&i&&(a.lastContent=a.lastContent.replace(e,i),a.astPaths=this.extractASTPaths(a.lastContent,r))}}extractASTPaths(e,t){if(!e||"string"!=typeof e)return[];const i=t.split(".").pop()?.toLowerCase(),s=[];if("py"===i){const t=/^class\s+(\w+)/gm,i=/^def\s+(\w+)/gm,n=/^\s{4,}def\s+(\w+)/gm;let o;for(;null!==(o=t.exec(e));)s.push({name:o[1],type:"class"});for(;null!==(o=i.exec(e));)s.push({name:o[1],type:"function"});for(;null!==(o=n.exec(e));)s.some(e=>e.name===o[1])||s.push({name:o[1],type:"method"})}else if("js"===i||"jsx"===i||"ts"===i||"tsx"===i){const t=/class\s+(\w+)/g,i=/function\s+(\w+)/g,n=/const\s+(\w+)\s*=\s*\([^)]*\)\s*=>/g;let o;for(;null!==(o=t.exec(e));)s.push({name:o[1],type:"class"});for(;null!==(o=i.exec(e));)s.push({name:o[1],type:"function"});for(;null!==(o=n.exec(e));)s.push({name:o[1],type:"function"})}return s}buildTreeData(){const e={name:`Session: ${(this.currentSession||"current-session").substring(0,8)+"..."}`,type:"root",children:[]};if(!this.fileActivity||0===this.fileActivity.size)return e.children.push({name:"(No file operations yet)",type:"placeholder",children:[]}),this.treeData=e,void console.log("[CodeViewer] Built minimal tree with session root");const t=new Map;for(const[i,s]of this.fileActivity.entries()){if(this.currentSession&&!s.sessions.has(this.currentSession))continue;const e=Array.from(s.working_directories)[0]||"/";t.has(e)||t.set(e,{name:e.split("/").pop()||e,path:e,type:"directory",children:[]});const n=i.split("/").pop(),o=s.operations.some(e=>"Edit"===e.type||"Write"===e.type),r={name:n,path:i,type:"file",edited:o,operations:s.operations.length,children:[]};s.astPaths.length>0&&s.astPaths.forEach(e=>{r.children.push({name:e.name,type:e.type,path:`${i}#${e.name}`,children:[]})}),t.get(e).children.push(r)}e.children=Array.from(t.values()),1===e.children.length&&"/"===e.children[0].path&&(e.children=e.children[0].children),this.treeData=e}renderTree(){if(!this.treeData||!this.container)return;const e=document.getElementById("claude-activity-tree-svg");if(!e)return void console.warn("[CodeViewer] SVG element not found, skipping tree render");const t=d3.select(e);if(t.empty())return void console.warn("[CodeViewer] D3 could not select SVG element");t.selectAll("*").remove();const i=document.getElementById("claude-tree-svg-container");if(i){const e=i.getBoundingClientRect();this.width=e.width||800,this.height=e.height||600}const s=t.append("g"),n=d3.zoom().scaleExtent([.1,4]).on("zoom",e=>{s.attr("transform",e.transform)});t.call(n);const o=d3.tree().size([this.height-100,this.width-200]);this.d3Root=d3.hierarchy(this.treeData),o(this.d3Root),s.selectAll(".link").data(this.d3Root.links()).enter().append("path").attr("class","link").attr("d",d3.linkHorizontal().x(e=>e.y+100).y(e=>e.x+50)).style("fill","none").style("stroke","#ccc").style("stroke-width",1);const r=s.selectAll(".node").data(this.d3Root.descendants()).enter().append("g").attr("class","node").attr("transform",e=>`translate(${e.y+100},${e.x+50})`);r.append("circle").attr("r",this.nodeRadius).style("fill",e=>this.getNodeColor(e.data)).style("stroke",e=>e.data.edited?"#F44336":"#999").style("stroke-width",e=>e.data.edited?2:1).style("cursor","pointer").on("click",(e,t)=>this.handleNodeClick(e,t)),r.append("text").attr("dy",".35em").attr("x",e=>e.children?-10:10).style("text-anchor",e=>e.children?"end":"start").style("font-size","12px").style("cursor","pointer").text(e=>e.data.name).on("click",(e,t)=>this.handleNodeClick(e,t)),this.d3Tree={svg:t,g:s,zoom:n}}getNodeColor(e){switch(e.type){case"root":return"#666";case"directory":return"#FFC107";case"file":return"#4CAF50";case"class":return"#2196F3";case"function":return"#FF9800";case"method":return"#9C27B0";default:return"#999"}}handleNodeClick(e,t){e.stopPropagation(),t.children?(t._children=t.children,t.children=null):t._children&&(t.children=t._children,t._children=null),this.renderTree(),this.selectedNode=t,"file"===t.data.type&&this.fileActivity.has(t.data.path)&&this.showFileDetails(t.data.path)}showFileDetails(e){const t=this.fileActivity.get(e);if(!t)return;const i=document.getElementById("module-data-content");if(!i)return;const s=document.querySelector(".module-data-header h5");s&&(s.innerHTML=`📄 ${e.split("/").pop()}`);let n='<div style="padding: 10px; overflow-y: auto; height: 100%;">';n+='<div style="margin-bottom: 15px;">',n+=`<strong>File Path:</strong> ${e}<br>`,n+=`<strong>Operations:</strong> ${t.operations.length}<br>`,n+=`<strong>Sessions:</strong> ${t.sessions.size}`,n+="</div>",n+='<div style="margin-bottom: 15px;"><strong>Operations Timeline:</strong></div>',t.operations.forEach((e,t)=>{const i=new Date(e.timestamp).toLocaleTimeString();n+=`<div style="margin-bottom: 10px; padding: 8px; background: #f5f5f5; border-left: 3px solid ${this.getOperationColor(e.type)};">`,n+=`<div><strong>${e.type}</strong> at ${i}</div>`,"Edit"===e.type&&e.parameters&&(n+='<div style="margin-top: 5px; font-size: 0.9em;">',n+=`<div style="color: #d32f2f;">- ${this.escapeHtml(e.parameters.old_string||"").substring(0,100)}</div>`,n+=`<div style="color: #388e3c;">+ ${this.escapeHtml(e.parameters.new_string||"").substring(0,100)}</div>`,n+="</div>"),n+="</div>"}),t.astPaths.length>0&&(n+='<div style="margin-top: 15px;"><strong>AST Structure:</strong></div>',n+='<ul style="list-style: none; padding-left: 10px;">',t.astPaths.forEach(e=>{const t="class"===e.type?"🔷":"function"===e.type?"🔶":"🔸";n+=`<li>${t} ${e.name} (${e.type})</li>`}),n+="</ul>"),n+="</div>",i.innerHTML=n}getOperationColor(e){switch(e){case"Write":return"#4CAF50";case"Edit":return"#FF9800";case"Read":return"#2196F3";default:return"#999"}}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}expandAllNodes(){this.d3Root&&(this.d3Root.descendants().forEach(e=>{e._children&&(e.children=e._children,e._children=null)}),this.renderTree())}collapseAllNodes(){this.d3Root&&(this.d3Root.descendants().forEach(e=>{e.children&&e.depth>0&&(e._children=e.children,e.children=null)}),this.renderTree())}resetZoom(){this.d3Tree&&this.d3Tree.svg.transition().duration(750).call(this.d3Tree.zoom.transform,d3.zoomIdentity)}updateSessionList(){const e=document.getElementById("session-select");if(!e)return;const t=e.value;for(;e.options.length>1;)e.remove(1);for(const[i,s]of this.sessions.entries()){let t=!1;for(let s=0;s<e.options.length;s++)if(e.options[s].value===i){t=!0;break}if(!t){const t=document.createElement("option");t.value=i,t.textContent=`Session ${i.substring(0,8)}... (${s.files.size} files)`,e.appendChild(t)}}t&&(e.value=t)}updateStats(){const e=document.getElementById("claude-tree-stats");if(!e)return;const t=this.currentSession?Array.from(this.fileActivity.values()).filter(e=>e.sessions.has(this.currentSession)).length:this.fileActivity.size,i=this.currentSession?Array.from(this.fileActivity.values()).filter(e=>e.sessions.has(this.currentSession)).reduce((e,t)=>e+t.operations.length,0):Array.from(this.fileActivity.values()).reduce((e,t)=>e+t.operations.length,0);e.textContent=`Files: ${t} | Operations: ${i} | Sessions: ${this.sessions.size}`}refreshFromFileToolTracker(){if(!window.dashboard||!window.dashboard.fileToolTracker)return void console.log("[CodeViewer] FileToolTracker not available");const e=window.dashboard.fileToolTracker.getFileOperations();console.log("[CodeViewer] Refreshing from FileToolTracker:",e.size,"files"),this.fileActivity.clear(),this.sessions.clear();const t="current-session";this.sessions.set(t,{id:t,startTime:(new Date).toISOString(),files:new Set}),this.currentSession=t,e.forEach((e,i)=>{this.sessions.get(t).files.add(i);const s=e.operations[0];e.operations[e.operations.length-1],this.fileActivity.set(i,{path:i,firstAccess:s?s.timestamp:e.lastOperation,lastAccess:e.lastOperation,accessCount:e.operations.length,operations:e.operations.map(e=>({type:e.operation,timestamp:e.timestamp,agent:e.agent})),workingDirectory:s?s.workingDirectory:null,astNodes:[],content:null})}),console.log("[CodeViewer] File activity refreshed:",this.fileActivity.size,"files")}}try{window.CodeViewer=new e,console.log("[CodeViewer] Instance created successfully")}catch(t){console.error("[CodeViewer] FAILED TO CREATE INSTANCE:",t)}if("loading"===document.readyState)document.addEventListener("DOMContentLoaded",()=>{console.log("[CodeViewer] DOMContentLoaded - attempting initialization");try{window.CodeViewer.initialize();const e=document.getElementById("claude-tree-tab");e&&e.classList.contains("active")&&setTimeout(()=>window.CodeViewer.show(),100)}catch(t){console.error("[CodeViewer] FAILED TO INITIALIZE:",t)}});else{console.log("[CodeViewer] DOM already loaded - initializing immediately");try{window.CodeViewer.initialize();const e=document.getElementById("claude-tree-tab");e&&e.classList.contains("active")&&(console.log("[CodeViewer] File Tree tab is active, showing in 100ms"),setTimeout(()=>window.CodeViewer.show(),100))}catch(t){console.error("[CodeViewer] FAILED TO INITIALIZE:",t)}}document.addEventListener("tabChanged",e=>{e.detail&&"claude-tree"===e.detail.newTab&&setTimeout(()=>window.CodeViewer.show(),50)}),setInterval(()=>{const e=document.getElementById("claude-tree-tab"),t=document.getElementById("claude-tree-container");e&&e.classList.contains("active")&&t&&!t.querySelector(".activity-tree-wrapper")&&!t.querySelector(".file-tree-empty-state")&&window.CodeViewer.show()},5e3);
2
- //# sourceMappingURL=code-viewer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-viewer.js","sources":["../../js/components/code-viewer.js"],"sourcesContent":["/**\n * Code Viewer Component - File Activity Tree Viewer\n * \n * Shows a D3.js tree visualization of files that have been viewed or edited,\n * including AST paths (classes, functions, methods) extracted from the files.\n * This is NOT a directory viewer but an activity-focused visualization.\n * Renders in the File Tree tab of the dashboard.\n */\n\nclass CodeViewer {\n constructor() {\n this.container = null;\n this.svg = null;\n this.initialized = false;\n this.fileActivity = new Map(); // Map of file path to activity data\n this.sessions = new Map();\n this.currentSession = null;\n this.treeData = null;\n this.d3Tree = null;\n this.d3Root = null;\n this.selectedNode = null;\n this.width = 800;\n this.height = 600;\n this.nodeRadius = 5;\n this.renderInProgress = false; // Prevent concurrent renders\n this.containerObserver = null;\n }\n\n /**\n * Initialize the code viewer\n */\n initialize() {\n console.log('[CodeViewer] initialize() called');\n if (this.initialized) {\n console.log('[CodeViewer] Already initialized, skipping');\n return;\n }\n\n console.log('[CodeViewer] Starting initialization...');\n try {\n // Initialize components\n this.setupContainer();\n console.log('[CodeViewer] Container setup complete');\n \n this.setupEventHandlers();\n console.log('[CodeViewer] Event handlers setup complete');\n \n this.subscribeToEvents();\n console.log('[CodeViewer] Event subscription complete');\n \n this.processExistingEvents();\n console.log('[CodeViewer] Existing events processed');\n \n this.initialized = true;\n console.log('[CodeViewer] Initialization complete!');\n } catch (error) {\n console.error('[CodeViewer] Error during initialization:', error);\n throw error;\n }\n }\n\n /**\n * Setup the container in the File Tree tab\n */\n setupContainer() {\n // Find the File Tree tab container\n const treeContainer = document.getElementById('claude-tree-container');\n if (!treeContainer) {\n console.error('File Tree container not found');\n return;\n }\n\n // Store the container reference\n this.container = treeContainer;\n \n // Setup the activity tree interface\n this.renderInterface();\n }\n\n /**\n * Render the activity tree interface in the File Tree tab\n */\n renderInterface() {\n if (!this.container) {\n console.error('[CodeViewer] Container not found, cannot render interface');\n return;\n }\n\n // Prevent concurrent renders\n if (this.renderInProgress) {\n return;\n }\n \n // Check if interface already exists and is intact\n const existingWrapper = this.container.querySelector('.activity-tree-wrapper');\n const existingEmptyState = this.container.querySelector('.file-tree-empty-state');\n const existingSvg = this.container.querySelector('#claude-activity-tree-svg');\n \n // Always show the tree interface, even if empty\n // We'll show at least a session root node\n // Remove the empty state check - we always want the tree\n if (false) { // Disabled empty state - always show tree\n // Only render empty state if it doesn't exist\n if (!existingEmptyState) {\n this.renderInProgress = true;\n \n // Temporarily disconnect observer to prevent loops\n if (this.containerObserver) {\n this.containerObserver.disconnect();\n }\n \n // Clear any existing content completely\n this.container.innerHTML = '';\n \n // Show empty state\n this.container.innerHTML = `\n <div class=\"file-tree-empty-state\" style=\"\n text-align: center; \n padding: 50px 20px;\n color: #666;\n font-family: monospace;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background: #fafafa;\n \">\n <h2 style=\"color: #333; margin-bottom: 20px; font-size: 24px;\">\n 📁 File Activity Tree\n </h2>\n <p style=\"margin-bottom: 15px; font-size: 16px;\">\n No file operations recorded yet.\n </p>\n <p style=\"font-size: 14px; color: #888;\">\n The tree will appear here when files are:\n </p>\n <ul style=\"\n list-style: none; \n padding: 20px 30px; \n text-align: left; \n display: inline-block;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 5px;\n margin-top: 10px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n \">\n <li style=\"margin: 8px 0;\">📖 Read (using Read tool)</li>\n <li style=\"margin: 8px 0;\">✏️ Edited (using Edit tool)</li>\n <li style=\"margin: 8px 0;\">💾 Written (using Write tool)</li>\n <li style=\"margin: 8px 0;\">📝 Multi-edited (using MultiEdit tool)</li>\n <li style=\"margin: 8px 0;\">📓 Notebook edited (using NotebookEdit tool)</li>\n </ul>\n <p style=\"margin-top: 20px; font-size: 12px; color: #999;\">\n D3.js tree visualization will render automatically when file operations occur\n </p>\n </div>\n `;\n \n // Mark render as complete and re-enable observer if needed\n this.renderInProgress = false;\n \n // Re-enable container protection after render\n if (this.containerObserver && this.container) {\n this.containerObserver.observe(this.container, {\n childList: true,\n subtree: false // Only watch direct children, not subtree\n });\n }\n }\n return;\n }\n \n // If we have file activity and the interface already exists, skip\n if (existingWrapper && existingSvg) {\n return;\n }\n \n this.renderInProgress = true;\n \n // Temporarily disconnect observer to prevent loops\n if (this.containerObserver) {\n this.containerObserver.disconnect();\n }\n \n // Clear any existing content completely\n this.container.innerHTML = '';\n \n // Create the activity tree interface (without redundant session selector)\n this.container.innerHTML = `\n <div class=\"activity-tree-wrapper\" style=\"height: 100%; display: flex; flex-direction: column;\">\n <div class=\"activity-controls\" style=\"padding: 10px; border-bottom: 1px solid #ddd; background: #f9f9f9; display: flex; align-items: center; gap: 10px;\">\n <button id=\"claude-expand-all-btn\" class=\"control-btn\" style=\"padding: 4px 8px; font-size: 0.9em;\">Expand All</button>\n <button id=\"claude-collapse-all-btn\" class=\"control-btn\" style=\"padding: 4px 8px; font-size: 0.9em;\">Collapse All</button>\n <button id=\"claude-reset-zoom-btn\" class=\"control-btn\" style=\"padding: 4px 8px; font-size: 0.9em;\">Reset Zoom</button>\n <div class=\"stats\" id=\"claude-tree-stats\" style=\"margin-left: auto; font-size: 0.9em; color: #666;\"></div>\n </div>\n <div class=\"tree-container\" id=\"claude-tree-svg-container\" style=\"flex: 1; overflow: hidden; position: relative; background: white;\">\n <svg id=\"claude-activity-tree-svg\" style=\"width: 100%; height: 100%;\"></svg>\n </div>\n <div class=\"legend\" style=\"padding: 5px 10px; border-top: 1px solid #ddd; background: #f9f9f9; font-size: 0.85em; display: flex; gap: 15px;\">\n <span class=\"legend-item\"><span style=\"color: #4CAF50;\">●</span> File</span>\n <span class=\"legend-item\"><span style=\"color: #2196F3;\">●</span> Class</span>\n <span class=\"legend-item\"><span style=\"color: #FF9800;\">●</span> Function</span>\n <span class=\"legend-item\"><span style=\"color: #9C27B0;\">●</span> Method</span>\n <span class=\"legend-item\"><span style=\"color: #F44336;\">◆</span> Edited</span>\n <span class=\"legend-item\"><span style=\"color: #4CAF50;\">○</span> Viewed</span>\n </div>\n </div>\n `;\n\n // Get container dimensions for tree sizing\n const svgContainer = document.getElementById('claude-tree-svg-container');\n if (svgContainer) {\n const rect = svgContainer.getBoundingClientRect();\n this.width = rect.width || 800;\n this.height = rect.height || 600;\n }\n \n // Mark render as complete and re-enable observer if needed\n this.renderInProgress = false;\n \n // Re-enable container protection after render\n if (this.containerObserver && this.container) {\n this.containerObserver.observe(this.container, {\n childList: true,\n subtree: false // Only watch direct children, not subtree\n });\n }\n }\n\n /**\n * Render the content without switching tabs\n * This is called by UIStateManager when the tab is already active\n */\n renderContent() {\n this._showInternal();\n }\n \n /**\n * Show the activity tree (for backward compatibility)\n * Note: Tab switching is now handled by UIStateManager\n */\n show() {\n this._showInternal();\n }\n \n /**\n * Internal show implementation (without tab switching)\n */\n _showInternal() {\n console.log('[CodeViewer] _showInternal() called');\n\n // Get the file tree container\n const claudeTreeContainer = document.getElementById('claude-tree-container');\n if (!claudeTreeContainer) {\n console.error('[CodeViewer] File Tree container not found!');\n return;\n }\n\n console.log('[CodeViewer] Found container, current HTML length:', claudeTreeContainer.innerHTML.length);\n console.log('[CodeViewer] Container children:', claudeTreeContainer.children.length);\n\n // Refresh from FileToolTracker to get latest data\n this.refreshFromFileToolTracker();\n \n // CRITICAL: Clear any foreign content first - more aggressive cleanup\n const foreignSelectors = [\n '#events-list',\n '.events-list',\n '.event-item',\n '.no-events',\n '[id*=\"event\"]',\n '[class*=\"event\"]'\n ];\n \n let foundForeign = false;\n foreignSelectors.forEach(selector => {\n const elements = claudeTreeContainer.querySelectorAll(selector);\n if (elements.length > 0) {\n console.warn(`[CodeViewer] Found ${elements.length} foreign elements matching '${selector}', removing...`);\n elements.forEach(el => el.remove());\n foundForeign = true;\n }\n });\n \n if (foundForeign) {\n console.warn('[CodeViewer] Foreign content removed, clearing container completely for fresh start');\n claudeTreeContainer.innerHTML = '';\n }\n\n // CRITICAL: Prevent other components from writing to this container\n // Add multiple attributes to mark ownership strongly\n claudeTreeContainer.setAttribute('data-owner', 'code-viewer');\n claudeTreeContainer.setAttribute('data-tab-reserved', 'claude-tree');\n claudeTreeContainer.setAttribute('data-component', 'CodeViewer');\n \n // Store the container reference if not already set\n if (!this.container || this.container !== claudeTreeContainer) {\n this.container = claudeTreeContainer;\n }\n \n // Initialize if needed (this will setup container and render interface)\n if (!this.initialized) {\n this.initialize();\n } else {\n // Always render interface - it will handle empty state or tree as needed\n const existingWrapper = this.container.querySelector('.activity-tree-wrapper');\n const existingEmptyState = this.container.querySelector('.file-tree-empty-state');\n if (!existingWrapper && !existingEmptyState) {\n this.renderInterface();\n }\n }\n \n // Set up mutation observer to protect container (only if not already set)\n if (!this.containerObserver) {\n this.protectContainer();\n }\n\n // Always setup event handlers and render tree\n // Even with no file activity, we show a session root\n this.setupControlHandlers();\n \n // Get current session from main selector\n const mainSessionSelect = document.getElementById('session-select');\n if (mainSessionSelect) {\n this.currentSession = mainSessionSelect.value || null;\n }\n \n // Build and render tree (will create minimal session root if no data)\n this.buildTreeData();\n this.renderTree();\n \n // Update stats\n this.updateStats();\n }\n\n /**\n * Protect the container from being overwritten by other components\n */\n protectContainer() {\n const container = document.getElementById('claude-tree-container');\n if (!container) return;\n \n // Disconnect any existing observer\n if (this.containerObserver) {\n this.containerObserver.disconnect();\n }\n \n // Flag to prevent re-render loops\n let reRenderScheduled = false;\n \n // Create a new observer to watch for unwanted changes\n this.containerObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Check if nodes were added that shouldn't be there\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node;\n \n // AGGRESSIVE filtering: Block ANY content that's not our tree interface or empty state\n const isUnwantedContent = (\n element.classList?.contains('event-item') ||\n element.classList?.contains('events-list') ||\n element.classList?.contains('no-events') ||\n element.id === 'events-list' ||\n element.id === 'agents-list' ||\n element.id === 'tools-list' ||\n element.id === 'files-list' ||\n (element.textContent && (\n element.textContent.includes('[hook]') ||\n element.textContent.includes('hook.user_prompt') ||\n element.textContent.includes('hook.pre_tool') ||\n element.textContent.includes('hook.post_tool') ||\n element.textContent.includes('Connect to Socket.IO') ||\n element.textContent.includes('No events') ||\n element.textContent.includes('No agent events') ||\n element.textContent.includes('No tool events') ||\n element.textContent.includes('No file operations')\n )) ||\n // Block any div without our expected classes\n (element.tagName === 'DIV' && \n !element.classList?.contains('activity-tree-wrapper') &&\n !element.classList?.contains('file-tree-empty-state') &&\n !element.classList?.contains('activity-controls') &&\n !element.classList?.contains('tree-container') &&\n !element.classList?.contains('legend') &&\n !element.classList?.contains('stats') &&\n !element.id?.startsWith('claude-'))\n );\n \n if (isUnwantedContent) {\n // Block unwanted content silently\n \n // Remove the unwanted content immediately\n try {\n node.remove();\n } catch (e) {\n console.warn('[CodeViewer] Failed to remove unwanted node:', e);\n }\n \n // Schedule a single re-render if needed\n if (!reRenderScheduled && !this.renderInProgress) {\n reRenderScheduled = true;\n setTimeout(() => {\n reRenderScheduled = false;\n if (!container.querySelector('.activity-tree-wrapper') && \n !container.querySelector('.file-tree-empty-state')) {\n this.renderInterface();\n \n // Always setup controls and tree (even if no file activity)\n this.setupControlHandlers();\n this.buildTreeData();\n this.renderTree();\n }\n }, 50);\n }\n }\n }\n }\n \n // Also check if our content was removed\n if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {\n for (const node of mutation.removedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node;\n if (element.classList?.contains('activity-tree-wrapper') || \n element.classList?.contains('file-tree-empty-state')) {\n if (!reRenderScheduled && !this.renderInProgress) {\n reRenderScheduled = true;\n setTimeout(() => {\n reRenderScheduled = false;\n this.renderInterface();\n \n // Always setup controls and tree (even if no file activity)\n this.setupControlHandlers();\n this.buildTreeData();\n this.renderTree();\n }, 50);\n }\n }\n }\n }\n }\n }\n });\n \n // Start observing only direct children to reduce overhead\n this.containerObserver.observe(container, {\n childList: true,\n subtree: false // Only watch direct children, not entire subtree\n });\n }\n\n /**\n * Setup event handlers for controls\n */\n setupControlHandlers() {\n // Listen to main session selector changes\n const mainSessionSelect = document.getElementById('session-select');\n if (mainSessionSelect && !mainSessionSelect.hasAttribute('data-tree-listener')) {\n mainSessionSelect.setAttribute('data-tree-listener', 'true');\n mainSessionSelect.addEventListener('change', (e) => {\n this.currentSession = e.target.value || null;\n if (this.isTabActive()) {\n this.buildTreeData();\n this.renderTree();\n this.updateStats();\n }\n });\n }\n\n // Expand all button\n const expandBtn = document.getElementById('claude-expand-all-btn');\n if (expandBtn && !expandBtn.hasAttribute('data-listener')) {\n expandBtn.setAttribute('data-listener', 'true');\n expandBtn.addEventListener('click', () => {\n this.expandAllNodes();\n });\n }\n\n // Collapse all button\n const collapseBtn = document.getElementById('claude-collapse-all-btn');\n if (collapseBtn && !collapseBtn.hasAttribute('data-listener')) {\n collapseBtn.setAttribute('data-listener', 'true');\n collapseBtn.addEventListener('click', () => {\n this.collapseAllNodes();\n });\n }\n\n // Reset zoom button\n const resetBtn = document.getElementById('claude-reset-zoom-btn');\n if (resetBtn && !resetBtn.hasAttribute('data-listener')) {\n resetBtn.setAttribute('data-listener', 'true');\n resetBtn.addEventListener('click', () => {\n this.resetZoom();\n });\n }\n }\n\n /**\n * Setup event handlers\n */\n setupEventHandlers() {\n // Tab handling is done in show() method\n }\n\n /**\n * Subscribe to events from socket and event bus\n */\n subscribeToEvents() {\n // Listen for claude events from socket\n if (window.socket) {\n window.socket.on('claude_event', (event) => {\n\n // When we get file operation events, refresh from FileToolTracker\n if (this.isFileOperationEvent(event) || this.isDirectFileEvent(event)) {\n // Let FileToolTracker process the event first, then refresh our view\n setTimeout(() => {\n this.refreshFromFileToolTracker();\n // Only update if the File Tree tab is active\n if (this.isTabActive()) {\n this.buildTreeData();\n this.renderTree();\n this.updateStats();\n }\n }, 100);\n }\n });\n \n // Also listen for specific file events\n window.socket.on('file:read', (data) => {\n this.handleDirectFileEvent('Read', data);\n });\n \n window.socket.on('file:write', (data) => {\n this.handleDirectFileEvent('Write', data);\n });\n \n window.socket.on('file:edit', (data) => {\n this.handleDirectFileEvent('Edit', data);\n });\n }\n\n // Listen for events from event bus\n if (window.eventBus) {\n window.eventBus.on('claude_event', (event) => {\n \n // Process both hook events and direct file operation events\n if (this.isFileOperationEvent(event) || this.isDirectFileEvent(event)) {\n this.processClaudeEvent(event);\n // Only update if the File Tree tab is active\n if (this.isTabActive()) {\n this.buildTreeData();\n this.renderTree();\n this.updateStats();\n }\n }\n });\n }\n }\n\n /**\n * Check if File Tree tab is active\n */\n isTabActive() {\n const claudeTreeContent = document.getElementById('claude-tree-tab');\n return claudeTreeContent && claudeTreeContent.classList.contains('active');\n }\n\n /**\n * Process existing events from dashboard\n */\n processExistingEvents() {\n console.log('[CodeViewer] processExistingEvents called');\n\n // First try to use FileToolTracker data if available\n if (window.dashboard && window.dashboard.fileToolTracker) {\n this.refreshFromFileToolTracker();\n return;\n }\n\n // Fallback to event store if FileToolTracker not available\n if (window.dashboard && window.dashboard.eventStore) {\n const events = window.dashboard.eventStore.getAllEvents();\n console.log('[CodeViewer] Fallback to eventStore, total events:', events.length);\n \n let fileOpCount = 0;\n let processedCount = 0;\n \n events.forEach(event => {\n // Log detailed info about each event for debugging\n if (event.type === 'hook') {\n console.log('[CodeViewer] Hook event:', {\n subtype: event.subtype,\n tool_name: event.data?.tool_name,\n timestamp: event.timestamp\n });\n }\n \n if (this.isFileOperationEvent(event)) {\n fileOpCount++;\n console.log('[CodeViewer] Found file operation event:', event);\n this.processClaudeEvent(event);\n processedCount++;\n }\n });\n \n console.log('[CodeViewer] processExistingEvents summary:', {\n totalEvents: events.length,\n fileOperations: fileOpCount,\n processed: processedCount,\n currentFileActivitySize: this.fileActivity.size\n });\n } else {\n console.log('[CodeViewer] No dashboard or eventStore available');\n }\n }\n\n /**\n * Check if an event is a file operation event\n */\n isFileOperationEvent(event) {\n // Check if this is a hook event with file operation tool\n if (event.type === 'hook' && \n (event.subtype === 'pre_tool' || event.subtype === 'post_tool') &&\n event.data && event.data.tool_name) {\n const fileOps = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];\n return fileOps.includes(event.data.tool_name);\n }\n return false;\n }\n \n /**\n * Check if an event is a direct file event (not wrapped in hook)\n */\n isDirectFileEvent(event) {\n // Check if this is a direct file operation event\n if (event.type === 'file_operation' || \n (event.tool && ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'].includes(event.tool))) {\n return true;\n }\n return false;\n }\n \n /**\n * Handle direct file events from WebSocket\n */\n handleDirectFileEvent(tool_name, data) {\n const event = {\n type: 'file_operation',\n tool: tool_name,\n data: {\n tool_name: tool_name,\n tool_parameters: data.parameters || data,\n tool_output: data.output || null,\n session_id: data.session_id || this.currentSession,\n working_directory: data.working_directory || '/'\n },\n timestamp: data.timestamp || new Date().toISOString()\n };\n \n this.processClaudeEvent(event);\n \n // Only update if the File Tree tab is active\n if (this.isTabActive()) {\n this.buildTreeData();\n this.renderTree();\n this.updateStats();\n }\n }\n\n /**\n * Check if an event is a file operation (legacy format)\n */\n isFileOperation(event) {\n const fileOps = ['Read', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit'];\n return fileOps.includes(event.tool_name);\n }\n\n /**\n * Process a claude event with file operation\n */\n processClaudeEvent(event) {\n // Handle both hook events and direct file events\n if (!this.isFileOperationEvent(event) && !this.isDirectFileEvent(event)) return;\n\n let tool_name, tool_parameters, tool_output, timestamp, session_id, working_directory, filePath;\n \n // Extract data based on event format\n if (this.isFileOperationEvent(event)) {\n // Hook event format\n const data = event.data || {};\n tool_name = data.tool_name;\n tool_parameters = data.tool_parameters || {};\n tool_output = data.tool_output;\n timestamp = event.timestamp || new Date().toISOString();\n session_id = event.session_id || data.session_id;\n working_directory = data.working_directory || '/';\n } else if (this.isDirectFileEvent(event)) {\n // Direct file event format\n const data = event.data || event;\n tool_name = event.tool || data.tool_name;\n tool_parameters = data.tool_parameters || data.parameters || {};\n tool_output = data.tool_output || data.output;\n timestamp = event.timestamp || data.timestamp || new Date().toISOString();\n session_id = event.session_id || data.session_id;\n working_directory = data.working_directory || '/';\n }\n \n filePath = tool_parameters.file_path || tool_parameters.notebook_path;\n \n this.processFileOperation({\n tool_name,\n tool_parameters,\n tool_output,\n timestamp,\n session_id,\n working_directory,\n filePath\n });\n }\n\n /**\n * Process a file operation event (legacy format)\n */\n processEvent(event) {\n if (!this.isFileOperation(event)) return;\n\n const { tool_name, tool_parameters, tool_output, timestamp, session_id, working_directory } = event;\n const filePath = tool_parameters?.file_path || tool_parameters?.notebook_path;\n \n this.processFileOperation({\n tool_name,\n tool_parameters,\n tool_output,\n timestamp,\n session_id,\n working_directory,\n filePath\n });\n }\n\n /**\n * Process a file operation\n */\n processFileOperation({ tool_name, tool_parameters, tool_output, timestamp, session_id, working_directory, filePath }) {\n if (!filePath) return;\n\n // Track session\n if (session_id && !this.sessions.has(session_id)) {\n this.sessions.set(session_id, {\n id: session_id,\n working_directory: working_directory || '/',\n files: new Set()\n });\n // Update session list when new session is added\n this.updateSessionList();\n }\n\n // Get or create file activity\n if (!this.fileActivity.has(filePath)) {\n this.fileActivity.set(filePath, {\n path: filePath,\n operations: [],\n sessions: new Set(),\n working_directories: new Set(),\n lastContent: null,\n astPaths: []\n });\n }\n\n const activity = this.fileActivity.get(filePath);\n \n // Add operation\n activity.operations.push({\n type: tool_name,\n timestamp: timestamp,\n parameters: tool_parameters,\n output: tool_output,\n session_id: session_id\n });\n\n // Track session and working directory\n if (session_id) {\n activity.sessions.add(session_id);\n const session = this.sessions.get(session_id);\n if (session) {\n session.files.add(filePath);\n }\n }\n if (working_directory) {\n activity.working_directories.add(working_directory);\n }\n\n // Update content and extract AST if applicable\n if (tool_name === 'Write' && tool_parameters.content) {\n activity.lastContent = tool_parameters.content;\n activity.astPaths = this.extractASTPaths(tool_parameters.content, filePath);\n } else if (tool_name === 'Read' && tool_output?.content) {\n activity.lastContent = tool_output.content;\n activity.astPaths = this.extractASTPaths(tool_output.content, filePath);\n } else if (tool_name === 'Edit' && activity.lastContent) {\n // Apply edit to content if we have it\n const oldString = tool_parameters.old_string;\n const newString = tool_parameters.new_string;\n if (oldString && newString) {\n activity.lastContent = activity.lastContent.replace(oldString, newString);\n activity.astPaths = this.extractASTPaths(activity.lastContent, filePath);\n }\n }\n }\n\n /**\n * Extract AST paths from code content\n */\n extractASTPaths(content, filePath) {\n if (!content || typeof content !== 'string') return [];\n \n const ext = filePath.split('.').pop()?.toLowerCase();\n const paths = [];\n\n if (ext === 'py') {\n // Python: Extract classes, functions, and methods\n const classRegex = /^class\\s+(\\w+)/gm;\n const functionRegex = /^def\\s+(\\w+)/gm;\n const methodRegex = /^\\s{4,}def\\s+(\\w+)/gm;\n\n let match;\n while ((match = classRegex.exec(content)) !== null) {\n paths.push({ name: match[1], type: 'class' });\n }\n while ((match = functionRegex.exec(content)) !== null) {\n paths.push({ name: match[1], type: 'function' });\n }\n while ((match = methodRegex.exec(content)) !== null) {\n if (!paths.some(p => p.name === match[1])) {\n paths.push({ name: match[1], type: 'method' });\n }\n }\n } else if (ext === 'js' || ext === 'jsx' || ext === 'ts' || ext === 'tsx') {\n // JavaScript/TypeScript: Extract classes, functions, methods\n const classRegex = /class\\s+(\\w+)/g;\n const functionRegex = /function\\s+(\\w+)/g;\n const arrowFunctionRegex = /const\\s+(\\w+)\\s*=\\s*\\([^)]*\\)\\s*=>/g;\n const methodRegex = /(\\w+)\\s*\\([^)]*\\)\\s*\\{/g;\n\n let match;\n while ((match = classRegex.exec(content)) !== null) {\n paths.push({ name: match[1], type: 'class' });\n }\n while ((match = functionRegex.exec(content)) !== null) {\n paths.push({ name: match[1], type: 'function' });\n }\n while ((match = arrowFunctionRegex.exec(content)) !== null) {\n paths.push({ name: match[1], type: 'function' });\n }\n }\n\n return paths;\n }\n\n /**\n * Build tree data from file activity\n */\n buildTreeData() {\n // Get current session info\n const sessionId = this.currentSession || 'current-session';\n const sessionName = sessionId.substring(0, 8) + '...';\n \n // Always create a root with at least the session node\n const root = {\n name: `Session: ${sessionName}`,\n type: 'root',\n children: []\n };\n\n // If no file activity, still show the session root\n if (!this.fileActivity || this.fileActivity.size === 0) {\n // Add a placeholder node to indicate no files yet\n root.children.push({\n name: '(No file operations yet)',\n type: 'placeholder',\n children: []\n });\n this.treeData = root;\n console.log('[CodeViewer] Built minimal tree with session root');\n return;\n }\n\n // Group by working directory\n const dirMap = new Map();\n\n for (const [filePath, activity] of this.fileActivity.entries()) {\n // Filter by session if selected\n if (this.currentSession) {\n if (!activity.sessions.has(this.currentSession)) {\n continue;\n }\n }\n\n // Determine working directory\n const workingDirs = Array.from(activity.working_directories);\n const workingDir = workingDirs[0] || '/';\n\n if (!dirMap.has(workingDir)) {\n dirMap.set(workingDir, {\n name: workingDir.split('/').pop() || workingDir,\n path: workingDir,\n type: 'directory',\n children: []\n });\n }\n\n // Create file node\n const fileName = filePath.split('/').pop();\n const hasEdits = activity.operations.some(op => op.type === 'Edit' || op.type === 'Write');\n \n const fileNode = {\n name: fileName,\n path: filePath,\n type: 'file',\n edited: hasEdits,\n operations: activity.operations.length,\n children: []\n };\n\n // Add AST nodes\n if (activity.astPaths.length > 0) {\n activity.astPaths.forEach(ast => {\n fileNode.children.push({\n name: ast.name,\n type: ast.type,\n path: `${filePath}#${ast.name}`,\n children: []\n });\n });\n }\n\n dirMap.get(workingDir).children.push(fileNode);\n }\n\n // Add directories to root\n root.children = Array.from(dirMap.values());\n \n // If only one directory and it's the root, flatten\n if (root.children.length === 1 && root.children[0].path === '/') {\n root.children = root.children[0].children;\n }\n\n this.treeData = root;\n }\n\n /**\n * Render the D3 tree\n */\n renderTree() {\n if (!this.treeData || !this.container) return;\n\n // Ensure SVG element exists\n const svgElement = document.getElementById('claude-activity-tree-svg');\n if (!svgElement) {\n console.warn('[CodeViewer] SVG element not found, skipping tree render');\n return;\n }\n \n const svg = d3.select(svgElement);\n if (svg.empty()) {\n console.warn('[CodeViewer] D3 could not select SVG element');\n return;\n }\n \n svg.selectAll('*').remove();\n\n // Get actual dimensions\n const svgContainer = document.getElementById('claude-tree-svg-container');\n if (svgContainer) {\n const rect = svgContainer.getBoundingClientRect();\n this.width = rect.width || 800;\n this.height = rect.height || 600;\n }\n\n // Create container group for zoom/pan\n const g = svg.append('g');\n\n // Setup zoom behavior\n const zoom = d3.zoom()\n .scaleExtent([0.1, 4])\n .on('zoom', (event) => {\n g.attr('transform', event.transform);\n });\n\n svg.call(zoom);\n\n // Create tree layout\n const treeLayout = d3.tree()\n .size([this.height - 100, this.width - 200]);\n\n // Create hierarchy\n this.d3Root = d3.hierarchy(this.treeData);\n \n // Apply tree layout\n treeLayout(this.d3Root);\n\n // Create links\n const link = g.selectAll('.link')\n .data(this.d3Root.links())\n .enter().append('path')\n .attr('class', 'link')\n .attr('d', d3.linkHorizontal()\n .x(d => d.y + 100)\n .y(d => d.x + 50))\n .style('fill', 'none')\n .style('stroke', '#ccc')\n .style('stroke-width', 1);\n\n // Create nodes\n const node = g.selectAll('.node')\n .data(this.d3Root.descendants())\n .enter().append('g')\n .attr('class', 'node')\n .attr('transform', d => `translate(${d.y + 100},${d.x + 50})`);\n\n // Add circles for nodes\n node.append('circle')\n .attr('r', this.nodeRadius)\n .style('fill', d => this.getNodeColor(d.data))\n .style('stroke', d => d.data.edited ? '#F44336' : '#999')\n .style('stroke-width', d => d.data.edited ? 2 : 1)\n .style('cursor', 'pointer')\n .on('click', (event, d) => this.handleNodeClick(event, d));\n\n // Add text labels\n node.append('text')\n .attr('dy', '.35em')\n .attr('x', d => d.children ? -10 : 10)\n .style('text-anchor', d => d.children ? 'end' : 'start')\n .style('font-size', '12px')\n .style('cursor', 'pointer')\n .text(d => d.data.name)\n .on('click', (event, d) => this.handleNodeClick(event, d));\n\n // Store tree reference\n this.d3Tree = { svg, g, zoom };\n }\n\n /**\n * Get node color based on type\n */\n getNodeColor(node) {\n switch (node.type) {\n case 'root': return '#666';\n case 'directory': return '#FFC107';\n case 'file': return '#4CAF50';\n case 'class': return '#2196F3';\n case 'function': return '#FF9800';\n case 'method': return '#9C27B0';\n default: return '#999';\n }\n }\n\n /**\n * Handle node click\n */\n handleNodeClick(event, d) {\n event.stopPropagation();\n \n // Toggle children\n if (d.children) {\n d._children = d.children;\n d.children = null;\n } else if (d._children) {\n d.children = d._children;\n d._children = null;\n }\n\n // Re-render tree\n this.renderTree();\n\n // Update selection\n this.selectedNode = d;\n \n // Update the data viewer in the left pane if it's a file\n if (d.data.type === 'file' && this.fileActivity.has(d.data.path)) {\n this.showFileDetails(d.data.path);\n }\n }\n\n /**\n * Show file details in the left viewer pane\n */\n showFileDetails(filePath) {\n const activity = this.fileActivity.get(filePath);\n if (!activity) return;\n\n const dataContent = document.getElementById('module-data-content');\n if (!dataContent) return;\n\n // Update header\n const dataHeader = document.querySelector('.module-data-header h5');\n if (dataHeader) {\n dataHeader.innerHTML = `📄 ${filePath.split('/').pop()}`;\n }\n\n // Build operations display\n let html = '<div style=\"padding: 10px; overflow-y: auto; height: 100%;\">';\n html += `<div style=\"margin-bottom: 15px;\">`;\n html += `<strong>File Path:</strong> ${filePath}<br>`;\n html += `<strong>Operations:</strong> ${activity.operations.length}<br>`;\n html += `<strong>Sessions:</strong> ${activity.sessions.size}`;\n html += `</div>`;\n\n // Show operations timeline\n html += '<div style=\"margin-bottom: 15px;\"><strong>Operations Timeline:</strong></div>';\n activity.operations.forEach((op, index) => {\n const time = new Date(op.timestamp).toLocaleTimeString();\n html += `<div style=\"margin-bottom: 10px; padding: 8px; background: #f5f5f5; border-left: 3px solid ${this.getOperationColor(op.type)};\">`;\n html += `<div><strong>${op.type}</strong> at ${time}</div>`;\n \n if (op.type === 'Edit' && op.parameters) {\n html += `<div style=\"margin-top: 5px; font-size: 0.9em;\">`;\n html += `<div style=\"color: #d32f2f;\">- ${this.escapeHtml(op.parameters.old_string || '').substring(0, 100)}</div>`;\n html += `<div style=\"color: #388e3c;\">+ ${this.escapeHtml(op.parameters.new_string || '').substring(0, 100)}</div>`;\n html += `</div>`;\n }\n html += `</div>`;\n });\n\n // Show AST structure if available\n if (activity.astPaths.length > 0) {\n html += '<div style=\"margin-top: 15px;\"><strong>AST Structure:</strong></div>';\n html += '<ul style=\"list-style: none; padding-left: 10px;\">';\n activity.astPaths.forEach(ast => {\n const icon = ast.type === 'class' ? '🔷' : ast.type === 'function' ? '🔶' : '🔸';\n html += `<li>${icon} ${ast.name} (${ast.type})</li>`;\n });\n html += '</ul>';\n }\n\n html += '</div>';\n dataContent.innerHTML = html;\n }\n\n /**\n * Get operation color\n */\n getOperationColor(type) {\n switch (type) {\n case 'Write': return '#4CAF50';\n case 'Edit': return '#FF9800';\n case 'Read': return '#2196F3';\n default: return '#999';\n }\n }\n\n /**\n * Escape HTML\n */\n escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Expand all nodes\n */\n expandAllNodes() {\n if (!this.d3Root) return;\n \n this.d3Root.descendants().forEach(d => {\n if (d._children) {\n d.children = d._children;\n d._children = null;\n }\n });\n \n this.renderTree();\n }\n\n /**\n * Collapse all nodes\n */\n collapseAllNodes() {\n if (!this.d3Root) return;\n \n this.d3Root.descendants().forEach(d => {\n if (d.children && d.depth > 0) {\n d._children = d.children;\n d.children = null;\n }\n });\n \n this.renderTree();\n }\n\n /**\n * Reset zoom\n */\n resetZoom() {\n if (!this.d3Tree) return;\n \n this.d3Tree.svg.transition()\n .duration(750)\n .call(this.d3Tree.zoom.transform, d3.zoomIdentity);\n }\n\n /**\n * Update session list in main selector\n */\n updateSessionList() {\n // Update the main session selector if it exists\n const mainSelect = document.getElementById('session-select');\n if (!mainSelect) return;\n\n const currentValue = mainSelect.value;\n \n // Clear existing options except \"All Sessions\"\n while (mainSelect.options.length > 1) {\n mainSelect.remove(1);\n }\n\n // Add session options from our tracked sessions\n for (const [sessionId, session] of this.sessions.entries()) {\n // Check if option already exists\n let exists = false;\n for (let i = 0; i < mainSelect.options.length; i++) {\n if (mainSelect.options[i].value === sessionId) {\n exists = true;\n break;\n }\n }\n \n if (!exists) {\n const option = document.createElement('option');\n option.value = sessionId;\n option.textContent = `Session ${sessionId.substring(0, 8)}... (${session.files.size} files)`;\n mainSelect.appendChild(option);\n }\n }\n \n // Restore previous selection if it still exists\n if (currentValue) {\n mainSelect.value = currentValue;\n }\n }\n\n /**\n * Update statistics\n */\n updateStats() {\n const stats = document.getElementById('claude-tree-stats');\n if (!stats) return;\n\n const totalFiles = this.currentSession\n ? Array.from(this.fileActivity.values()).filter(a => a.sessions.has(this.currentSession)).length\n : this.fileActivity.size;\n \n const totalOps = this.currentSession\n ? Array.from(this.fileActivity.values())\n .filter(a => a.sessions.has(this.currentSession))\n .reduce((sum, a) => sum + a.operations.length, 0)\n : Array.from(this.fileActivity.values())\n .reduce((sum, a) => sum + a.operations.length, 0);\n\n stats.textContent = `Files: ${totalFiles} | Operations: ${totalOps} | Sessions: ${this.sessions.size}`;\n }\n\n /**\n * Refresh file activity from FileToolTracker\n */\n refreshFromFileToolTracker() {\n if (!window.dashboard || !window.dashboard.fileToolTracker) {\n console.log('[CodeViewer] FileToolTracker not available');\n return;\n }\n\n const fileOperations = window.dashboard.fileToolTracker.getFileOperations();\n console.log('[CodeViewer] Refreshing from FileToolTracker:', fileOperations.size, 'files');\n\n // Clear existing file activity\n this.fileActivity.clear();\n this.sessions.clear();\n\n // Create a default session if needed\n const defaultSessionId = 'current-session';\n this.sessions.set(defaultSessionId, {\n id: defaultSessionId,\n startTime: new Date().toISOString(),\n files: new Set()\n });\n this.currentSession = defaultSessionId;\n\n // Convert fileOperations Map to file activity for tree visualization\n fileOperations.forEach((fileData, filePath) => {\n // Add file to session\n const session = this.sessions.get(defaultSessionId);\n session.files.add(filePath);\n\n // Create file activity entry\n const firstOp = fileData.operations[0];\n const lastOp = fileData.operations[fileData.operations.length - 1];\n\n this.fileActivity.set(filePath, {\n path: filePath,\n firstAccess: firstOp ? firstOp.timestamp : fileData.lastOperation,\n lastAccess: fileData.lastOperation,\n accessCount: fileData.operations.length,\n operations: fileData.operations.map(op => ({\n type: op.operation,\n timestamp: op.timestamp,\n agent: op.agent\n })),\n workingDirectory: firstOp ? firstOp.workingDirectory : null,\n astNodes: [],\n content: null\n });\n });\n\n console.log('[CodeViewer] File activity refreshed:', this.fileActivity.size, 'files');\n }\n}\n\n// Create and export singleton instance\ntry {\n window.CodeViewer = new CodeViewer();\n console.log('[CodeViewer] Instance created successfully');\n} catch (error) {\n console.error('[CodeViewer] FAILED TO CREATE INSTANCE:', error);\n}\n\n// Auto-initialize when DOM is ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n console.log('[CodeViewer] DOMContentLoaded - attempting initialization');\n try {\n window.CodeViewer.initialize();\n \n // If File Tree tab is already active, show it\n const claudeTreeTab = document.getElementById('claude-tree-tab');\n if (claudeTreeTab && claudeTreeTab.classList.contains('active')) {\n setTimeout(() => window.CodeViewer.show(), 100);\n }\n } catch (error) {\n console.error('[CodeViewer] FAILED TO INITIALIZE:', error);\n }\n });\n} else {\n console.log('[CodeViewer] DOM already loaded - initializing immediately');\n try {\n window.CodeViewer.initialize();\n \n // If File Tree tab is already active, show it\n const claudeTreeTab = document.getElementById('claude-tree-tab');\n if (claudeTreeTab && claudeTreeTab.classList.contains('active')) {\n console.log('[CodeViewer] File Tree tab is active, showing in 100ms');\n setTimeout(() => window.CodeViewer.show(), 100);\n }\n } catch (error) {\n console.error('[CodeViewer] FAILED TO INITIALIZE:', error);\n }\n}\n\n// Also listen for tab changes to ensure we render when needed\ndocument.addEventListener('tabChanged', (event) => {\n if (event.detail && event.detail.newTab === 'claude-tree') {\n setTimeout(() => window.CodeViewer.show(), 50);\n }\n});\n\n// Tab click handling is now done by UIStateManager\n// CodeViewer.renderContent() is called when the File Tree tab is activated\n\n// FALLBACK: Periodic check to ensure File Tree tab is properly rendered\nsetInterval(() => {\n const claudeTreeTab = document.getElementById('claude-tree-tab');\n const claudeTreeContainer = document.getElementById('claude-tree-container');\n \n if (claudeTreeTab && claudeTreeTab.classList.contains('active') && \n claudeTreeContainer && \n !claudeTreeContainer.querySelector('.activity-tree-wrapper') &&\n !claudeTreeContainer.querySelector('.file-tree-empty-state')) {\n window.CodeViewer.show();\n }\n}, 5000);"],"names":["CodeViewer","constructor","this","container","svg","initialized","fileActivity","Map","sessions","currentSession","treeData","d3Tree","d3Root","selectedNode","width","height","nodeRadius","renderInProgress","containerObserver","initialize","console","log","setupContainer","setupEventHandlers","subscribeToEvents","processExistingEvents","error","treeContainer","document","getElementById","renderInterface","existingWrapper","querySelector","existingSvg","disconnect","innerHTML","svgContainer","rect","getBoundingClientRect","observe","childList","subtree","renderContent","_showInternal","show","claudeTreeContainer","length","children","refreshFromFileToolTracker","foundForeign","forEach","selector","elements","querySelectorAll","warn","el","remove","setAttribute","existingEmptyState","protectContainer","setupControlHandlers","mainSessionSelect","value","buildTreeData","renderTree","updateStats","reRenderScheduled","MutationObserver","mutations","mutation","node","addedNodes","nodeType","Node","ELEMENT_NODE","element","classList","contains","id","textContent","includes","tagName","startsWith","e","setTimeout","type","removedNodes","hasAttribute","addEventListener","target","isTabActive","expandBtn","expandAllNodes","collapseBtn","collapseAllNodes","resetBtn","resetZoom","window","socket","on","event","isFileOperationEvent","isDirectFileEvent","data","handleDirectFileEvent","eventBus","processClaudeEvent","claudeTreeContent","dashboard","fileToolTracker","eventStore","events","getAllEvents","fileOpCount","processedCount","subtype","tool_name","timestamp","totalEvents","fileOperations","processed","currentFileActivitySize","size","tool","tool_parameters","parameters","tool_output","output","session_id","working_directory","Date","toISOString","isFileOperation","filePath","file_path","notebook_path","processFileOperation","processEvent","has","set","files","Set","updateSessionList","path","operations","working_directories","lastContent","astPaths","activity","get","push","add","session","content","extractASTPaths","oldString","old_string","newString","new_string","replace","ext","split","pop","toLowerCase","paths","classRegex","functionRegex","methodRegex","match","exec","name","some","p","arrowFunctionRegex","root","substring","dirMap","entries","workingDir","Array","from","fileName","hasEdits","op","fileNode","edited","ast","values","svgElement","d3","select","empty","selectAll","g","append","zoom","scaleExtent","attr","transform","call","treeLayout","tree","hierarchy","links","enter","linkHorizontal","x","d","y","style","descendants","getNodeColor","handleNodeClick","text","stopPropagation","_children","showFileDetails","dataContent","dataHeader","html","index","time","toLocaleTimeString","getOperationColor","escapeHtml","icon","div","createElement","depth","transition","duration","zoomIdentity","mainSelect","currentValue","options","sessionId","exists","i","option","appendChild","stats","totalFiles","filter","a","totalOps","reduce","sum","getFileOperations","clear","defaultSessionId","startTime","fileData","firstOp","firstAccess","lastOperation","lastAccess","accessCount","map","operation","agent","workingDirectory","astNodes","readyState","claudeTreeTab","detail","newTab","setInterval"],"mappings":"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"}