claude-mpm 5.0.9__py3-none-any.whl → 5.4.41__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 (263) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/{PM_INSTRUCTIONS_TEACH.md → CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md} +721 -41
  5. claude_mpm/agents/MEMORY.md +1 -1
  6. claude_mpm/agents/PM_INSTRUCTIONS.md +468 -468
  7. claude_mpm/agents/WORKFLOW.md +5 -254
  8. claude_mpm/agents/agent_loader.py +13 -44
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/frontmatter_validator.py +70 -2
  11. claude_mpm/agents/templates/circuit-breakers.md +431 -45
  12. claude_mpm/cli/__init__.py +0 -1
  13. claude_mpm/cli/__main__.py +4 -0
  14. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  15. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  16. claude_mpm/cli/commands/agents.py +175 -37
  17. claude_mpm/cli/commands/auto_configure.py +723 -236
  18. claude_mpm/cli/commands/config.py +88 -2
  19. claude_mpm/cli/commands/configure.py +1262 -157
  20. claude_mpm/cli/commands/configure_agent_display.py +25 -6
  21. claude_mpm/cli/commands/mpm_init/core.py +225 -46
  22. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  23. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  24. claude_mpm/cli/commands/postmortem.py +1 -1
  25. claude_mpm/cli/commands/profile.py +277 -0
  26. claude_mpm/cli/commands/skills.py +214 -189
  27. claude_mpm/cli/commands/summarize.py +413 -0
  28. claude_mpm/cli/executor.py +21 -3
  29. claude_mpm/cli/interactive/agent_wizard.py +85 -10
  30. claude_mpm/cli/parsers/agents_parser.py +54 -9
  31. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  32. claude_mpm/cli/parsers/base_parser.py +12 -0
  33. claude_mpm/cli/parsers/config_parser.py +153 -83
  34. claude_mpm/cli/parsers/profile_parser.py +148 -0
  35. claude_mpm/cli/parsers/skills_parser.py +3 -2
  36. claude_mpm/cli/startup.py +879 -149
  37. claude_mpm/commands/mpm-config.md +28 -0
  38. claude_mpm/commands/mpm-doctor.md +9 -22
  39. claude_mpm/commands/mpm-help.md +5 -287
  40. claude_mpm/commands/mpm-init.md +81 -507
  41. claude_mpm/commands/mpm-monitor.md +15 -402
  42. claude_mpm/commands/mpm-organize.md +120 -0
  43. claude_mpm/commands/mpm-postmortem.md +6 -108
  44. claude_mpm/commands/mpm-session-resume.md +12 -363
  45. claude_mpm/commands/mpm-status.md +5 -69
  46. claude_mpm/commands/mpm-ticket-view.md +52 -495
  47. claude_mpm/commands/mpm-version.md +5 -107
  48. claude_mpm/config/agent_sources.py +27 -0
  49. claude_mpm/core/config.py +2 -4
  50. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  51. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  52. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  53. claude_mpm/core/framework_loader.py +4 -2
  54. claude_mpm/core/logger.py +13 -0
  55. claude_mpm/core/optimized_startup.py +59 -0
  56. claude_mpm/core/output_style_manager.py +173 -43
  57. claude_mpm/core/shared/config_loader.py +1 -1
  58. claude_mpm/core/socketio_pool.py +3 -3
  59. claude_mpm/core/unified_agent_registry.py +134 -16
  60. claude_mpm/core/unified_config.py +22 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  74. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  75. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  76. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  77. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  78. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  79. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  80. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  87. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  88. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  89. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  90. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  91. claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
  92. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  93. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  97. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  98. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  99. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  100. claude_mpm/hooks/memory_integration_hook.py +46 -1
  101. claude_mpm/init.py +63 -19
  102. claude_mpm/models/agent_definition.py +7 -0
  103. claude_mpm/models/git_repository.py +3 -3
  104. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  105. claude_mpm/scripts/launch_monitor.py +93 -13
  106. claude_mpm/scripts/start_activity_logging.py +0 -0
  107. claude_mpm/services/agents/agent_builder.py +3 -3
  108. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  109. claude_mpm/services/agents/agent_review_service.py +280 -0
  110. claude_mpm/services/agents/cache_git_manager.py +6 -6
  111. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  112. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
  113. claude_mpm/services/agents/deployment/agent_template_builder.py +5 -3
  114. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  115. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +320 -29
  116. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +546 -68
  117. claude_mpm/services/agents/git_source_manager.py +36 -2
  118. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  119. claude_mpm/services/agents/recommender.py +5 -3
  120. claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
  121. claude_mpm/services/agents/sources/git_source_sync_service.py +13 -6
  122. claude_mpm/services/agents/startup_sync.py +22 -2
  123. claude_mpm/services/agents/toolchain_detector.py +10 -6
  124. claude_mpm/services/analysis/__init__.py +11 -1
  125. claude_mpm/services/analysis/clone_detector.py +1030 -0
  126. claude_mpm/services/command_deployment_service.py +81 -10
  127. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  128. claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
  129. claude_mpm/services/event_bus/config.py +3 -1
  130. claude_mpm/services/git/git_operations_service.py +101 -16
  131. claude_mpm/services/monitor/daemon.py +9 -2
  132. claude_mpm/services/monitor/daemon_manager.py +39 -3
  133. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  134. claude_mpm/services/monitor/server.py +698 -22
  135. claude_mpm/services/pm_skills_deployer.py +676 -0
  136. claude_mpm/services/profile_manager.py +331 -0
  137. claude_mpm/services/project/project_organizer.py +4 -0
  138. claude_mpm/services/self_upgrade_service.py +120 -12
  139. claude_mpm/services/skills/__init__.py +3 -0
  140. claude_mpm/services/skills/git_skill_source_manager.py +130 -2
  141. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  142. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  143. claude_mpm/services/skills_deployer.py +126 -9
  144. claude_mpm/services/socketio/dashboard_server.py +1 -0
  145. claude_mpm/services/socketio/event_normalizer.py +51 -6
  146. claude_mpm/services/socketio/server/core.py +386 -108
  147. claude_mpm/services/version_control/git_operations.py +103 -0
  148. claude_mpm/skills/skill_manager.py +92 -3
  149. claude_mpm/utils/agent_dependency_loader.py +14 -2
  150. claude_mpm/utils/agent_filters.py +17 -44
  151. claude_mpm/utils/gitignore.py +3 -0
  152. claude_mpm/utils/migration.py +4 -4
  153. claude_mpm/utils/robust_installer.py +47 -3
  154. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +57 -87
  155. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +160 -211
  156. claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
  157. claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
  158. claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
  159. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  160. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  161. claude_mpm/agents/BASE_OPS.md +0 -219
  162. claude_mpm/agents/BASE_PM.md +0 -480
  163. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  164. claude_mpm/agents/BASE_QA.md +0 -167
  165. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  166. claude_mpm/agents/base_agent_loader.py +0 -601
  167. claude_mpm/cli/commands/agents_detect.py +0 -380
  168. claude_mpm/cli/commands/agents_recommend.py +0 -309
  169. claude_mpm/cli/ticket_cli.py +0 -35
  170. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  171. claude_mpm/commands/mpm-agents-detect.md +0 -177
  172. claude_mpm/commands/mpm-agents-list.md +0 -131
  173. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  174. claude_mpm/commands/mpm-config-view.md +0 -150
  175. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  176. claude_mpm/dashboard/analysis_runner.py +0 -455
  177. claude_mpm/dashboard/index.html +0 -13
  178. claude_mpm/dashboard/open_dashboard.py +0 -66
  179. claude_mpm/dashboard/static/css/activity.css +0 -1958
  180. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  181. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  182. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  183. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  184. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  185. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  186. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  187. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  188. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  189. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  190. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  191. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  192. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  193. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  194. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  195. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  196. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  197. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  198. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  199. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  200. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  201. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  202. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  203. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  204. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  205. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  206. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  207. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  208. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  209. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  210. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  211. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  212. claude_mpm/dashboard/templates/code_simple.html +0 -153
  213. claude_mpm/dashboard/templates/index.html +0 -606
  214. claude_mpm/dashboard/test_dashboard.html +0 -372
  215. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  216. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  217. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  218. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  219. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  220. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  221. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  222. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  223. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  224. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  225. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  226. claude_mpm/scripts/mcp_server.py +0 -75
  227. claude_mpm/scripts/mcp_wrapper.py +0 -39
  228. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  229. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  230. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  231. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  232. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  233. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  234. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  235. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  236. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  237. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  239. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  240. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  241. claude_mpm/services/mcp_gateway/main.py +0 -589
  242. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  243. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  244. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  245. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  246. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  247. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  248. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  249. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  250. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  251. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  252. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  253. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  254. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  255. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  256. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  257. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  258. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  259. claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
  260. claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
  261. /claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +0 -0
  262. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
  263. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
