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
- window.AgentInference=class{constructor(e){this.eventViewer=e,this.state={currentDelegation:null,sessionAgents:new Map,eventAgentMap:new Map,pmDelegations:new Map,agentToDelegation:new Map,orphanSubagents:new Map,subagentStartEvents:new Map},console.log("Agent inference system initialized")}initialize(){this.state={currentDelegation:null,sessionAgents:new Map,eventAgentMap:new Map,pmDelegations:new Map,agentToDelegation:new Map,orphanSubagents:new Map,subagentStartEvents:new Map}}inferAgentFromEvent(e){const t=e.data||{},n=e.session_id||t.session_id||"unknown",a=e.hook_event_name||t.hook_event_name||e.type||"",s=e.subtype||t.subtype||"",i=e.tool_name||t.tool_name||"";if(Math.random()<.1&&console.log("Agent inference debug:",{eventType:a,toolName:i,hasData:!!e.data,dataKeys:Object.keys(t),eventKeys:Object.keys(e),agentType:e.agent_type||t.agent_type,subagentType:e.subagent_type||t.subagent_type}),"SubagentStop"===a||"subagent_stop"===s){const i=this.extractAgentNameFromEvent(e);return console.log("SubagentStop event detected:",{agentName:i,sessionId:n,eventType:a,subtype:s,rawAgentType:e.agent_type||t.agent_type}),{type:"subagent",confidence:"definitive",agentName:i,reason:"SubagentStop event"}}if("Stop"===a||"stop"===s)return{type:"main_agent",confidence:"definitive",agentName:"PM",reason:"Stop event"};if("Task"===i){const t=this.extractSubagentTypeFromTask(e);if(t)return console.log("Task delegation detected:",{agentName:t,sessionId:n,eventType:a}),{type:"subagent",confidence:"high",agentName:t,reason:"Task tool with subagent_type"}}if("PreToolUse"===a&&"Task"===i){const t=this.extractSubagentTypeFromTask(e);if(t)return{type:"subagent",confidence:"high",agentName:t,reason:"PreToolUse Task delegation"}}{const e=n.toLowerCase();if(["subagent","task","agent-"].some(t=>e.includes(t)))return{type:"subagent",confidence:"medium",agentName:"Subagent",reason:"Session ID pattern"}}const o=e.agent_type||t.agent_type||e.agent_id||t.agent_id,g=e.subagent_type||t.subagent_type;if(g&&"unknown"!==g)return{type:"subagent",confidence:"high",agentName:this.normalizeAgentName(g),reason:"subagent_type field"};if(o&&"unknown"!==o&&"main"!==o)return{type:"subagent",confidence:"medium",agentName:this.normalizeAgentName(o),reason:"agent_type field"};if(t.delegation_details?.agent_type)return{type:"subagent",confidence:"high",agentName:this.normalizeAgentName(t.delegation_details.agent_type),reason:"delegation_details"};if(e.type&&e.type.startsWith("hook.")){const a=e.type.replace("hook.","");if("subagent_start"===a||"SubagentStart"===t.hook_event_name){const e=t.agent_type||t.agent_id||"Subagent";return console.log("SubagentStart event from Socket.IO:",{agentName:e,sessionId:n,hookType:a}),{type:"subagent",confidence:"definitive",agentName:this.normalizeAgentName(e),reason:"Socket.IO hook SubagentStart"}}if("subagent_stop"===a||"SubagentStop"===t.hook_event_name){const e=t.agent_type||t.agent_id||"Subagent";return{type:"subagent",confidence:"high",agentName:this.normalizeAgentName(e),reason:"Socket.IO hook SubagentStop"}}}return{type:"main_agent",confidence:"default",agentName:"PM",reason:"default classification"}}normalizeAgentName(e){if(!e)return"Unknown";const t={engineer:"Engineer Agent",research:"Research Agent",qa:"QA Agent",documentation:"Documentation Agent",security:"Security Agent",ops:"Ops Agent",version_control:"Version Control Agent",data_engineer:"Data Engineer Agent",test_integration:"Test Integration Agent",pm:"PM Agent"}[e.toLowerCase()];if(t)return t;let n=e.replace(/_/g," ").split(" ").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");return n.toLowerCase().includes("agent")||(n+=" Agent"),n}extractSubagentTypeFromTask(e){let t=null;return e.tool_parameters?.subagent_type?t=e.tool_parameters.subagent_type:e.data?.tool_parameters?.subagent_type?t=e.data.tool_parameters.subagent_type:e.data?.delegation_details?.agent_type?t=e.data.delegation_details.agent_type:e.tool_input?.subagent_type&&(t=e.tool_input.subagent_type),t?this.normalizeAgentName(t):null}extractAgentNameFromEvent(e){const t=e.data||{};if("Task"===e.tool_name||"Task"===t.tool_name){const t=this.extractSubagentTypeFromTask(e);if(t)return t}return e.subagent_type&&"unknown"!==e.subagent_type?this.normalizeAgentName(e.subagent_type):t.subagent_type&&"unknown"!==t.subagent_type?this.normalizeAgentName(t.subagent_type):t.delegation_details?.agent_type&&"unknown"!==t.delegation_details.agent_type?this.normalizeAgentName(t.delegation_details.agent_type):e.agent_type&&!["main","unknown"].includes(e.agent_type)?this.normalizeAgentName(e.agent_type):t.agent_type&&!["main","unknown"].includes(t.agent_type)?this.normalizeAgentName(t.agent_type):e.agent_id&&!["main","unknown"].includes(e.agent_id)?this.normalizeAgentName(e.agent_id):t.agent_id&&!["main","unknown"].includes(t.agent_id)?this.normalizeAgentName(t.agent_id):e.agent&&"unknown"!==e.agent?this.normalizeAgentName(e.agent):e.name&&"unknown"!==e.name?this.normalizeAgentName(e.name):"Unknown"}processAgentInference(){const e=this.eventViewer.events;this.state.currentDelegation=null,this.state.sessionAgents.clear(),this.state.eventAgentMap.clear(),this.state.pmDelegations.clear(),this.state.agentToDelegation.clear(),this.state.orphanSubagents.clear(),this.state.subagentStartEvents.clear(),console.log("Processing agent inference for",e.length,"events"),e&&0!==e.length?(e.forEach((e,t)=>{let n;try{const a=this.inferAgentFromEvent(e),s=e.session_id||e.data?.session_id||"default";n=a,this.state.currentDelegation&&"default"===a.confidence&&s===this.state.currentDelegation.sessionId&&(n={type:"subagent",confidence:"inherited",agentName:this.state.currentDelegation.agentName,reason:"inherited from delegation context"});const i=e.hook_event_name||e.data?.hook_event_name||"";if(("SubagentStart"===i||"hook.subagent_start"===e.type||"subagent_start"===e.subtype)&&"subagent"===a.type&&(this.state.subagentStartEvents.has(a.agentName)||this.state.subagentStartEvents.set(a.agentName,[]),this.state.subagentStartEvents.get(a.agentName).push({eventIndex:t,event:e,timestamp:e.timestamp,sessionId:s})),"Task"===e.tool_name&&"subagent"===a.type){const n=`pm_${s}_${t}_${a.agentName}`,i={id:n,agentName:a.agentName,sessionId:s,startIndex:t,endIndex:null,pmCall:e,timestamp:e.timestamp,agentEvents:[]};this.state.pmDelegations.set(n,i),this.state.agentToDelegation.set(a.agentName,n),this.state.currentDelegation={agentName:a.agentName,sessionId:s,startIndex:t,endIndex:null,delegationId:n},console.log("Delegation started:",this.state.currentDelegation)}else if("definitive"===a.confidence&&"SubagentStop event"===a.reason&&this.state.currentDelegation){this.state.currentDelegation.endIndex=t;const e=this.state.pmDelegations.get(this.state.currentDelegation.delegationId);e&&(e.endIndex=t),console.log("Delegation ended:",this.state.currentDelegation),this.state.currentDelegation=null}if(this.state.currentDelegation&&"subagent"===n.type){const a=this.state.pmDelegations.get(this.state.currentDelegation.delegationId);a&&a.agentEvents.push({eventIndex:t,event:e,inference:n})}this.state.eventAgentMap.set(t,n),this.state.sessionAgents.set(s,n),t<5&&console.log(`Event ${t} agent inference:`,{event_type:e.type||e.hook_event_name,subtype:e.subtype,tool_name:e.tool_name,inference:n,hasData:!!e.data,agentType:e.agent_type||e.data?.agent_type})}catch(a){console.error(`Error processing event ${t} for agent inference:`,a),n||(n={type:"main_agent",confidence:"error",agentName:"PM",reason:"error during processing"}),this.state.eventAgentMap.set(t,n)}}),this.identifyOrphanSubagents(e),console.log("Agent inference processing complete. Results:",{total_events:e.length,inferred_agents:this.state.eventAgentMap.size,unique_sessions:this.state.sessionAgents.size,pm_delegations:this.state.pmDelegations.size,agent_to_delegation_mappings:this.state.agentToDelegation.size,orphan_subagents:this.state.orphanSubagents.size})):console.log("No events to process for agent inference")}getInferredAgent(e){return this.state.eventAgentMap.get(e)||null}getInferredAgentForEvent(e){const t=this.eventViewer.events;let n=t.indexOf(e);if(-1===n&&e.timestamp&&(n=t.findIndex(t=>t.timestamp===e.timestamp&&t.session_id===e.session_id)),-1===n)return console.log("Agent inference: Could not find event in events array, performing inline inference"),this.inferAgentFromEvent(e);let a=this.getInferredAgent(n);return a||(a=this.inferAgentFromEvent(e),this.state.eventAgentMap.set(n,a)),a}getCurrentDelegation(){return this.state.currentDelegation}getSessionAgents(){return this.state.sessionAgents}getEventAgentMap(){return this.state.eventAgentMap}getPMDelegations(){return this.state.pmDelegations}getAgentToDelegationMap(){return this.state.agentToDelegation}buildDelegationHierarchy(){const e=this.getPMDelegations(),t=this.eventViewer.events,n={mainPM:{type:"pm",name:"PM",delegations:[],ownEvents:[],totalEvents:0},impliedPM:{type:"pm_implied",name:"Implied PM",delegations:[],ownEvents:[],totalEvents:0}};for(const[s,i]of e)n.mainPM.delegations.push({id:s,agentName:i.agentName,taskContext:this.extractTaskContext(i.pmCall),events:i.agentEvents,startTime:i.timestamp,endTime:i.endIndex?t[i.endIndex]?.timestamp:null,status:i.endIndex?"completed":"active"}),n.mainPM.totalEvents+=i.agentEvents.length;t.forEach((e,t)=>{const a=this.getInferredAgent(t);a&&"main_agent"===a.type&&(n.mainPM.ownEvents.push({eventIndex:t,event:e}),n.mainPM.totalEvents++)});const a=new Map;t.forEach((t,n)=>{const s=this.getInferredAgent(n);if(s&&"subagent"===s.type){let i=!0;for(const[t,a]of e)if(a.agentEvents.some(e=>e.eventIndex===n)){i=!1;break}if(i){const e=s.agentName;a.has(e)||a.set(e,[]),a.get(e).push({eventIndex:n,event:t,inference:s})}}});for(const[s,i]of a)n.impliedPM.delegations.push({id:`implied_${s}`,agentName:s,taskContext:"No explicit PM delegation",events:i,startTime:i[0].event.timestamp,endTime:i[i.length-1].event.timestamp,status:"completed"}),n.impliedPM.totalEvents+=i.length;return n}extractTaskContext(e){if(!e)return"Unknown task";const t=e.tool_parameters||e.data?.tool_parameters||{};return t.task||t.request||t.description||"Task delegation"}identifyOrphanSubagents(e){for(const[t,n]of this.state.subagentStartEvents)for(const a of n){const n=a.eventIndex,s=new Date(a.timestamp).getTime();let i=!1;for(let a=Math.max(0,n-20);a<n;a++){const n=e[a];if(!n)continue;const o=s-new Date(n.timestamp).getTime();if("Task"===n.tool_name&&o>=0&&o<1e4){const e=this.state.eventAgentMap.get(a);if(e&&e.agentName===t){i=!0;break}}}i||this.state.orphanSubagents.set(n,{agentName:t,timestamp:a.timestamp,sessionId:a.sessionId,event:a.event,groupingKey:null})}this.groupOrphanSubagents(5e3)}groupOrphanSubagents(e){const t=Array.from(this.state.orphanSubagents.values()).sort((e,t)=>new Date(e.timestamp)-new Date(t.timestamp));let n=null,a=null;for(const s of t){const t=new Date(s.timestamp).getTime();(!n||a&&t-a>e)&&(n=`implied_pm_${s.sessionId}_${t}`),s.groupingKey=n,a=t}}isOrphanSubagent(e){return this.state.orphanSubagents.has(e)}getOrphanContext(e){return this.state.orphanSubagents.get(e)||null}getOrphanGroups(){const e=new Map;for(const t of this.state.orphanSubagents.values()){const n=t.groupingKey;e.has(n)||e.set(n,[]),e.get(n).push(t)}return e}getUniqueAgentInstances(){const e=new Map;for(const[a,s]of this.state.pmDelegations){const t=s.agentName;e.has(t)||e.set(t,{id:`consolidated_${t}`,type:"consolidated_agent",agentName:t,delegations:[],pmCalls:[],allEvents:[],firstTimestamp:s.timestamp,lastTimestamp:s.timestamp,totalEventCount:s.agentEvents.length,delegationCount:1});const n=e.get(t);n.delegations.push({id:a,pmCall:s.pmCall,timestamp:s.timestamp,eventCount:s.agentEvents.length,startIndex:s.startIndex,endIndex:s.endIndex,events:s.agentEvents}),s.pmCall&&n.pmCalls.push(s.pmCall),n.allEvents=n.allEvents.concat(s.agentEvents),new Date(s.timestamp)<new Date(n.firstTimestamp)&&(n.firstTimestamp=s.timestamp),new Date(s.timestamp)>new Date(n.lastTimestamp)&&(n.lastTimestamp=s.timestamp),n.totalEventCount+=s.agentEvents.length,n.delegationCount++}const t=this.eventViewer.events;for(let a=0;a<t.length;a++){const n=this.getInferredAgent(a);n&&"subagent"===n.type&&!e.has(n.agentName)&&e.set(n.agentName,{id:`consolidated_${n.agentName}`,type:"consolidated_agent",agentName:n.agentName,delegations:[{id:`implied_pm_${n.agentName}_${a}`,pmCall:null,timestamp:t[a].timestamp,eventCount:1,startIndex:a,endIndex:null,events:[{eventIndex:a,event:t[a],inference:n}]}],pmCalls:[],allEvents:[{eventIndex:a,event:t[a],inference:n}],firstTimestamp:t[a].timestamp,lastTimestamp:t[a].timestamp,totalEventCount:1,delegationCount:1,isImplied:!0})}const n=Array.from(e.values()).sort((e,t)=>new Date(e.firstTimestamp)-new Date(t.firstTimestamp));return console.log("Consolidated unique agents:",{total_unique_agents:n.length,agents:n.map(e=>({name:e.agentName,delegations:e.delegationCount,totalEvents:e.totalEventCount}))}),n}};
2
- //# sourceMappingURL=agent-inference.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-inference.js","sources":["../../js/components/agent-inference.js"],"sourcesContent":["/**\n * Agent Inference Module\n *\n * Handles agent inference and processing logic for determining whether events\n * originate from the main agent or subagents based on event patterns and context.\n *\n * WHY: Separated from main dashboard to isolate complex agent inference logic\n * that analyzes event patterns to determine agent context. This provides better\n * maintainability and testability for a critical feature.\n *\n * DESIGN DECISION: This module maintains its own state for inference tracking\n * but relies on the event viewer for source data, keeping clear separation of\n * concerns while enabling delegation context tracking across events.\n */\nclass AgentInference {\n constructor(eventViewer) {\n this.eventViewer = eventViewer;\n\n // Agent inference state tracking\n this.state = {\n // Track current subagent delegation context\n currentDelegation: null,\n // Map of session_id -> agent context\n sessionAgents: new Map(),\n // Map of event indices -> inferred agent\n eventAgentMap: new Map(),\n // PM delegation tracking for unique instance views\n pmDelegations: new Map(), // delegation_id -> delegation context\n // Map of agent events to their PM delegation\n agentToDelegation: new Map(), // agent_name -> delegation_id\n // Track orphan subagent events (SubagentStart without PM Task)\n orphanSubagents: new Map(), // event_index -> orphan context\n // Track SubagentStart events for orphan detection\n subagentStartEvents: new Map() // agent_name -> array of start events\n };\n\n console.log('Agent inference system initialized');\n }\n\n /**\n * Initialize the agent inference system\n * Called when the dashboard initializes\n */\n initialize() {\n this.state = {\n currentDelegation: null,\n sessionAgents: new Map(),\n eventAgentMap: new Map(),\n pmDelegations: new Map(),\n agentToDelegation: new Map(),\n orphanSubagents: new Map(),\n subagentStartEvents: new Map()\n };\n }\n\n /**\n * Infer agent context from event payload\n * Based on production-ready detection from design document\n * @param {Object} event - Event payload\n * @returns {Object} - {type: 'main_agent'|'subagent', confidence: 'definitive'|'high'|'medium'|'default', agentName: string}\n */\n inferAgentFromEvent(event) {\n // Handle both direct properties and nested data properties\n const data = event.data || {};\n const sessionId = event.session_id || data.session_id || 'unknown';\n const eventType = event.hook_event_name || data.hook_event_name || event.type || '';\n const subtype = event.subtype || data.subtype || '';\n const toolName = event.tool_name || data.tool_name || '';\n\n // Debug logging for first few events to understand structure\n if (Math.random() < 0.1) {\n console.log('Agent inference debug:', {\n eventType,\n toolName,\n hasData: !!event.data,\n dataKeys: Object.keys(data),\n eventKeys: Object.keys(event),\n agentType: event.agent_type || data.agent_type,\n subagentType: event.subagent_type || data.subagent_type\n });\n }\n\n // Direct event detection (highest confidence) - from design doc\n if (eventType === 'SubagentStop' || subtype === 'subagent_stop') {\n const agentName = this.extractAgentNameFromEvent(event);\n // Log SubagentStop events for debugging\n console.log('SubagentStop event detected:', {\n agentName: agentName,\n sessionId: sessionId,\n eventType: eventType,\n subtype: subtype,\n rawAgentType: event.agent_type || data.agent_type\n });\n return {\n type: 'subagent',\n confidence: 'definitive',\n agentName: agentName,\n reason: 'SubagentStop event'\n };\n }\n\n if (eventType === 'Stop' || subtype === 'stop') {\n return {\n type: 'main_agent',\n confidence: 'definitive',\n agentName: 'PM',\n reason: 'Stop event'\n };\n }\n\n // Tool-based detection (high confidence) - from design doc\n if (toolName === 'Task') {\n const agentName = this.extractSubagentTypeFromTask(event);\n if (agentName) {\n // Log Task delegations for debugging\n console.log('Task delegation detected:', {\n agentName: agentName,\n sessionId: sessionId,\n eventType: eventType\n });\n return {\n type: 'subagent',\n confidence: 'high',\n agentName: agentName,\n reason: 'Task tool with subagent_type'\n };\n }\n }\n\n // Hook event pattern analysis (high confidence)\n if (eventType === 'PreToolUse' && toolName === 'Task') {\n const agentName = this.extractSubagentTypeFromTask(event);\n if (agentName) {\n return {\n type: 'subagent',\n confidence: 'high',\n agentName: agentName,\n reason: 'PreToolUse Task delegation'\n };\n }\n }\n\n // Session pattern analysis (medium confidence) - from design doc\n if (sessionId) {\n const sessionLower = sessionId.toLowerCase();\n if (['subagent', 'task', 'agent-'].some(pattern => sessionLower.includes(pattern))) {\n return {\n type: 'subagent',\n confidence: 'medium',\n agentName: 'Subagent',\n reason: 'Session ID pattern'\n };\n }\n }\n\n // Agent type field analysis - check multiple possible locations\n const agentType = event.agent_type || data.agent_type || event.agent_id || data.agent_id;\n const subagentType = event.subagent_type || data.subagent_type;\n\n if (subagentType && subagentType !== 'unknown') {\n return {\n type: 'subagent',\n confidence: 'high',\n agentName: this.normalizeAgentName(subagentType),\n reason: 'subagent_type field'\n };\n }\n\n if (agentType && agentType !== 'unknown' && agentType !== 'main') {\n return {\n type: 'subagent',\n confidence: 'medium',\n agentName: this.normalizeAgentName(agentType),\n reason: 'agent_type field'\n };\n }\n\n // Check for delegation_details from hook handler\n if (data.delegation_details?.agent_type) {\n return {\n type: 'subagent',\n confidence: 'high',\n agentName: this.normalizeAgentName(data.delegation_details.agent_type),\n reason: 'delegation_details'\n };\n }\n\n // Check if this looks like a Hook event from Socket.IO\n if (event.type && event.type.startsWith('hook.')) {\n // Extract the hook type\n const hookType = event.type.replace('hook.', '');\n\n // Handle SubagentStart events\n if (hookType === 'subagent_start' || (data.hook_event_name === 'SubagentStart')) {\n const rawAgentName = data.agent_type || data.agent_id || 'Subagent';\n console.log('SubagentStart event from Socket.IO:', {\n agentName: rawAgentName,\n sessionId: sessionId,\n hookType: hookType\n });\n return {\n type: 'subagent',\n confidence: 'definitive',\n agentName: this.normalizeAgentName(rawAgentName),\n reason: 'Socket.IO hook SubagentStart'\n };\n }\n\n // Handle SubagentStop events\n if (hookType === 'subagent_stop' || (data.hook_event_name === 'SubagentStop')) {\n const rawAgentName = data.agent_type || data.agent_id || 'Subagent';\n return {\n type: 'subagent',\n confidence: 'high',\n agentName: this.normalizeAgentName(rawAgentName),\n reason: 'Socket.IO hook SubagentStop'\n };\n }\n }\n\n // Default to main agent (from design doc)\n return {\n type: 'main_agent',\n confidence: 'default',\n agentName: 'PM',\n reason: 'default classification'\n };\n }\n\n /**\n * Normalize agent name from lowercase/underscore format to display format\n * @param {string} agentName - Raw agent name (e.g., 'engineer', 'test_integration')\n * @returns {string} - Normalized display name (e.g., 'Engineer Agent', 'Test Integration Agent')\n */\n normalizeAgentName(agentName) {\n if (!agentName) return 'Unknown';\n\n // Agent name mapping from raw format to display format\n const agentNameMap = {\n 'engineer': 'Engineer Agent',\n 'research': 'Research Agent',\n 'qa': 'QA Agent',\n 'documentation': 'Documentation Agent',\n 'security': 'Security Agent',\n 'ops': 'Ops Agent',\n 'version_control': 'Version Control Agent',\n 'data_engineer': 'Data Engineer Agent',\n 'test_integration': 'Test Integration Agent',\n 'pm': 'PM Agent'\n };\n\n // Check if we have a direct mapping\n const normalized = agentNameMap[agentName.toLowerCase()];\n if (normalized) {\n return normalized;\n }\n\n // If no direct mapping, apply basic formatting:\n // Convert underscore to space, capitalize words, and add \"Agent\" if not present\n let formatted = agentName\n .replace(/_/g, ' ')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n\n // Add \"Agent\" suffix if not already present\n if (!formatted.toLowerCase().includes('agent')) {\n formatted += ' Agent';\n }\n\n return formatted;\n }\n\n /**\n * Extract subagent type from Task tool parameters\n * @param {Object} event - Event with Task tool\n * @returns {string|null} - Subagent type or null\n */\n extractSubagentTypeFromTask(event) {\n let rawAgentName = null;\n\n // Check tool_parameters directly\n if (event.tool_parameters?.subagent_type) {\n rawAgentName = event.tool_parameters.subagent_type;\n }\n // Check nested in data.tool_parameters (hook events)\n else if (event.data?.tool_parameters?.subagent_type) {\n rawAgentName = event.data.tool_parameters.subagent_type;\n }\n // Check delegation_details (new structure)\n else if (event.data?.delegation_details?.agent_type) {\n rawAgentName = event.data.delegation_details.agent_type;\n }\n // Check tool_input fallback\n else if (event.tool_input?.subagent_type) {\n rawAgentName = event.tool_input.subagent_type;\n }\n\n // Normalize the agent name before returning\n return rawAgentName ? this.normalizeAgentName(rawAgentName) : null;\n }\n\n /**\n * Extract agent name from any event\n * @param {Object} event - Event payload\n * @returns {string} - Agent name\n */\n extractAgentNameFromEvent(event) {\n // Priority order based on reliability from design doc\n const data = event.data || {};\n\n // 1. Task tool subagent_type (highest priority)\n if (event.tool_name === 'Task' || data.tool_name === 'Task') {\n const taskAgent = this.extractSubagentTypeFromTask(event);\n if (taskAgent) return taskAgent;\n }\n\n // 2. Direct subagent_type field\n if (event.subagent_type && event.subagent_type !== 'unknown') {\n return this.normalizeAgentName(event.subagent_type);\n }\n if (data.subagent_type && data.subagent_type !== 'unknown') {\n return this.normalizeAgentName(data.subagent_type);\n }\n\n // 2.5. Check delegation_details\n if (data.delegation_details?.agent_type && data.delegation_details.agent_type !== 'unknown') {\n return this.normalizeAgentName(data.delegation_details.agent_type);\n }\n\n // 3. Agent type fields (but not 'main' or 'unknown')\n if (event.agent_type && !['main', 'unknown'].includes(event.agent_type)) {\n return this.normalizeAgentName(event.agent_type);\n }\n if (data.agent_type && !['main', 'unknown'].includes(data.agent_type)) {\n return this.normalizeAgentName(data.agent_type);\n }\n\n // 4. Agent ID field as fallback\n if (event.agent_id && !['main', 'unknown'].includes(event.agent_id)) {\n return this.normalizeAgentName(event.agent_id);\n }\n if (data.agent_id && !['main', 'unknown'].includes(data.agent_id)) {\n return this.normalizeAgentName(data.agent_id);\n }\n\n // 5. Other fallbacks\n if (event.agent && event.agent !== 'unknown') {\n return this.normalizeAgentName(event.agent);\n }\n\n if (event.name && event.name !== 'unknown') {\n return this.normalizeAgentName(event.name);\n }\n\n // Default fallback\n return 'Unknown';\n }\n\n /**\n * Process all events and build agent inference context\n * This tracks delegation boundaries and agent context throughout the session\n */\n processAgentInference() {\n const events = this.eventViewer.events;\n\n // Reset inference state\n this.state.currentDelegation = null;\n this.state.sessionAgents.clear();\n this.state.eventAgentMap.clear();\n this.state.pmDelegations.clear();\n this.state.agentToDelegation.clear();\n this.state.orphanSubagents.clear();\n this.state.subagentStartEvents.clear();\n\n console.log('Processing agent inference for', events.length, 'events');\n\n // Early return if no events\n if (!events || events.length === 0) {\n console.log('No events to process for agent inference');\n return;\n }\n\n // Process events chronologically to track delegation context\n events.forEach((event, index) => {\n let finalAgent; // Declare outside try-catch to ensure scope availability\n\n try {\n const inference = this.inferAgentFromEvent(event);\n const sessionId = event.session_id || event.data?.session_id || 'default';\n\n // Determine agent for this event based on context\n finalAgent = inference;\n\n // If we're in a delegation context and this event doesn't have high confidence agent info,\n // inherit from delegation context\n if (this.state.currentDelegation &&\n inference.confidence === 'default' &&\n sessionId === this.state.currentDelegation.sessionId) {\n finalAgent = {\n type: 'subagent',\n confidence: 'inherited',\n agentName: this.state.currentDelegation.agentName,\n reason: 'inherited from delegation context'\n };\n }\n\n // Track SubagentStart events for orphan detection\n const hookEventName = event.hook_event_name || event.data?.hook_event_name || '';\n const isSubagentStart = hookEventName === 'SubagentStart' || \n event.type === 'hook.subagent_start' ||\n event.subtype === 'subagent_start';\n \n if (isSubagentStart && inference.type === 'subagent') {\n // Track this SubagentStart event\n if (!this.state.subagentStartEvents.has(inference.agentName)) {\n this.state.subagentStartEvents.set(inference.agentName, []);\n }\n this.state.subagentStartEvents.get(inference.agentName).push({\n eventIndex: index,\n event: event,\n timestamp: event.timestamp,\n sessionId: sessionId\n });\n }\n\n // Track delegation boundaries and PM delegations\n if (event.tool_name === 'Task' && inference.type === 'subagent') {\n // Start of subagent delegation - create PM delegation entry\n const delegationId = `pm_${sessionId}_${index}_${inference.agentName}`;\n const pmDelegation = {\n id: delegationId,\n agentName: inference.agentName,\n sessionId: sessionId,\n startIndex: index,\n endIndex: null,\n pmCall: event, // Store the PM call event\n timestamp: event.timestamp,\n agentEvents: [] // Collect all events from this agent\n };\n\n this.state.pmDelegations.set(delegationId, pmDelegation);\n this.state.agentToDelegation.set(inference.agentName, delegationId);\n\n this.state.currentDelegation = {\n agentName: inference.agentName,\n sessionId: sessionId,\n startIndex: index,\n endIndex: null,\n delegationId: delegationId\n };\n console.log('Delegation started:', this.state.currentDelegation);\n } else if (inference.confidence === 'definitive' && inference.reason === 'SubagentStop event') {\n // End of subagent delegation\n if (this.state.currentDelegation) {\n this.state.currentDelegation.endIndex = index;\n\n // Update PM delegation end point\n const pmDelegation = this.state.pmDelegations.get(this.state.currentDelegation.delegationId);\n if (pmDelegation) {\n pmDelegation.endIndex = index;\n }\n\n console.log('Delegation ended:', this.state.currentDelegation);\n this.state.currentDelegation = null;\n }\n }\n\n // Track events within PM delegation context\n if (this.state.currentDelegation && finalAgent.type === 'subagent') {\n const pmDelegation = this.state.pmDelegations.get(this.state.currentDelegation.delegationId);\n if (pmDelegation) {\n pmDelegation.agentEvents.push({\n eventIndex: index,\n event: event,\n inference: finalAgent\n });\n }\n }\n\n // Store the inference result\n this.state.eventAgentMap.set(index, finalAgent);\n\n // Update session agent tracking\n this.state.sessionAgents.set(sessionId, finalAgent);\n\n // Debug first few inferences\n if (index < 5) {\n console.log(`Event ${index} agent inference:`, {\n event_type: event.type || event.hook_event_name,\n subtype: event.subtype,\n tool_name: event.tool_name,\n inference: finalAgent,\n hasData: !!event.data,\n agentType: event.agent_type || event.data?.agent_type\n });\n }\n } catch (error) {\n console.error(`Error processing event ${index} for agent inference:`, error);\n\n // Set a default finalAgent if not already set due to error\n if (!finalAgent) {\n finalAgent = {\n type: 'main_agent',\n confidence: 'error',\n agentName: 'PM',\n reason: 'error during processing'\n };\n }\n\n // Store the default inference for this event\n this.state.eventAgentMap.set(index, finalAgent);\n }\n });\n\n // Identify orphan subagents after all events are processed\n this.identifyOrphanSubagents(events);\n\n console.log('Agent inference processing complete. Results:', {\n total_events: events.length,\n inferred_agents: this.state.eventAgentMap.size,\n unique_sessions: this.state.sessionAgents.size,\n pm_delegations: this.state.pmDelegations.size,\n agent_to_delegation_mappings: this.state.agentToDelegation.size,\n orphan_subagents: this.state.orphanSubagents.size\n });\n }\n\n /**\n * Get inferred agent for a specific event\n * @param {number} eventIndex - Index of event in events array\n * @returns {Object|null} - Agent inference result or null\n */\n getInferredAgent(eventIndex) {\n return this.state.eventAgentMap.get(eventIndex) || null;\n }\n\n /**\n * Get inferred agent for an event object\n * @param {Object} event - Event object\n * @returns {Object|null} - Agent inference result or null\n */\n getInferredAgentForEvent(event) {\n const events = this.eventViewer.events;\n\n // Try to find by exact reference first\n let eventIndex = events.indexOf(event);\n\n // If exact match fails, try to find by timestamp or session_id + timestamp\n if (eventIndex === -1 && event.timestamp) {\n eventIndex = events.findIndex(e =>\n e.timestamp === event.timestamp &&\n e.session_id === event.session_id\n );\n }\n\n // If we still can't find it, perform inline inference\n if (eventIndex === -1) {\n console.log('Agent inference: Could not find event in events array, performing inline inference');\n return this.inferAgentFromEvent(event);\n }\n\n // Get cached inference or perform new inference\n let inference = this.getInferredAgent(eventIndex);\n if (!inference) {\n inference = this.inferAgentFromEvent(event);\n // Cache the result\n this.state.eventAgentMap.set(eventIndex, inference);\n }\n\n return inference;\n }\n\n /**\n * Get current delegation context\n * @returns {Object|null} - Current delegation or null\n */\n getCurrentDelegation() {\n return this.state.currentDelegation;\n }\n\n /**\n * Get session agents map\n * @returns {Map} - Map of session IDs to agent contexts\n */\n getSessionAgents() {\n return this.state.sessionAgents;\n }\n\n /**\n * Get event agent map\n * @returns {Map} - Map of event indices to agent contexts\n */\n getEventAgentMap() {\n return this.state.eventAgentMap;\n }\n\n /**\n * Get PM delegations for unique instance views\n * @returns {Map} - Map of delegation IDs to PM delegation contexts\n */\n getPMDelegations() {\n return this.state.pmDelegations;\n }\n\n /**\n * Get agent to delegation mapping\n * @returns {Map} - Map of agent names to delegation IDs\n */\n getAgentToDelegationMap() {\n return this.state.agentToDelegation;\n }\n\n /**\n * Build hierarchical delegation tree structure\n * @returns {Object} Tree structure with PM nodes and subagent children\n */\n buildDelegationHierarchy() {\n // Get all PM delegations\n const pmDelegations = this.getPMDelegations();\n const events = this.eventViewer.events;\n \n // Build hierarchy tree\n const hierarchy = {\n mainPM: {\n type: 'pm',\n name: 'PM',\n delegations: [],\n ownEvents: [],\n totalEvents: 0\n },\n impliedPM: {\n type: 'pm_implied',\n name: 'Implied PM',\n delegations: [],\n ownEvents: [],\n totalEvents: 0\n }\n };\n \n // Process explicit PM delegations\n for (const [delegationId, delegation] of pmDelegations) {\n hierarchy.mainPM.delegations.push({\n id: delegationId,\n agentName: delegation.agentName,\n taskContext: this.extractTaskContext(delegation.pmCall),\n events: delegation.agentEvents,\n startTime: delegation.timestamp,\n endTime: delegation.endIndex ? events[delegation.endIndex]?.timestamp : null,\n status: delegation.endIndex ? 'completed' : 'active'\n });\n hierarchy.mainPM.totalEvents += delegation.agentEvents.length;\n }\n \n // Find PM's own events\n events.forEach((event, index) => {\n const inference = this.getInferredAgent(index);\n if (inference && inference.type === 'main_agent') {\n hierarchy.mainPM.ownEvents.push({\n eventIndex: index,\n event: event\n });\n hierarchy.mainPM.totalEvents++;\n }\n });\n \n // Find orphan subagent events\n const orphanEvents = new Map();\n events.forEach((event, index) => {\n const inference = this.getInferredAgent(index);\n if (inference && inference.type === 'subagent') {\n // Check if this is part of any PM delegation\n let isOrphan = true;\n for (const [_, delegation] of pmDelegations) {\n if (delegation.agentEvents.some(e => e.eventIndex === index)) {\n isOrphan = false;\n break;\n }\n }\n \n if (isOrphan) {\n const agentName = inference.agentName;\n if (!orphanEvents.has(agentName)) {\n orphanEvents.set(agentName, []);\n }\n orphanEvents.get(agentName).push({\n eventIndex: index,\n event: event,\n inference: inference\n });\n }\n }\n });\n \n // Add orphan agents as implied PM delegations\n for (const [agentName, agentEvents] of orphanEvents) {\n hierarchy.impliedPM.delegations.push({\n id: `implied_${agentName}`,\n agentName: agentName,\n taskContext: 'No explicit PM delegation',\n events: agentEvents,\n startTime: agentEvents[0].event.timestamp,\n endTime: agentEvents[agentEvents.length - 1].event.timestamp,\n status: 'completed'\n });\n hierarchy.impliedPM.totalEvents += agentEvents.length;\n }\n \n return hierarchy;\n }\n \n /**\n * Extract task context from PM call\n * @param {Object} pmCall - PM's Task tool call\n * @returns {string} Task description\n */\n extractTaskContext(pmCall) {\n if (!pmCall) return 'Unknown task';\n \n const params = pmCall.tool_parameters || pmCall.data?.tool_parameters || {};\n return params.task || params.request || params.description || 'Task delegation';\n }\n \n /**\n * Identify orphan subagents (SubagentStart without PM Task delegation)\n * @param {Array} events - All events to analyze\n */\n identifyOrphanSubagents(events) {\n const ORPHAN_TIME_WINDOW = 5000; // 5 seconds to group orphans together\n \n // Check each SubagentStart event\n for (const [agentName, startEvents] of this.state.subagentStartEvents) {\n for (const startEvent of startEvents) {\n const eventIndex = startEvent.eventIndex;\n const timestamp = new Date(startEvent.timestamp).getTime();\n \n // Check if this SubagentStart has a corresponding PM Task delegation\n let hasTaskDelegation = false;\n \n // Look for a Task tool call within a reasonable time window before this SubagentStart\n for (let i = Math.max(0, eventIndex - 20); i < eventIndex; i++) {\n const prevEvent = events[i];\n if (!prevEvent) continue;\n \n const prevTimestamp = new Date(prevEvent.timestamp).getTime();\n const timeDiff = timestamp - prevTimestamp;\n \n // Check if this is a Task tool call within 10 seconds\n if (prevEvent.tool_name === 'Task' && timeDiff >= 0 && timeDiff < 10000) {\n const inference = this.state.eventAgentMap.get(i);\n if (inference && inference.agentName === agentName) {\n hasTaskDelegation = true;\n break;\n }\n }\n }\n \n // If no Task delegation found, mark as orphan\n if (!hasTaskDelegation) {\n this.state.orphanSubagents.set(eventIndex, {\n agentName: agentName,\n timestamp: startEvent.timestamp,\n sessionId: startEvent.sessionId,\n event: startEvent.event,\n groupingKey: null // Will be set by grouping logic\n });\n }\n }\n }\n \n // Group orphan subagents by time proximity or session\n this.groupOrphanSubagents(ORPHAN_TIME_WINDOW);\n }\n \n /**\n * Group orphan subagents that occur close together in time or same session\n * @param {number} timeWindow - Time window in milliseconds for grouping\n */\n groupOrphanSubagents(timeWindow) {\n const orphansList = Array.from(this.state.orphanSubagents.values())\n .sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp));\n \n let currentGroup = null;\n let lastTimestamp = null;\n \n for (const orphan of orphansList) {\n const timestamp = new Date(orphan.timestamp).getTime();\n \n // Check if this orphan should be in the same group\n if (!currentGroup || \n (lastTimestamp && timestamp - lastTimestamp > timeWindow)) {\n // Start a new group\n currentGroup = `implied_pm_${orphan.sessionId}_${timestamp}`;\n }\n \n orphan.groupingKey = currentGroup;\n lastTimestamp = timestamp;\n }\n }\n \n /**\n * Check if a subagent event is an orphan (no PM Task delegation)\n * @param {number} eventIndex - Index of the event\n * @returns {boolean} True if the event is from an orphan subagent\n */\n isOrphanSubagent(eventIndex) {\n return this.state.orphanSubagents.has(eventIndex);\n }\n \n /**\n * Get orphan subagent context for an event\n * @param {number} eventIndex - Index of the event \n * @returns {Object|null} Orphan context or null\n */\n getOrphanContext(eventIndex) {\n return this.state.orphanSubagents.get(eventIndex) || null;\n }\n \n /**\n * Get all orphan subagent groups\n * @returns {Map} Map of groupingKey -> array of orphan contexts\n */\n getOrphanGroups() {\n const groups = new Map();\n \n for (const orphan of this.state.orphanSubagents.values()) {\n const key = orphan.groupingKey;\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key).push(orphan);\n }\n \n return groups;\n }\n\n /**\n * Get unique agent instances (one per agent type, consolidating multiple delegations)\n * This is used for the unique instance view in the agents tab\n * @returns {Array} - Array of unique agent instances\n */\n getUniqueAgentInstances() {\n const agentMap = new Map(); // agentName -> consolidated data\n\n // Consolidate all PM delegations by agent name\n for (const [delegationId, delegation] of this.state.pmDelegations) {\n const agentName = delegation.agentName;\n\n if (!agentMap.has(agentName)) {\n // First delegation for this agent type\n agentMap.set(agentName, {\n id: `consolidated_${agentName}`,\n type: 'consolidated_agent',\n agentName: agentName,\n delegations: [], // Array of all delegations\n pmCalls: [], // Array of all PM calls\n allEvents: [], // Combined events from all delegations\n firstTimestamp: delegation.timestamp,\n lastTimestamp: delegation.timestamp,\n totalEventCount: delegation.agentEvents.length,\n delegationCount: 1\n });\n }\n\n // Add this delegation to the consolidated agent\n const agent = agentMap.get(agentName);\n agent.delegations.push({\n id: delegationId,\n pmCall: delegation.pmCall,\n timestamp: delegation.timestamp,\n eventCount: delegation.agentEvents.length,\n startIndex: delegation.startIndex,\n endIndex: delegation.endIndex,\n events: delegation.agentEvents\n });\n\n if (delegation.pmCall) {\n agent.pmCalls.push(delegation.pmCall);\n }\n\n // Merge events from all delegations\n agent.allEvents = agent.allEvents.concat(delegation.agentEvents);\n\n // Update consolidated metadata\n if (new Date(delegation.timestamp) < new Date(agent.firstTimestamp)) {\n agent.firstTimestamp = delegation.timestamp;\n }\n if (new Date(delegation.timestamp) > new Date(agent.lastTimestamp)) {\n agent.lastTimestamp = delegation.timestamp;\n }\n\n agent.totalEventCount += delegation.agentEvents.length;\n agent.delegationCount++;\n }\n\n // Handle agents that appear without explicit PM delegation (implied PM)\n const events = this.eventViewer.events;\n for (let index = 0; index < events.length; index++) {\n const inference = this.getInferredAgent(index);\n if (inference && inference.type === 'subagent' && !agentMap.has(inference.agentName)) {\n // Create consolidated agent for implied delegation\n agentMap.set(inference.agentName, {\n id: `consolidated_${inference.agentName}`,\n type: 'consolidated_agent',\n agentName: inference.agentName,\n delegations: [{\n id: `implied_pm_${inference.agentName}_${index}`,\n pmCall: null,\n timestamp: events[index].timestamp,\n eventCount: 1,\n startIndex: index,\n endIndex: null,\n events: [{\n eventIndex: index,\n event: events[index],\n inference: inference\n }]\n }],\n pmCalls: [],\n allEvents: [{\n eventIndex: index,\n event: events[index],\n inference: inference\n }],\n firstTimestamp: events[index].timestamp,\n lastTimestamp: events[index].timestamp,\n totalEventCount: 1,\n delegationCount: 1,\n isImplied: true\n });\n }\n }\n\n // Convert map to array and sort by first appearance (timestamp)\n const uniqueInstances = Array.from(agentMap.values())\n .sort((a, b) => new Date(a.firstTimestamp) - new Date(b.firstTimestamp));\n\n console.log('Consolidated unique agents:', {\n total_unique_agents: uniqueInstances.length,\n agents: uniqueInstances.map(agent => ({\n name: agent.agentName,\n delegations: agent.delegationCount,\n totalEvents: agent.totalEventCount\n }))\n });\n\n return uniqueInstances;\n }\n}\n\n// ES6 Module export\nexport { AgentInference };\nexport default AgentInference;\n\n// Make AgentInference globally available for dist/dashboard.js\nwindow.AgentInference = AgentInference;\n"],"names":["window","AgentInference","constructor","eventViewer","this","state","currentDelegation","sessionAgents","Map","eventAgentMap","pmDelegations","agentToDelegation","orphanSubagents","subagentStartEvents","console","log","initialize","inferAgentFromEvent","event","data","sessionId","session_id","eventType","hook_event_name","type","subtype","toolName","tool_name","Math","random","hasData","dataKeys","Object","keys","eventKeys","agentType","agent_type","subagentType","subagent_type","agentName","extractAgentNameFromEvent","rawAgentType","confidence","reason","extractSubagentTypeFromTask","sessionLower","toLowerCase","some","pattern","includes","agent_id","normalizeAgentName","delegation_details","startsWith","hookType","replace","rawAgentName","normalized","engineer","research","qa","documentation","security","ops","version_control","data_engineer","test_integration","pm","formatted","split","map","word","charAt","toUpperCase","slice","join","tool_parameters","tool_input","taskAgent","agent","name","processAgentInference","events","clear","length","forEach","index","finalAgent","inference","hookEventName","has","set","get","push","eventIndex","timestamp","delegationId","pmDelegation","id","startIndex","endIndex","pmCall","agentEvents","event_type","error","identifyOrphanSubagents","total_events","inferred_agents","size","unique_sessions","pm_delegations","agent_to_delegation_mappings","orphan_subagents","getInferredAgent","getInferredAgentForEvent","indexOf","findIndex","e","getCurrentDelegation","getSessionAgents","getEventAgentMap","getPMDelegations","getAgentToDelegationMap","buildDelegationHierarchy","hierarchy","mainPM","delegations","ownEvents","totalEvents","impliedPM","delegation","taskContext","extractTaskContext","startTime","endTime","status","orphanEvents","isOrphan","_","params","task","request","description","startEvents","startEvent","Date","getTime","hasTaskDelegation","i","max","prevEvent","timeDiff","groupingKey","groupOrphanSubagents","timeWindow","orphansList","Array","from","values","sort","a","b","currentGroup","lastTimestamp","orphan","isOrphanSubagent","getOrphanContext","getOrphanGroups","groups","key","getUniqueAgentInstances","agentMap","pmCalls","allEvents","firstTimestamp","totalEventCount","delegationCount","eventCount","concat","isImplied","uniqueInstances","total_unique_agents","agents"],"mappings":"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"}
@@ -1,333 +0,0 @@
1
- /**
2
- * Build Tracker Component
3
- *
4
- * WHY: Displays and manages version/build information for both MPM and Monitor UI,
5
- * providing users with clear visibility of the current system versions.
6
- *
7
- * DESIGN DECISION: Implemented as a standalone component that can be easily
8
- * integrated into the dashboard header, with automatic updates from SocketIO.
9
- */
10
-
11
- export class BuildTracker {
12
- constructor() {
13
- this.element = null;
14
- this.buildInfo = {
15
- monitor: {
16
- version: "1.0.0",
17
- build: 1,
18
- formatted_build: "0001",
19
- full_version: "v1.0.0-0001"
20
- },
21
- mpm: {
22
- version: "unknown",
23
- build: "unknown",
24
- full_version: "v0.0.0"
25
- }
26
- };
27
-
28
- // Socket client reference (will be set during initialization)
29
- this.socketClient = null;
30
-
31
- // Initialize the component
32
- this.init();
33
- }
34
-
35
- /**
36
- * Initialize the build tracker component
37
- */
38
- async init() {
39
- // Try to load version.json for dashboard version
40
- await this.loadDashboardVersion();
41
-
42
- this.createElements();
43
- this.setupEventListeners();
44
- }
45
-
46
- /**
47
- * Load dashboard version from version.json if available
48
- *
49
- * WHY: Attempts to load the actual dashboard version from the
50
- * version.json file created by the version management script.
51
- * Falls back to defaults if file is not available.
52
- */
53
- async loadDashboardVersion() {
54
- try {
55
- // Try to fetch version.json from the dashboard root
56
- const response = await fetch('/version.json');
57
- if (response.ok) {
58
- const versionData = await response.json();
59
-
60
- // Update monitor build info with loaded data
61
- this.buildInfo.monitor = {
62
- version: versionData.version || "1.0.0",
63
- build: versionData.build || 1,
64
- formatted_build: versionData.formatted_build || "0001",
65
- full_version: versionData.full_version || "v1.0.0-0001"
66
- };
67
-
68
- // Dashboard version loaded successfully
69
- }
70
- } catch (error) {
71
- // Silently fall back to defaults if version.json not available
72
- }
73
- }
74
-
75
- /**
76
- * Create the DOM elements for version display
77
- *
78
- * WHY: Creates a clean, unobtrusive version display that fits
79
- * seamlessly into the dashboard header.
80
- */
81
- createElements() {
82
- // Create container element
83
- this.element = document.createElement('div');
84
- this.element.className = 'version-display';
85
- this.element.id = 'version-display';
86
-
87
- // Create MPM version element
88
- const mpmVersion = document.createElement('span');
89
- mpmVersion.className = 'version-item mpm-version';
90
- mpmVersion.id = 'mpm-version';
91
- mpmVersion.innerHTML = `
92
- <span class="version-label">MPM</span>
93
- <span class="version-value">v0.0.0</span>
94
- `;
95
-
96
- // Create separator
97
- const separator = document.createElement('span');
98
- separator.className = 'version-separator';
99
- separator.textContent = '|';
100
-
101
- // Create Monitor version element
102
- const monitorVersion = document.createElement('span');
103
- monitorVersion.className = 'version-item monitor-version';
104
- monitorVersion.id = 'monitor-version';
105
- monitorVersion.innerHTML = `
106
- <span class="version-label">Monitor</span>
107
- <span class="version-value">v1.0.0-0001</span>
108
- `;
109
-
110
- // Assemble elements
111
- this.element.appendChild(mpmVersion);
112
- this.element.appendChild(separator);
113
- this.element.appendChild(monitorVersion);
114
-
115
- // Add tooltip for detailed info
116
- this.element.title = 'Click for detailed version information';
117
- }
118
-
119
- /**
120
- * Set the socket client for receiving updates
121
- *
122
- * @param {Object} socketClient - The Socket.IO client instance
123
- */
124
- setSocketClient(socketClient) {
125
- this.socketClient = socketClient;
126
-
127
- // Listen for build info updates
128
- if (this.socketClient && this.socketClient.socket) {
129
- // Listen for welcome message with build info
130
- this.socketClient.socket.on('welcome', (eventData) => {
131
- // Handle both old format (direct) and new schema (nested in data)
132
- const buildInfo = eventData.build_info ||
133
- (eventData.data && eventData.data.build_info);
134
- if (buildInfo) {
135
- this.updateBuildInfo(buildInfo);
136
- }
137
- });
138
-
139
- // Listen for status updates with build info
140
- this.socketClient.socket.on('status', (eventData) => {
141
- // Handle both old format (direct) and new schema (nested in data)
142
- const buildInfo = eventData.build_info ||
143
- (eventData.data && eventData.data.build_info);
144
- if (buildInfo) {
145
- this.updateBuildInfo(buildInfo);
146
- }
147
- });
148
-
149
- // Listen for explicit build info updates
150
- this.socketClient.socket.on('build_info', (data) => {
151
- this.updateBuildInfo(data);
152
- });
153
- }
154
- }
155
-
156
- /**
157
- * Update the build information
158
- *
159
- * @param {Object} buildInfo - Build information from server
160
- */
161
- updateBuildInfo(buildInfo) {
162
- // Store the build info
163
- this.buildInfo = buildInfo;
164
-
165
- // Update display
166
- this.updateDisplay();
167
- }
168
-
169
- /**
170
- * Update the version display elements
171
- *
172
- * WHY: Keeps the UI in sync with the latest version information
173
- * received from the server.
174
- */
175
- updateDisplay() {
176
- // Update MPM version
177
- const mpmElement = this.element.querySelector('.mpm-version .version-value');
178
- if (mpmElement && this.buildInfo.mpm) {
179
- const mpmVersion = this.buildInfo.mpm.full_version ||
180
- `v${this.buildInfo.mpm.version}`;
181
- mpmElement.textContent = mpmVersion;
182
-
183
- // Add build number to tooltip if available
184
- if (this.buildInfo.mpm.build && this.buildInfo.mpm.build !== "unknown") {
185
- mpmElement.parentElement.title = `MPM Build: ${this.buildInfo.mpm.build}`;
186
- }
187
- }
188
-
189
- // Update Monitor version
190
- const monitorElement = this.element.querySelector('.monitor-version .version-value');
191
- if (monitorElement && this.buildInfo.monitor) {
192
- const monitorVersion = this.buildInfo.monitor.full_version ||
193
- `v${this.buildInfo.monitor.version}-${this.buildInfo.monitor.formatted_build}`;
194
- monitorElement.textContent = monitorVersion;
195
-
196
- // Add last updated to tooltip if available
197
- if (this.buildInfo.monitor.last_updated) {
198
- const lastUpdated = new Date(this.buildInfo.monitor.last_updated).toLocaleString();
199
- monitorElement.parentElement.title = `Monitor Build: ${this.buildInfo.monitor.formatted_build}\nLast Updated: ${lastUpdated}`;
200
- }
201
- }
202
- }
203
-
204
- /**
205
- * Setup event listeners
206
- *
207
- * WHY: Allows users to interact with the version display for
208
- * additional information or actions.
209
- */
210
- setupEventListeners() {
211
- // Click handler for showing detailed version info
212
- this.element.addEventListener('click', () => {
213
- this.showDetailedInfo();
214
- });
215
- }
216
-
217
- /**
218
- * Show detailed version information in a modal or alert
219
- *
220
- * WHY: Provides power users with detailed build and version
221
- * information for debugging and support purposes.
222
- */
223
- showDetailedInfo() {
224
- const info = [];
225
-
226
- // MPM information
227
- if (this.buildInfo.mpm) {
228
- info.push('=== MPM Framework ===');
229
- info.push(`Version: ${this.buildInfo.mpm.version}`);
230
- if (this.buildInfo.mpm.build && this.buildInfo.mpm.build !== "unknown") {
231
- info.push(`Build: ${this.buildInfo.mpm.build}`);
232
- }
233
- info.push(`Full: ${this.buildInfo.mpm.full_version}`);
234
- }
235
-
236
- info.push('');
237
-
238
- // Monitor information
239
- if (this.buildInfo.monitor) {
240
- info.push('=== Monitor UI ===');
241
- info.push(`Version: ${this.buildInfo.monitor.version}`);
242
- info.push(`Build: ${this.buildInfo.monitor.formatted_build} (${this.buildInfo.monitor.build})`);
243
- info.push(`Full: ${this.buildInfo.monitor.full_version}`);
244
- if (this.buildInfo.monitor.last_updated) {
245
- const lastUpdated = new Date(this.buildInfo.monitor.last_updated).toLocaleString();
246
- info.push(`Updated: ${lastUpdated}`);
247
- }
248
- }
249
-
250
- // Version information compiled
251
-
252
- // Create a simple modal-like display
253
- const modal = document.createElement('div');
254
- modal.className = 'version-modal';
255
- modal.innerHTML = `
256
- <div class="version-modal-content">
257
- <h3>Version Information</h3>
258
- <pre>${info.join('\n')}</pre>
259
- <button onclick="this.parentElement.parentElement.remove()">Close</button>
260
- </div>
261
- `;
262
-
263
- // Add to body
264
- document.body.appendChild(modal);
265
-
266
- // Auto-remove after 10 seconds
267
- setTimeout(() => {
268
- modal.remove();
269
- }, 10000);
270
- }
271
-
272
- /**
273
- * Mount the component to a parent element
274
- *
275
- * @param {HTMLElement|string} parent - Parent element or selector
276
- */
277
- mount(parent) {
278
- const parentElement = typeof parent === 'string'
279
- ? document.querySelector(parent)
280
- : parent;
281
-
282
- if (!this.element) {
283
- return;
284
- }
285
-
286
- if (!parentElement) {
287
- return;
288
- }
289
-
290
- // Check if already mounted to prevent duplicates
291
- if (this.element.parentNode === parentElement) {
292
- return;
293
- }
294
-
295
- parentElement.appendChild(this.element);
296
- }
297
-
298
- /**
299
- * Get the component's DOM element
300
- *
301
- * @returns {HTMLElement} The component's root element
302
- */
303
- getElement() {
304
- return this.element;
305
- }
306
-
307
- /**
308
- * Destroy the component and clean up
309
- */
310
- destroy() {
311
- if (this.element && this.element.parentNode) {
312
- this.element.parentNode.removeChild(this.element);
313
- }
314
-
315
- // Clean up socket listeners
316
- if (this.socketClient && this.socketClient.socket) {
317
- this.socketClient.socket.off('welcome');
318
- this.socketClient.socket.off('status');
319
- this.socketClient.socket.off('build_info');
320
- }
321
-
322
- this.element = null;
323
- this.socketClient = null;
324
- }
325
- }
326
-
327
- // ES6 Module export
328
- export default BuildTracker;
329
-
330
- // Make BuildTracker globally available for backward compatibility
331
- if (typeof window !== 'undefined') {
332
- window.BuildTracker = BuildTracker;
333
- }