claude-mpm 4.2.2__py3-none-any.whl → 4.2.4__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.
@@ -45,6 +45,22 @@ class SocketIOClientProxy:
45
45
  self._client_thread = None
46
46
  self._client_loop = None
47
47
 
48
+ def start(self):
49
+ """Start the Socket.IO client connection (compatibility wrapper).
50
+
51
+ This method exists for backward compatibility with code that expects
52
+ a start() method. It simply calls start_sync().
53
+ """
54
+ return self.start_sync()
55
+
56
+ def stop(self):
57
+ """Stop the Socket.IO client connection (compatibility wrapper).
58
+
59
+ This method exists for backward compatibility with code that expects
60
+ a stop() method. It simply calls stop_sync().
61
+ """
62
+ return self.stop_sync()
63
+
48
64
  def start_sync(self):
49
65
  """Start the Socket.IO client connection to the persistent server."""
50
66
  self.logger.debug(
@@ -591,8 +591,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
591
591
  return
592
592
 
593
593
  try:
594
+ self.logger.info(f"Starting file analysis for: {path}")
595
+
594
596
  # Ensure analyzer exists
595
597
  if not self.code_analyzer:
598
+ self.logger.info("Creating new CodeTreeAnalyzer instance")
596
599
  emitter = CodeTreeEventEmitter(use_stdout=False)
597
600
  # Override emit method to send to Socket.IO
598
601
  original_emit = emitter.emit
@@ -630,23 +633,42 @@ class CodeAnalysisEventHandler(BaseEventHandler):
630
633
  self.code_analyzer = CodeTreeAnalyzer(
631
634
  emit_events=False, emitter=emitter
632
635
  )
636
+ self.logger.info("CodeTreeAnalyzer created successfully")
633
637
 
634
638
  # Analyze file
639
+ self.logger.info(f"Calling analyze_file for: {path}")
635
640
  result = self.code_analyzer.analyze_file(path)
641
+ self.logger.info(
642
+ f"Analysis complete. Result keys: {list(result.keys()) if result else 'None'}"
643
+ )
644
+
645
+ if result:
646
+ self.logger.info(
647
+ f"Analysis result: elements={len(result.get('elements', []))}, nodes={len(result.get('nodes', []))}"
648
+ )
649
+ else:
650
+ self.logger.warning("Analysis returned None or empty result")
636
651
 
637
652
  # Send result with correct event name (using colons, not dots!)
653
+ response_data = {
654
+ "request_id": request_id,
655
+ "path": path,
656
+ **result,
657
+ }
658
+
659
+ self.logger.info(f"Emitting code:file:analyzed event to {sid}")
638
660
  await self.server.core.sio.emit(
639
661
  "code:file:analyzed",
640
- {
641
- "request_id": request_id,
642
- "path": path,
643
- **result,
644
- },
662
+ response_data,
645
663
  room=sid,
646
664
  )
665
+ self.logger.info("Event emitted successfully")
647
666
 
648
667
  except Exception as e:
649
668
  self.logger.error(f"Error analyzing file {path}: {e}")
669
+ import traceback
670
+
671
+ self.logger.error(f"Full traceback: {traceback.format_exc()}")
650
672
  await self.server.core.sio.emit(
651
673
  "code:analysis:error",
652
674
  {
@@ -2,7 +2,7 @@
2
2
  Lightweight MonitorServer for claude-mpm.
3
3
 
4
4
  WHY: This module provides a minimal, independent monitoring service that:
5
- - Runs as a stable background service on port 8766
5
+ - Runs as a stable background service on port 8765
6
6
  - Only handles event collection and relay (no UI components)
7
7
  - Has minimal dependencies and resource usage
8
8
  - Can run as always-on background service
@@ -60,7 +60,7 @@ class MonitorServer(SocketIOServiceInterface):
60
60
  monitor_config = config.get("monitor_server", {})
61
61
 
62
62
  self.host = host or monitor_config.get("host", "localhost")
63
- self.port = port or monitor_config.get("port", 8766)
63
+ self.port = port or monitor_config.get("port", 8765)
64
64
  self.logger = get_logger(__name__ + ".MonitorServer")
65
65
 
66
66
  # Configuration-based settings
@@ -393,6 +393,68 @@ class SocketIOServerCore:
393
393
  self.app.router.add_post("/api/events", api_events_handler)
394
394
  self.logger.info("✅ HTTP API endpoint registered at /api/events")
395
395
 
396
+ # Add file reading endpoint for source viewer
397
+ async def file_read_handler(request):
398
+ """Handle GET /api/file/read for reading source files."""
399
+ import os
400
+
401
+ file_path = request.query.get("path", "")
402
+
403
+ if not file_path:
404
+ return web.json_response({"error": "No path provided"}, status=400)
405
+
406
+ abs_path = os.path.abspath(os.path.expanduser(file_path))
407
+
408
+ # Security check - ensure file is within the project
409
+ try:
410
+ project_root = os.getcwd()
411
+ if not abs_path.startswith(project_root):
412
+ return web.json_response({"error": "Access denied"}, status=403)
413
+ except Exception:
414
+ pass
415
+
416
+ if not os.path.exists(abs_path):
417
+ return web.json_response({"error": "File not found"}, status=404)
418
+
419
+ if not os.path.isfile(abs_path):
420
+ return web.json_response({"error": "Not a file"}, status=400)
421
+
422
+ try:
423
+ # Read file with appropriate encoding
424
+ encodings = ["utf-8", "latin-1", "cp1252"]
425
+ content = None
426
+
427
+ for encoding in encodings:
428
+ try:
429
+ with open(abs_path, encoding=encoding) as f:
430
+ content = f.read()
431
+ break
432
+ except UnicodeDecodeError:
433
+ continue
434
+
435
+ if content is None:
436
+ return web.json_response(
437
+ {"error": "Could not decode file"}, status=400
438
+ )
439
+
440
+ return web.json_response(
441
+ {
442
+ "path": abs_path,
443
+ "name": os.path.basename(abs_path),
444
+ "content": content,
445
+ "lines": len(content.splitlines()),
446
+ "size": os.path.getsize(abs_path),
447
+ }
448
+ )
449
+
450
+ except PermissionError:
451
+ return web.json_response({"error": "Permission denied"}, status=403)
452
+ except Exception as e:
453
+ return web.json_response({"error": str(e)}, status=500)
454
+
455
+ self.app.router.add_get("/api/file/read", file_read_handler)
456
+ self.logger.info("✅ File reading API registered at /api/file/read")
457
+
396
458
  def _setup_directory_api(self):
397
459
  """Setup simple directory listing API.
398
460
 
@@ -500,6 +500,36 @@ class PythonAnalyzer:
500
500
  )
501
501
  )
502
502
 
503
+ def visit_Assign(self, node):
504
+ # Handle module-level variable assignments
505
+ if self.current_class is None: # Only module-level assignments
506
+ for target in node.targets:
507
+ if isinstance(target, ast.Name):
508
+ var_node = CodeNode(
509
+ file_path=str(file_path),
510
+ node_type="variable",
511
+ name=target.id,
512
+ line_start=node.lineno,
513
+ line_end=node.end_lineno or node.lineno,
514
+ parent=self.parent_name,
515
+ complexity=0,
516
+ signature=f"{target.id} = ...",
517
+ )
518
+ nodes.append(var_node)
519
+
520
+ # Emit event if emitter is available
521
+ if self.emitter:
522
+ self.emitter.emit_node(
523
+ CodeNodeEvent(
524
+ file_path=str(file_path),
525
+ node_type="variable",
526
+ name=target.id,
527
+ line_start=node.lineno,
528
+ line_end=node.end_lineno or node.lineno,
529
+ parent=self.parent_name,
530
+ )
531
+ )
532
+
503
533
  def visit_AsyncFunctionDef(self, node):
504
534
  self.visit_FunctionDef(node)
505
535
 
@@ -578,6 +608,24 @@ class PythonAnalyzer:
578
608
 
579
609
  return nodes
580
610
 
611
+ def _get_assignment_signature(self, node: ast.Assign, var_name: str) -> str:
612
+ """Get assignment signature string."""
613
+ try:
614
+ # Try to get a simple representation of the value
615
+ if isinstance(node.value, ast.Constant):
616
+ if isinstance(node.value.value, str):
617
+ return f'{var_name} = "{node.value.value}"'
618
+ return f"{var_name} = {node.value.value}"
619
+ if isinstance(node.value, ast.Name):
620
+ return f"{var_name} = {node.value.id}"
621
+ if isinstance(node.value, ast.List):
622
+ return f"{var_name} = [...]"
623
+ if isinstance(node.value, ast.Dict):
624
+ return f"{var_name} = {{...}}"
625
+ return f"{var_name} = ..."
626
+ except:
627
+ return f"{var_name} = ..."
628
+
581
629
 
582
630
  class MultiLanguageAnalyzer:
583
631
  """Analyzes multiple programming languages using tree-sitter.
@@ -1625,26 +1673,56 @@ class CodeTreeAnalyzer:
1625
1673
 
1626
1674
  self.emitter.emit_file_analyzed(file_path, filtered_nodes, duration)
1627
1675
 
1676
+ # Prepare the nodes data
1677
+ final_nodes = (
1678
+ filtered_nodes
1679
+ if "filtered_nodes" in locals()
1680
+ else [
1681
+ {
1682
+ "name": n.name,
1683
+ "type": n.node_type,
1684
+ "line_start": n.line_start,
1685
+ "line_end": n.line_end,
1686
+ "complexity": n.complexity,
1687
+ "has_docstring": n.has_docstring,
1688
+ "signature": n.signature,
1689
+ }
1690
+ for n in nodes
1691
+ if not self._is_internal_node(n)
1692
+ ]
1693
+ )
1694
+
1695
+ # Convert nodes to elements format for dashboard compatibility
1696
+ elements = []
1697
+ for node in final_nodes:
1698
+ element = {
1699
+ "name": node["name"],
1700
+ "type": node["type"],
1701
+ "line": node["line_start"], # Dashboard expects 'line' not 'line_start'
1702
+ "complexity": node["complexity"],
1703
+ "signature": node.get("signature", ""),
1704
+ "has_docstring": node.get("has_docstring", False),
1705
+ }
1706
+ # Add methods if it's a class (for expandable tree)
1707
+ if node["type"] == "class":
1708
+ element["methods"] = [] # Could be populated with class methods
1709
+ elements.append(element)
1710
+
1628
1711
  return {
1629
1712
  "path": file_path,
1630
1713
  "language": language,
1631
- "nodes": (
1632
- filtered_nodes
1633
- if "filtered_nodes" in locals()
1634
- else [
1635
- {
1636
- "name": n.name,
1637
- "type": n.node_type,
1638
- "line_start": n.line_start,
1639
- "line_end": n.line_end,
1640
- "complexity": n.complexity,
1641
- "has_docstring": n.has_docstring,
1642
- "signature": n.signature,
1643
- }
1644
- for n in nodes
1645
- if not self._is_internal_node(n)
1646
- ]
1647
- ),
1714
+ "nodes": final_nodes, # Keep for backward compatibility
1715
+ "elements": elements, # Add for dashboard compatibility
1716
+ "complexity": sum(e["complexity"] for e in elements),
1717
+ "lines": len(elements), # Simple line count approximation
1718
+ "stats": {
1719
+ "classes": len([e for e in elements if e["type"] == "class"]),
1720
+ "functions": len([e for e in elements if e["type"] == "function"]),
1721
+ "methods": len([e for e in elements if e["type"] == "method"]),
1722
+ "variables": len([e for e in elements if e["type"] == "variable"]),
1723
+ "imports": len([e for e in elements if e["type"] == "import"]),
1724
+ "total": len(elements),
1725
+ },
1648
1726
  }
1649
1727
 
1650
1728
  def _is_internal_node(self, node: CodeNode) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.2.2
3
+ Version: 4.2.4
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=toytnNjkIKPgQaGwDqQdC1rpNTAdSEc6Vja50d7Ovug,4
2
- claude_mpm/VERSION,sha256=FGfUZXhb_3QDXm98xlJJWnpfDE4YLg0WwNtRS-6pZ94,6
2
+ claude_mpm/VERSION,sha256=dPUXoIIYBmj14F2_TcFo1SPovVV5VXVNLYgBHQoDYt8,6
3
3
  claude_mpm/__init__.py,sha256=lyTZAYGH4DTaFGLRNWJKk5Q5oTjzN5I6AXmfVX-Jff0,1512
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=I946iCQzIIPRZVVJ8aO7lA4euiyDnNw2IX7EelAOkIE,5915
@@ -83,7 +83,7 @@ claude_mpm/cli/commands/mcp_pipx_config.py,sha256=sE62VD6Q1CcO2k1nlbIhHMfAJFQTZf
83
83
  claude_mpm/cli/commands/mcp_server_commands.py,sha256=-1G_2Y5ScTvzDd-kY8fTAao2H6FH7DnsLimleF1rVqQ,6197
84
84
  claude_mpm/cli/commands/mcp_tool_commands.py,sha256=q17GzlFT3JiLTrDqwPO2tz1-fKmPO5QU449syTnKTz4,1283
85
85
  claude_mpm/cli/commands/memory.py,sha256=Yzfs3_oiKciv3sfOoDm2lJL4M9idG7ARV3-sNw1ge_g,26186
86
- claude_mpm/cli/commands/monitor.py,sha256=xSzHWg5NHiPoNcT7IAI_fBGOoB4wlTSyJb5ixEKh82Q,12059
86
+ claude_mpm/cli/commands/monitor.py,sha256=knr5uCaKwpqwsTmsW24rZobWJaVU40HJHSAfsmDXP2o,12059
87
87
  claude_mpm/cli/commands/mpm_init.py,sha256=lO7N91ZHn_n18XbchUUcYoyme7L5NLcXVnhWm5F_Gq8,22367
88
88
  claude_mpm/cli/commands/mpm_init_handler.py,sha256=-pCB0XL3KipqGtnta8CC7Lg5TPMwstEhMFBcgF4aaa4,2919
89
89
  claude_mpm/cli/commands/run.py,sha256=HrqRWCxmtCKcOxygXRM4KYlN1FDxBXrt4lxz0WunPTs,43390
@@ -135,7 +135,7 @@ claude_mpm/core/agent_session_manager.py,sha256=JmhP67tZuJhGaXOriWeYdl69edxB8szV
135
135
  claude_mpm/core/base_service.py,sha256=OGFg2IrvkSVhDUoN12y9HD6L6YGka0pc6Wj3AmHKxYk,29182
136
136
  claude_mpm/core/cache.py,sha256=aCvZg08gT8uMFSDp-s0-xqRYSgcfBTDGM3MlJTTboMY,17170
137
137
  claude_mpm/core/claude_runner.py,sha256=e6ob7FwcBzvhw9gnPvmL8Zw_BasdfzuV8b1dvqtvGKk,34787
138
- claude_mpm/core/config.py,sha256=TPTAwUu1uSCBRERRgN3xSRYYe6B6Igb60VLHaP71YAM,39358
138
+ claude_mpm/core/config.py,sha256=3TrDkcraWdij6LZ3Vermg3CadLy8XqxkAJ3k5qYAniw,39356
139
139
  claude_mpm/core/config_aliases.py,sha256=asgAgMGlZSv-5PXPBH8e__QfwJQy_Or9ldPD9yzCrM0,9643
140
140
  claude_mpm/core/config_constants.py,sha256=MEF35Y2Lj5FMzRdhgSgZrZeTzHfCzistPGZVY8INta4,10073
141
141
  claude_mpm/core/constants.py,sha256=88J9bGT05Fbr3lzHLWtLQbBYRuJuLBjK3Bfq_qyWcIo,9539
@@ -202,9 +202,9 @@ claude_mpm/dashboard/static/built/components/ui-state-manager.js,sha256=PtZs6sxN
202
202
  claude_mpm/dashboard/static/built/components/unified-data-viewer.js,sha256=awSWdzpGgg4ovVVR4E5TfIr-K2UhLCSuxeFIXWSUo3A,34675
203
203
  claude_mpm/dashboard/static/built/components/working-directory.js,sha256=xE1ydpKDzRWrzHzfjrCiq5wbf3vDhmgQTGKS7myQcPM,15790
204
204
  claude_mpm/dashboard/static/css/activity.css,sha256=0SJUwGB6fr4OlVqMwhvVKrPndg2R3QTZPnN6DkAo4aU,37987
205
- claude_mpm/dashboard/static/css/code-tree.css,sha256=x0MlVKrBBYr7XU8ndhxx7cjCe35GouhthIM32Zc9SA8,25599
205
+ claude_mpm/dashboard/static/css/code-tree.css,sha256=Za8G7hOL1mEO2Ktlu8MAeNRjum9zdoYWmchyrzy6ZLU,30391
206
206
  claude_mpm/dashboard/static/css/connection-status.css,sha256=nQiMLxIFjY5MDgrVCG58VR5H1PpE1vLlgXmnn01-P64,6729
207
- claude_mpm/dashboard/static/css/dashboard.css,sha256=7xTARHVi8U_HnqM-3Cfc-81gu_r7r2eLLW673dybSG8,80281
207
+ claude_mpm/dashboard/static/css/dashboard.css,sha256=_wobeVpKGa_pDgjup0q9MyXR-FEMPPHfJLbGhM4W9Sw,85514
208
208
  claude_mpm/dashboard/static/dist/dashboard.js,sha256=Fm2v_pxM_jISp--n9XasrcL2nHYlfC1wcVZW4zGekw4,44966
209
209
  claude_mpm/dashboard/static/dist/socket-client.js,sha256=z9HU1HePow8Yvh-7QMcjChwMYsR_p-ZvJVu8HU6d5Xg,29110
210
210
  claude_mpm/dashboard/static/dist/components/activity-tree.js,sha256=c7vYmCvMgq7irVrX-EFbNqVMgVuDJ_cwcvsZ4LSO3bU,29594
@@ -227,13 +227,13 @@ claude_mpm/dashboard/static/dist/components/working-directory.js,sha256=xE1ydpKD
227
227
  claude_mpm/dashboard/static/js/connection-manager.js,sha256=nn7x1jmwEnBClcChbFk1uMhRPu5U1xmXz3sjuo0LNm4,17981
228
228
  claude_mpm/dashboard/static/js/dashboard.js,sha256=RYzzhNr1pPAHZ12pgWjTpe15Nzaqrm-S9vzTRfqob5A,64712
229
229
  claude_mpm/dashboard/static/js/extension-error-handler.js,sha256=DZHrJ3gbfv4nsjmZpNMj-Sc3GKjVJ5ds8lgoaLRnq5I,6274
230
- claude_mpm/dashboard/static/js/socket-client.js,sha256=wC4vH0oP6xIDcSA-Q8cNI2bPW3hg3SAS9TZ75cD6y9Y,56052
230
+ claude_mpm/dashboard/static/js/socket-client.js,sha256=E6CmETHYwS4kPnk9gTnfoWO4FObWYvz0muosFS-zffs,56239
231
231
  claude_mpm/dashboard/static/js/components/activity-tree.js,sha256=1j46X0qjYReP6gwv0WGRpJSJNuBwuj6bKmumWrCZKUo,72740
232
232
  claude_mpm/dashboard/static/js/components/agent-hierarchy.js,sha256=Xihxog_vJrk8VBEkDogV_wbye2GIFWmH71VQ1lETOHk,28243
233
233
  claude_mpm/dashboard/static/js/components/agent-inference.js,sha256=RUVZ_fLOyDkHYjrROen_Pzzay79Bh29eXp_GRIPbIRg,37493
234
234
  claude_mpm/dashboard/static/js/components/build-tracker.js,sha256=iouv35tNhnyx9UKtD7X1eakJkpCnvZVCrAJ_VdzsKUY,11251
235
235
  claude_mpm/dashboard/static/js/components/code-simple.js,sha256=3A3VIvHMpYRjuDKGMaQYoVjf-zuUa4Q6pdBHWDJ0ygM,32050
236
- claude_mpm/dashboard/static/js/components/code-tree.js,sha256=Nb8ON1dC8vkvJY-Qbog7EJSKnJXeMjJGQkW5PAofOTc,131452
236
+ claude_mpm/dashboard/static/js/components/code-tree.js,sha256=cnnnH_IdRy6Q-DaRPtPZfe5f5XMgyv2hVzLrMp3nwII,196135
237
237
  claude_mpm/dashboard/static/js/components/code-viewer.js,sha256=vhesEPYOM6MggweaYvYsv7ufVbuVpIcyJPXpJXyJwpM,14453
238
238
  claude_mpm/dashboard/static/js/components/connection-debug.js,sha256=Qxr_ofDNkxDlZAwbLnhZkXVMyuO9jOe-NMWC9VHxNnA,22196
239
239
  claude_mpm/dashboard/static/js/components/event-processor.js,sha256=pP15JIf2yEh7gqEdam42m_B1B4hDlfKbkDcGmQhyjM8,20567
@@ -250,7 +250,7 @@ claude_mpm/dashboard/static/js/components/ui-state-manager.js,sha256=EWm0HpPI9TS
250
250
  claude_mpm/dashboard/static/js/components/unified-data-viewer.js,sha256=iKI_AaVX36o2JssBs0C1KR8AFb4qse47-JwfBsd9tBo,58625
251
251
  claude_mpm/dashboard/static/js/components/working-directory.js,sha256=BRsPYwVnhbhFl0mC0Gvb-Ev1zxAu6yZpZcl1T1aJWWA,33558
252
252
  claude_mpm/dashboard/templates/code_simple.html,sha256=xrmTLFow0M5NWFlk4ci1eLWML-IHr35i5pqIVaEg2TU,4329
253
- claude_mpm/dashboard/templates/index.html,sha256=7U4CRO6oHeW2Q3PMpGDs0RYfpFe7_Px6v5bnOUk8EEI,30895
253
+ claude_mpm/dashboard/templates/index.html,sha256=8tmzUqDRHbdI2Ts8TsVxlk1c6DX4vgDuU6T5HzBm7gY,30562
254
254
  claude_mpm/experimental/__init__.py,sha256=R_aclOvWpvSTHWAx9QXyg9OIPVK2dXT5tQJhxLQN11Y,369
255
255
  claude_mpm/experimental/cli_enhancements.py,sha256=rlYOMVlj8vQzuyCkHWQ7TtjcsDeFq3y1Ng5qty2fyY8,11486
256
256
  claude_mpm/generators/__init__.py,sha256=rG8vwF_BjPmeMKvyMXpUA8uJ-7mtW2HTNfalZzgRlNk,153
@@ -334,7 +334,7 @@ claude_mpm/services/agents/deployment/agent_operation_service.py,sha256=wPoGYf3F
334
334
  claude_mpm/services/agents/deployment/agent_record_service.py,sha256=0v-tWJV-AczLXPet1oqlY_fepIj4qa3l_aZMjpDXSN8,14040
335
335
  claude_mpm/services/agents/deployment/agent_restore_handler.py,sha256=YDPVY4m_4l5wSFq9fxsTqm0ixX8AeTyzERh-PtabuUY,3101
336
336
  claude_mpm/services/agents/deployment/agent_state_service.py,sha256=yjuVG-rwyXBS0T8yKfrx1QTOSmfB_Ejvm-0QLjBNDDI,11772
337
- claude_mpm/services/agents/deployment/agent_template_builder.py,sha256=We29E2X0Pm8KoQi9tDf-2oMkg6P8drHpnfMeEXihU6s,34379
337
+ claude_mpm/services/agents/deployment/agent_template_builder.py,sha256=BdH_dEe7qa0VgbwxFPy_3CtHPI-LDy-f-dqTzyDRO_A,34847
338
338
  claude_mpm/services/agents/deployment/agent_validator.py,sha256=Yyf5zG8pFYIvmRzghPZSr8Ka2p_uVe9MVN8bmtucNSc,12737
339
339
  claude_mpm/services/agents/deployment/agent_version_manager.py,sha256=Q2COYmnWDvDxsBh_ikN9Govk3o8Dy1T0X-rioMpUsis,11189
340
340
  claude_mpm/services/agents/deployment/agent_versioning.py,sha256=cDkSv12m6_XjhhD6Tr_tmcnvx4RrXhMAKpjm6E_fKyQ,989
@@ -433,6 +433,7 @@ claude_mpm/services/core/interfaces/agent.py,sha256=EaPYn6k9HjB2DRTiZIMJwEIBABZF
433
433
  claude_mpm/services/core/interfaces/communication.py,sha256=evwtLbYCFa3Zb8kEfL10LOBVdwP4-n3a3wa7NqIHmKQ,8887
434
434
  claude_mpm/services/core/interfaces/infrastructure.py,sha256=eLtr_dFhA3Ux3mPOV_4DbWhGjHpfpGnj6xOhfQcgZGk,10037
435
435
  claude_mpm/services/core/interfaces/service.py,sha256=hNfHXe45LcPCp_dToOmZCfnUZBF5axMf_TdxqCSm2-I,11536
436
+ claude_mpm/services/dashboard/stable_server.py,sha256=vUiWXutYX5kMkSB3_FBuCp9qnlSAT0bnXjNlI9ybe3Q,17752
436
437
  claude_mpm/services/diagnostics/__init__.py,sha256=WTRucANR9EwNi53rotjkeE4k75s18RjHJ8s1BfBj7ic,614
437
438
  claude_mpm/services/diagnostics/diagnostic_runner.py,sha256=cpCZ7JBvRIpGEchiwYsojmiGaI99Wf-hGxk8eem7xXQ,9164
438
439
  claude_mpm/services/diagnostics/doctor_reporter.py,sha256=Z8hYLqUbGC02gL7nX9kZKbLWRzOmTORRINfCr7EHbBI,10537
@@ -549,15 +550,15 @@ claude_mpm/services/shared/lifecycle_service_base.py,sha256=WiAUJ5_k-2dYkDRMbJl7
549
550
  claude_mpm/services/shared/manager_base.py,sha256=kmjhpVqgfYC1N4YQnPAilCfdrSpAh9Qz7wcQ602L4x4,9296
550
551
  claude_mpm/services/shared/service_factory.py,sha256=blNkIowhIxykrn-a1qsD8Rtkjlky615nAT2nc8m18QI,9718
551
552
  claude_mpm/services/socketio/__init__.py,sha256=PS-2twllga-2mhSfKdu4MgpikfKp_730gMLAqU_9YX4,556
552
- claude_mpm/services/socketio/client_proxy.py,sha256=VPhU6u9FtFZNujR2K4bcDwr4iUrANSIRukqMb2U_XP0,6637
553
+ claude_mpm/services/socketio/client_proxy.py,sha256=7e2oiRCBYhSyq3_iA7R48CbzHQS_dXC9eYHnYAN-r_Q,7182
553
554
  claude_mpm/services/socketio/dashboard_server.py,sha256=QMQyRvKxfy692A1oStxmY05BeUpVzQZzKHiplw9YgrU,13655
554
555
  claude_mpm/services/socketio/event_normalizer.py,sha256=TlhZbLgb6fSFNXNAZEEbGxHOqgTIB2S9WtEGJEV7Olw,28402
555
556
  claude_mpm/services/socketio/migration_utils.py,sha256=1pK_zGZ8Pd57pCg1O-3gKT8i7_fjEKZ377hxOMGUPQQ,11963
556
557
  claude_mpm/services/socketio/monitor_client.py,sha256=2k9cP4e3GrdNFbiMGtcKJm0aoLxd5SgS60DObMjAtlY,12714
557
- claude_mpm/services/socketio/monitor_server.py,sha256=QgGdFbzSx1jBTwIplNwJbAectk51vJ_Ok_kehomr2WI,17746
558
+ claude_mpm/services/socketio/monitor_server.py,sha256=dBUWTFF0C94HrFP5fZonw_yh42NPaKz6D9_lV9DcZzE,17746
558
559
  claude_mpm/services/socketio/handlers/__init__.py,sha256=lGYFfn5P1eB6ri3HAPuDJMfdCfHIw6mQEbweAihNuHY,873
559
560
  claude_mpm/services/socketio/handlers/base.py,sha256=DjUODCOLTQSsC_-NP9yr-8g77arawmsRrM5KC06aDmw,4845
560
- claude_mpm/services/socketio/handlers/code_analysis.py,sha256=Y8KaXC1n77BTxgiY6RnCpXN7xFbG07S20GgVojl7_k4,25288
561
+ claude_mpm/services/socketio/handlers/code_analysis.py,sha256=BmcJiygXaCVjVJndE-GFi4eN7_b8v7mqScddMTj5DUk,26271
561
562
  claude_mpm/services/socketio/handlers/connection.py,sha256=sa6Rg5Y9tcf-e4PEb6f4fNhFQcpZ9WbwdiGXmkzlFTs,26781
562
563
  claude_mpm/services/socketio/handlers/connection_handler.py,sha256=DTY0pa--HQu4C6-WCgE1zskvHm3gVuEKWwaSFNBAoec,13287
563
564
  claude_mpm/services/socketio/handlers/file.py,sha256=itpPa5OAow5_OXrTOXk0vsyuEYm4iVmxwN9xowy7jiY,8341
@@ -569,7 +570,7 @@ claude_mpm/services/socketio/handlers/registry.py,sha256=0f-8zBz-iXCbdPPG8iaMpam
569
570
  claude_mpm/services/socketio/server/__init__.py,sha256=S486w-i-hBo3rNW_AtzxbasEgP32By-uI9zz7hzKz-o,640
570
571
  claude_mpm/services/socketio/server/broadcaster.py,sha256=y_D-fDhSD2NZI0cP9wuoB2nlI7VkKjzW_EjVmP-xd5Y,21375
571
572
  claude_mpm/services/socketio/server/connection_manager.py,sha256=lf1rurOvUej0FWLWXn2u1q0xz2rlzSWKb818Le-LkFM,21234
572
- claude_mpm/services/socketio/server/core.py,sha256=-e9mftha7ptOwlau55vOLf_UO_Mhdy2E_s7VmUWzrAc,28970
573
+ claude_mpm/services/socketio/server/core.py,sha256=eBM_CkXDqwwIZ8UjsMiWN2qrnIQYb4S1aGOjOSwqCIM,31356
573
574
  claude_mpm/services/socketio/server/eventbus_integration.py,sha256=6LkK8W9wTiNd8d9KoAH2IY1b4osyGGgGaJ0DmwIwnVM,7790
574
575
  claude_mpm/services/socketio/server/main.py,sha256=JvaH4vHz1AgdBsyB7qSG-BZmak9E2FA02Ij2jYKMvqs,19535
575
576
  claude_mpm/services/ticket_services/__init__.py,sha256=I01W25n-tBWwZ0TD-dPA63nqzCU2KnpOvbqeysmaa2E,798
@@ -590,7 +591,7 @@ claude_mpm/storage/__init__.py,sha256=DXnmee6iGqC6ctFLW7_Ty1cVCjYDFuCMkwO4EV0i25
590
591
  claude_mpm/storage/state_storage.py,sha256=1fFqkFy63T32JQvhUdVBNhaLQyUlkq4unjeyl0Z6j8I,16865
591
592
  claude_mpm/tools/__init__.py,sha256=T3GuCYNAHtjVcKCeivY674PaDm48WX96AriQfTKUknY,347
592
593
  claude_mpm/tools/__main__.py,sha256=MKDuxFuujqD5FZcLTqniDNQ2BI8yg5fDSLU3ElV6m6U,5709
593
- claude_mpm/tools/code_tree_analyzer.py,sha256=SPghaC7fsmwSlzDi0B8KHkD_PV2b30iWLrjy-_TbmH4,60077
594
+ claude_mpm/tools/code_tree_analyzer.py,sha256=iht5BATmZeUXkykfSI1YSvnr2fzFPZP17LC-A10DXn0,63910
594
595
  claude_mpm/tools/code_tree_builder.py,sha256=gwnsFO5ajs55UzX3SU34OMZBwhjouruQhGdQ3fJHjeA,18126
595
596
  claude_mpm/tools/code_tree_events.py,sha256=ypUmxQRUpxQt2LQfXV_qpdL42KNvLO-K5XstxZIj9-w,13277
596
597
  claude_mpm/tools/socketio_debug.py,sha256=H0mKHO6EIYqCVm4YU-SJ4Cw8ssA7VqJ3vU7y6eF7brk,22212
@@ -614,9 +615,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=zgiwLqh_17WxHpySvUPH65pb4bzIeUGOAYUJ
614
615
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
615
616
  claude_mpm/validation/agent_validator.py,sha256=3Lo6LK-Mw9IdnL_bd3zl_R6FkgSVDYKUUM7EeVVD3jc,20865
616
617
  claude_mpm/validation/frontmatter_validator.py,sha256=u8g4Eyd_9O6ugj7Un47oSGh3kqv4wMkuks2i_CtWRvM,7028
617
- claude_mpm-4.2.2.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
618
- claude_mpm-4.2.2.dist-info/METADATA,sha256=id9bUwa39mo6atRmjVqC2EfwJaRSiyO15XuHmlzvh_k,13776
619
- claude_mpm-4.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
620
- claude_mpm-4.2.2.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
621
- claude_mpm-4.2.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
622
- claude_mpm-4.2.2.dist-info/RECORD,,
618
+ claude_mpm-4.2.4.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
619
+ claude_mpm-4.2.4.dist-info/METADATA,sha256=FOy6xE2x-Udc0_-Vmnnc19YAZp9Vsyj26wyf3iuSrUQ,13776
620
+ claude_mpm-4.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
621
+ claude_mpm-4.2.4.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
622
+ claude_mpm-4.2.4.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
623
+ claude_mpm-4.2.4.dist-info/RECORD,,