@@ -1,368 +0,0 @@
1
- /**
2
- * Export Manager Module
3
- *
4
- * Handles export functionality and utility functions for the dashboard.
5
- * Provides data export capabilities and common utility functions used across modules.
6
- *
7
- * WHY: Extracted from main dashboard to centralize export logic and utility functions
8
- * that don't belong to specific functional areas. This provides a clean place for
9
- * shared utilities while keeping export logic organized and testable.
10
- *
11
- * DESIGN DECISION: Combines export functionality with general utilities to avoid
12
- * creating too many small modules while keeping related functionality together.
13
- * Provides both data export and UI utility functions.
14
- */
15
- class ExportManager {
16
- constructor(eventViewer) {
17
- this.eventViewer = eventViewer;
18
- this.setupEventHandlers();
19
-
20
- console.log('Export manager initialized');
21
- }
22
-
23
- /**
24
- * Set up event handlers for export functionality
25
- */
26
- setupEventHandlers() {
27
- const clearBtn = document.querySelector('button[onclick="clearEvents()"]');
28
- const exportBtn = document.getElementById('export-btn');
29
-
30
- if (clearBtn) {
31
- clearBtn.addEventListener('click', () => {
32
- this.clearEvents();
33
- });
34
- }
35
-
36
- if (exportBtn) {
37
- exportBtn.addEventListener('click', () => {
38
- this.exportEvents();
39
- });
40
- }
41
- }
42
-
43
- /**
44
- * Export current events to file
45
- * Delegates to the event viewer's export functionality
46
- */
47
- exportEvents() {
48
- if (this.eventViewer) {
49
- this.eventViewer.exportEvents();
50
- } else {
51
- console.error('Cannot export events: EventViewer not available');
52
- }
53
- }
54
-
55
- /**
56
- * Clear all events and reset dashboard state
57
- * This is a coordinated clear that notifies all relevant modules
58
- */
59
- clearEvents() {
60
- // Dispatch event to notify other modules
61
- document.dispatchEvent(new CustomEvent('eventsClearing'));
62
-
63
- // Clear events from event viewer
64
- if (this.eventViewer) {
65
- this.eventViewer.clearEvents();
66
- }
67
-
68
- // Dispatch event to notify clearing is complete
69
- document.dispatchEvent(new CustomEvent('eventsCleared'));
70
-
71
- console.log('Events cleared');
72
- }
73
-
74
- /**
75
- * Export events with custom filtering
76
- * @param {Object} options - Export options
77
- * @param {string} options.format - Export format ('json', 'csv', 'txt')
78
- * @param {Array} options.events - Events to export (optional, uses all if not provided)
79
- * @param {string} options.filename - Custom filename (optional)
80
- */
81
- exportEventsCustom(options = {}) {
82
- const {
83
- format = 'json',
84
- events = null,
85
- filename = null
86
- } = options;
87
-
88
- const eventsToExport = events || (this.eventViewer ? this.eventViewer.events : []);
89
-
90
- if (eventsToExport.length === 0) {
91
- console.warn('No events to export');
92
- return;
93
- }
94
-
95
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
96
- const defaultFilename = `claude-mpm-events-${timestamp}`;
97
- const exportFilename = filename || defaultFilename;
98
-
99
- let content = '';
100
- let mimeType = '';
101
- let fileExtension = '';
102
-
103
- switch (format.toLowerCase()) {
104
- case 'json':
105
- content = JSON.stringify(eventsToExport, null, 2);
106
- mimeType = 'application/json';
107
- fileExtension = '.json';
108
- break;
109
-
110
- case 'csv':
111
- content = this.convertEventsToCSV(eventsToExport);
112
- mimeType = 'text/csv';
113
- fileExtension = '.csv';
114
- break;
115
-
116
- case 'txt':
117
- content = this.convertEventsToText(eventsToExport);
118
- mimeType = 'text/plain';
119
- fileExtension = '.txt';
120
- break;
121
-
122
- default:
123
- console.error('Unsupported export format:', format);
124
- return;
125
- }
126
-
127
- this.downloadFile(content, exportFilename + fileExtension, mimeType);
128
- }
129
-
130
- /**
131
- * Convert events to CSV format
132
- * @param {Array} events - Events to convert
133
- * @returns {string} - CSV content
134
- */
135
- convertEventsToCSV(events) {
136
- if (events.length === 0) return '';
137
-
138
- // Define CSV headers
139
- const headers = ['timestamp', 'type', 'subtype', 'tool_name', 'agent_type', 'session_id', 'data'];
140
-
141
- // Convert events to CSV rows
142
- const rows = events.map(event => {
143
- return [
144
- event.timestamp || '',
145
- event.type || '',
146
- event.subtype || '',
147
- event.tool_name || '',
148
- event.agent_type || '',
149
- event.session_id || '',
150
- JSON.stringify(event.data || {}).replace(/"/g, '""') // Escape quotes for CSV
151
- ];
152
- });
153
-
154
- // Combine headers and rows
155
- const csvContent = [headers, ...rows]
156
- .map(row => row.map(field => `"${field}"`).join(','))
157
- .join('\n');
158
-
159
- return csvContent;
160
- }
161
-
162
- /**
163
- * Convert events to readable text format
164
- * @param {Array} events - Events to convert
165
- * @returns {string} - Text content
166
- */
167
- convertEventsToText(events) {
168
- if (events.length === 0) return 'No events to export.';
169
-
170
- return events.map((event, index) => {
171
- const timestamp = this.formatTimestamp(event.timestamp);
172
- const type = event.type || 'Unknown';
173
- const subtype = event.subtype ? ` (${event.subtype})` : '';
174
- const toolName = event.tool_name ? ` - Tool: ${event.tool_name}` : '';
175
- const agentType = event.agent_type ? ` - Agent: ${event.agent_type}` : '';
176
-
177
- let content = `Event ${index + 1}: ${type}${subtype}${toolName}${agentType}\n`;
178
- content += ` Time: ${timestamp}\n`;
179
- content += ` Session: ${event.session_id || 'Unknown'}\n`;
180
-
181
- if (event.data && Object.keys(event.data).length > 0) {
182
- content += ` Data: ${JSON.stringify(event.data, null, 2)}\n`;
183
- }
184
-
185
- return content;
186
- }).join('\n' + '='.repeat(80) + '\n');
187
- }
188
-
189
- /**
190
- * Download file with given content
191
- * @param {string} content - File content
192
- * @param {string} filename - Filename
193
- * @param {string} mimeType - MIME type
194
- */
195
- downloadFile(content, filename, mimeType) {
196
- try {
197
- const blob = new Blob([content], { type: mimeType });
198
- const url = window.URL.createObjectURL(blob);
199
-
200
- const link = document.createElement('a');
201
- link.href = url;
202
- link.download = filename;
203
- link.style.display = 'none';
204
-
205
- document.body.appendChild(link);
206
- link.click();
207
- document.body.removeChild(link);
208
-
209
- // Clean up the URL object
210
- window.URL.revokeObjectURL(url);
211
-
212
- console.log(`File exported: ${filename}`);
213
- } catch (error) {
214
- console.error('Failed to export file:', error);
215
- }
216
- }
217
-
218
- // =================
219
- // UTILITY FUNCTIONS
220
- // =================
221
-
222
- /**
223
- * Format timestamp for display
224
- * @param {string|number|Date} timestamp - Timestamp to format
225
- * @returns {string} - Formatted timestamp
226
- */
227
- formatTimestamp(timestamp) {
228
- if (!timestamp) return 'Unknown time';
229
-
230
- try {
231
- const date = new Date(timestamp);
232
- if (isNaN(date.getTime())) {
233
- return 'Invalid time';
234
- }
235
-
236
- return date.toLocaleTimeString('en-US', {
237
- hour12: false,
238
- hour: '2-digit',
239
- minute: '2-digit',
240
- second: '2-digit'
241
- });
242
- } catch (error) {
243
- console.error('Error formatting timestamp:', error);
244
- return 'Error formatting time';
245
- }
246
- }
247
-
248
- /**
249
- * Format full timestamp with date for exports
250
- * @param {string|number|Date} timestamp - Timestamp to format
251
- * @returns {string} - Formatted full timestamp
252
- */
253
- formatFullTimestamp(timestamp) {
254
- if (!timestamp) return 'Unknown time';
255
-
256
- try {
257
- const date = new Date(timestamp);
258
- if (isNaN(date.getTime())) {
259
- return 'Invalid time';
260
- }
261
-
262
- return date.toLocaleString('en-US', {
263
- year: 'numeric',
264
- month: '2-digit',
265
- day: '2-digit',
266
- hour: '2-digit',
267
- minute: '2-digit',
268
- second: '2-digit',
269
- hour12: false
270
- });
271
- } catch (error) {
272
- console.error('Error formatting full timestamp:', error);
273
- return 'Error formatting time';
274
- }
275
- }
276
-
277
- /**
278
- * Scroll a list element to bottom
279
- * @param {string} listId - ID of list element to scroll
280
- */
281
- scrollListToBottom(listId) {
282
- console.log(`[DEBUG] scrollListToBottom called with listId: ${listId}`);
283
-
284
- // Use setTimeout to ensure DOM updates are completed
285
- setTimeout(() => {
286
- const listElement = document.getElementById(listId);
287
- console.log(`[DEBUG] Element found for ${listId}:`, listElement);
288
-
289
- if (listElement) {
290
- console.log(`[DEBUG] Scrolling ${listId} - scrollHeight: ${listElement.scrollHeight}, scrollTop before: ${listElement.scrollTop}`);
291
- listElement.scrollTop = listElement.scrollHeight;
292
- console.log(`[DEBUG] Scrolled ${listId} - scrollTop after: ${listElement.scrollTop}`);
293
- } else {
294
- console.warn(`[DEBUG] Element with ID '${listId}' not found for scrolling`);
295
- }
296
- }, 50); // Small delay to ensure content is rendered
297
- }
298
-
299
- /**
300
- * Debounce function to limit function calls
301
- * @param {Function} func - Function to debounce
302
- * @param {number} wait - Wait time in milliseconds
303
- * @returns {Function} - Debounced function
304
- */
305
- debounce(func, wait) {
306
- let timeout;
307
- return function executedFunction(...args) {
308
- const later = () => {
309
- clearTimeout(timeout);
310
- func(...args);
311
- };
312
- clearTimeout(timeout);
313
- timeout = setTimeout(later, wait);
314
- };
315
- }
316
-
317
- /**
318
- * Throttle function to limit function calls
319
- * @param {Function} func - Function to throttle
320
- * @param {number} limit - Limit in milliseconds
321
- * @returns {Function} - Throttled function
322
- */
323
- throttle(func, limit) {
324
- let inThrottle;
325
- return function (...args) {
326
- if (!inThrottle) {
327
- func.apply(this, args);
328
- inThrottle = true;
329
- setTimeout(() => inThrottle = false, limit);
330
- }
331
- };
332
- }
333
-
334
- /**
335
- * Generate unique ID
336
- * @returns {string} - Unique ID
337
- */
338
- generateId() {
339
- return Date.now().toString(36) + Math.random().toString(36).substr(2);
340
- }
341
-
342
- /**
343
- * Deep clone an object
344
- * @param {*} obj - Object to clone
345
- * @returns {*} - Cloned object
346
- */
347
- deepClone(obj) {
348
- if (obj === null || typeof obj !== 'object') return obj;
349
- if (obj instanceof Date) return new Date(obj.getTime());
350
- if (obj instanceof Array) return obj.map(item => this.deepClone(item));
351
- if (typeof obj === 'object') {
352
- const cloned = {};
353
- for (const key in obj) {
354
- if (obj.hasOwnProperty(key)) {
355
- cloned[key] = this.deepClone(obj[key]);
356
- }
357
- }
358
- return cloned;
359
- }
360
- return obj;
361
- }
362
- }
363
- // ES6 Module export
364
- export { ExportManager };
365
- export default ExportManager;
366
-
367
- // Make ExportManager globally available for dist/dashboard.js
368
- window.ExportManager = ExportManager;