claude-mpm 5.6.3__py3-none-any.whl → 5.6.5__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +29 -30
- claude_mpm/hooks/claude_hooks/event_handlers.py +58 -105
- claude_mpm/hooks/claude_hooks/memory_integration.py +30 -21
- claude_mpm/hooks/claude_hooks/response_tracking.py +39 -58
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +23 -28
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +22 -26
- claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +47 -73
- claude_mpm/hooks/session_resume_hook.py +22 -18
- claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/METADATA +1 -1
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/RECORD +44 -18
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/WHEEL +0 -0
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.6.3.dist-info → claude_mpm-5.6.5.dist-info}/top_level.txt +0 -0
|
@@ -8,13 +8,22 @@ This service manages:
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import os
|
|
11
|
-
import subprocess
|
|
11
|
+
import subprocess # nosec B404
|
|
12
12
|
import time
|
|
13
13
|
from collections import deque
|
|
14
14
|
from datetime import datetime, timezone
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
from typing import Optional
|
|
17
17
|
|
|
18
|
+
# Try to import _log from hook_handler, fall back to no-op
|
|
19
|
+
try:
|
|
20
|
+
from claude_mpm.hooks.claude_hooks.hook_handler import _log
|
|
21
|
+
except ImportError:
|
|
22
|
+
|
|
23
|
+
def _log(msg: str) -> None:
|
|
24
|
+
pass # Silent fallback
|
|
25
|
+
|
|
26
|
+
|
|
18
27
|
# Import constants for configuration
|
|
19
28
|
try:
|
|
20
29
|
from claude_mpm.core.constants import TimeoutConfig
|
|
@@ -63,17 +72,11 @@ class StateManagerService:
|
|
|
63
72
|
):
|
|
64
73
|
"""Track a new agent delegation with optional request data for response correlation."""
|
|
65
74
|
if DEBUG:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
)
|
|
72
|
-
print(f" - agent_type: {agent_type}", file=sys.stderr)
|
|
73
|
-
print(f" - request_data provided: {bool(request_data)}", file=sys.stderr)
|
|
74
|
-
print(
|
|
75
|
-
f" - delegation_requests size before: {len(self.delegation_requests)}",
|
|
76
|
-
file=sys.stderr,
|
|
75
|
+
_log(f" - session_id: {session_id[:16] if session_id else 'None'}...")
|
|
76
|
+
_log(f" - agent_type: {agent_type}")
|
|
77
|
+
_log(f" - request_data provided: {bool(request_data)}")
|
|
78
|
+
_log(
|
|
79
|
+
f" - delegation_requests size before: {len(self.delegation_requests)}"
|
|
77
80
|
)
|
|
78
81
|
|
|
79
82
|
if session_id and agent_type and agent_type != "unknown":
|
|
@@ -89,15 +92,9 @@ class StateManagerService:
|
|
|
89
92
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
90
93
|
}
|
|
91
94
|
if DEBUG:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
f" - ✅ Stored in delegation_requests[{session_id[:16]}...]",
|
|
96
|
-
file=sys.stderr,
|
|
97
|
-
)
|
|
98
|
-
print(
|
|
99
|
-
f" - delegation_requests size after: {len(self.delegation_requests)}",
|
|
100
|
-
file=sys.stderr,
|
|
95
|
+
_log(f" - ✅ Stored in delegation_requests[{session_id[:16]}...]")
|
|
96
|
+
_log(
|
|
97
|
+
f" - delegation_requests size after: {len(self.delegation_requests)}"
|
|
101
98
|
)
|
|
102
99
|
|
|
103
100
|
# Clean up old delegations (older than 5 minutes)
|
|
@@ -197,7 +194,7 @@ class StateManagerService:
|
|
|
197
194
|
os.chdir(working_dir)
|
|
198
195
|
|
|
199
196
|
# Run git command to get current branch
|
|
200
|
-
result = subprocess.run(
|
|
197
|
+
result = subprocess.run( # nosec B603 B607
|
|
201
198
|
["git", "branch", "--show-current"],
|
|
202
199
|
capture_output=True,
|
|
203
200
|
text=True,
|
|
@@ -233,17 +230,12 @@ class StateManagerService:
|
|
|
233
230
|
def find_matching_request(self, session_id: str) -> Optional[dict]:
|
|
234
231
|
"""Find matching request data for a session, with fuzzy matching fallback."""
|
|
235
232
|
# First try exact match
|
|
236
|
-
request_info = self.delegation_requests.get(session_id)
|
|
233
|
+
request_info = self.delegation_requests.get(session_id) # nosec B113
|
|
237
234
|
|
|
238
235
|
# If exact match fails, try partial matching
|
|
239
236
|
if not request_info and session_id:
|
|
240
237
|
if DEBUG:
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
print(
|
|
244
|
-
f" - Trying fuzzy match for session {session_id[:16]}...",
|
|
245
|
-
file=sys.stderr,
|
|
246
|
-
)
|
|
238
|
+
_log(f" - Trying fuzzy match for session {session_id[:16]}...")
|
|
247
239
|
# Try to find a session that matches the first 8-16 characters
|
|
248
240
|
for stored_sid in list(self.delegation_requests.keys()):
|
|
249
241
|
if (
|
|
@@ -256,13 +248,8 @@ class StateManagerService:
|
|
|
256
248
|
)
|
|
257
249
|
):
|
|
258
250
|
if DEBUG:
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
print(
|
|
262
|
-
f" - ✅ Fuzzy match found: {stored_sid[:16]}...",
|
|
263
|
-
file=sys.stderr,
|
|
264
|
-
)
|
|
265
|
-
request_info = self.delegation_requests.get(stored_sid)
|
|
251
|
+
_log(f" - ✅ Fuzzy match found: {stored_sid[:16]}...")
|
|
252
|
+
request_info = self.delegation_requests.get(stored_sid) # nosec B113
|
|
266
253
|
# Update the key to use the current session_id for consistency
|
|
267
254
|
if request_info:
|
|
268
255
|
self.delegation_requests[session_id] = request_info
|
|
@@ -10,10 +10,18 @@ This service handles:
|
|
|
10
10
|
import json
|
|
11
11
|
import os
|
|
12
12
|
import re
|
|
13
|
-
import sys
|
|
14
13
|
from datetime import datetime, timezone
|
|
15
14
|
from typing import Optional, Tuple
|
|
16
15
|
|
|
16
|
+
# Try to import _log from hook_handler, fall back to no-op
|
|
17
|
+
try:
|
|
18
|
+
from claude_mpm.hooks.claude_hooks.hook_handler import _log
|
|
19
|
+
except ImportError:
|
|
20
|
+
|
|
21
|
+
def _log(msg: str) -> None:
|
|
22
|
+
pass # Silent fallback
|
|
23
|
+
|
|
24
|
+
|
|
17
25
|
# Debug mode is enabled by default for better visibility into hook processing
|
|
18
26
|
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
19
27
|
|
|
@@ -45,26 +53,21 @@ class SubagentResponseProcessor:
|
|
|
45
53
|
# Enhanced debug logging for session correlation
|
|
46
54
|
session_id = event.get("session_id", "")
|
|
47
55
|
if DEBUG:
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
print(f" - event keys: {list(event.keys())}", file=sys.stderr)
|
|
53
|
-
print(
|
|
54
|
-
f" - delegation_requests size: {len(self.state_manager.delegation_requests)}",
|
|
55
|
-
file=sys.stderr,
|
|
56
|
+
_log(f" - session_id: {session_id[:16] if session_id else 'None'}...")
|
|
57
|
+
_log(f" - event keys: {list(event.keys())}")
|
|
58
|
+
_log(
|
|
59
|
+
f" - delegation_requests size: {len(self.state_manager.delegation_requests)}"
|
|
56
60
|
)
|
|
57
61
|
# Show all stored session IDs for comparison
|
|
58
62
|
all_sessions = list(self.state_manager.delegation_requests.keys())
|
|
59
63
|
if all_sessions:
|
|
60
|
-
|
|
64
|
+
_log(" - Stored sessions (first 16 chars):")
|
|
61
65
|
for sid in all_sessions[:10]: # Show up to 10
|
|
62
|
-
|
|
63
|
-
f" - {sid[:16]}... (agent: {self.state_manager.delegation_requests[sid].get('agent_type', 'unknown')})"
|
|
64
|
-
file=sys.stderr,
|
|
66
|
+
_log(
|
|
67
|
+
f" - {sid[:16]}... (agent: {self.state_manager.delegation_requests[sid].get('agent_type', 'unknown')})"
|
|
65
68
|
)
|
|
66
69
|
else:
|
|
67
|
-
|
|
70
|
+
_log(" - No stored sessions in delegation_requests!")
|
|
68
71
|
|
|
69
72
|
# Get agent type and other basic info
|
|
70
73
|
agent_type, agent_id, reason, agent_type_inferred = self._extract_basic_info(
|
|
@@ -73,9 +76,8 @@ class SubagentResponseProcessor:
|
|
|
73
76
|
|
|
74
77
|
# Always log SubagentStop events for debugging
|
|
75
78
|
if DEBUG or agent_type != "unknown":
|
|
76
|
-
|
|
77
|
-
f"Hook handler: Processing SubagentStop - agent: '{agent_type}', session: '{session_id}', reason: '{reason}'"
|
|
78
|
-
file=sys.stderr,
|
|
79
|
+
_log(
|
|
80
|
+
f"Hook handler: Processing SubagentStop - agent: '{agent_type}', session: '{session_id}', reason: '{reason}'"
|
|
79
81
|
)
|
|
80
82
|
|
|
81
83
|
# Get working directory and git branch
|
|
@@ -115,9 +117,8 @@ class SubagentResponseProcessor:
|
|
|
115
117
|
|
|
116
118
|
# Debug log the processed data
|
|
117
119
|
if DEBUG:
|
|
118
|
-
|
|
119
|
-
f"SubagentStop processed data: agent_type='{agent_type}', session_id='{session_id}'"
|
|
120
|
-
file=sys.stderr,
|
|
120
|
+
_log(
|
|
121
|
+
f"SubagentStop processed data: agent_type='{agent_type}', session_id='{session_id}'"
|
|
121
122
|
)
|
|
122
123
|
|
|
123
124
|
# Emit to default namespace (consistent with subagent_start)
|
|
@@ -163,10 +164,7 @@ class SubagentResponseProcessor:
|
|
|
163
164
|
agent_type = "pm"
|
|
164
165
|
agent_type_inferred = True
|
|
165
166
|
if DEBUG:
|
|
166
|
-
|
|
167
|
-
" - Inferred agent_type='pm' (no explicit type found)",
|
|
168
|
-
file=sys.stderr,
|
|
169
|
-
)
|
|
167
|
+
_log(" - Inferred agent_type='pm' (no explicit type found)")
|
|
170
168
|
|
|
171
169
|
return agent_type, agent_id, reason, agent_type_inferred
|
|
172
170
|
|
|
@@ -182,17 +180,15 @@ class SubagentResponseProcessor:
|
|
|
182
180
|
if json_match:
|
|
183
181
|
structured_response = json.loads(json_match.group(1))
|
|
184
182
|
if DEBUG:
|
|
185
|
-
|
|
186
|
-
f"Extracted structured response from {agent_type} agent in SubagentStop"
|
|
187
|
-
file=sys.stderr,
|
|
183
|
+
_log(
|
|
184
|
+
f"Extracted structured response from {agent_type} agent in SubagentStop"
|
|
188
185
|
)
|
|
189
186
|
|
|
190
187
|
# Log if MEMORIES field is present
|
|
191
188
|
if structured_response.get("MEMORIES") and DEBUG:
|
|
192
189
|
memories_count = len(structured_response["MEMORIES"])
|
|
193
|
-
|
|
194
|
-
f"Agent {agent_type} returned MEMORIES field with {memories_count} items"
|
|
195
|
-
file=sys.stderr,
|
|
190
|
+
_log(
|
|
191
|
+
f"Agent {agent_type} returned MEMORIES field with {memories_count} items"
|
|
196
192
|
)
|
|
197
193
|
|
|
198
194
|
return structured_response
|
|
@@ -214,20 +210,15 @@ class SubagentResponseProcessor:
|
|
|
214
210
|
):
|
|
215
211
|
"""Track the agent response if response tracking is enabled."""
|
|
216
212
|
if DEBUG:
|
|
217
|
-
|
|
218
|
-
f" - response_tracking_enabled: {self.response_tracking_manager.response_tracking_enabled}"
|
|
219
|
-
file=sys.stderr,
|
|
220
|
-
)
|
|
221
|
-
print(
|
|
222
|
-
f" - response_tracker exists: {self.response_tracking_manager.response_tracker is not None}",
|
|
223
|
-
file=sys.stderr,
|
|
213
|
+
_log(
|
|
214
|
+
f" - response_tracking_enabled: {self.response_tracking_manager.response_tracking_enabled}"
|
|
224
215
|
)
|
|
225
|
-
|
|
226
|
-
f" -
|
|
227
|
-
file=sys.stderr,
|
|
216
|
+
_log(
|
|
217
|
+
f" - response_tracker exists: {self.response_tracking_manager.response_tracker is not None}"
|
|
228
218
|
)
|
|
229
|
-
|
|
230
|
-
|
|
219
|
+
_log(f" - session_id: {session_id[:16] if session_id else 'None'}...")
|
|
220
|
+
_log(f" - agent_type: {agent_type}")
|
|
221
|
+
_log(f" - reason: {reason}")
|
|
231
222
|
|
|
232
223
|
if (
|
|
233
224
|
self.response_tracking_manager.response_tracking_enabled
|
|
@@ -238,27 +229,16 @@ class SubagentResponseProcessor:
|
|
|
238
229
|
request_info = self.state_manager.find_matching_request(session_id)
|
|
239
230
|
|
|
240
231
|
if DEBUG:
|
|
241
|
-
|
|
242
|
-
f" - request_info present: {bool(request_info)}",
|
|
243
|
-
file=sys.stderr,
|
|
244
|
-
)
|
|
232
|
+
_log(f" - request_info present: {bool(request_info)}")
|
|
245
233
|
if request_info:
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
print(
|
|
251
|
-
f" - stored agent_type: {request_info.get('agent_type')}",
|
|
252
|
-
file=sys.stderr,
|
|
253
|
-
)
|
|
254
|
-
print(
|
|
255
|
-
f" - request keys: {list(request_info.get('request', {}).keys())}",
|
|
256
|
-
file=sys.stderr,
|
|
234
|
+
_log(" - ✅ Found request data for response tracking")
|
|
235
|
+
_log(f" - stored agent_type: {request_info.get('agent_type')}")
|
|
236
|
+
_log(
|
|
237
|
+
f" - request keys: {list(request_info.get('request', {}).keys())}"
|
|
257
238
|
)
|
|
258
239
|
else:
|
|
259
|
-
|
|
260
|
-
f" - ❌ No request data found for session {session_id[:16]}..."
|
|
261
|
-
file=sys.stderr,
|
|
240
|
+
_log(
|
|
241
|
+
f" - ❌ No request data found for session {session_id[:16]}..."
|
|
262
242
|
)
|
|
263
243
|
|
|
264
244
|
if request_info:
|
|
@@ -310,9 +290,8 @@ class SubagentResponseProcessor:
|
|
|
310
290
|
# Check for MEMORIES field and process if present
|
|
311
291
|
if structured_response.get("MEMORIES") and DEBUG:
|
|
312
292
|
memories = structured_response["MEMORIES"]
|
|
313
|
-
|
|
314
|
-
f"Found MEMORIES field in {agent_type} response with {len(memories)} items"
|
|
315
|
-
file=sys.stderr,
|
|
293
|
+
_log(
|
|
294
|
+
f"Found MEMORIES field in {agent_type} response with {len(memories)} items"
|
|
316
295
|
)
|
|
317
296
|
# The memory will be processed by extract_and_update_memory
|
|
318
297
|
# which is called by the memory hook service
|
|
@@ -329,26 +308,21 @@ class SubagentResponseProcessor:
|
|
|
329
308
|
)
|
|
330
309
|
|
|
331
310
|
if file_path and DEBUG:
|
|
332
|
-
|
|
333
|
-
f"✅ Tracked {agent_type} agent response on SubagentStop: {file_path.name}"
|
|
334
|
-
file=sys.stderr,
|
|
311
|
+
_log(
|
|
312
|
+
f"✅ Tracked {agent_type} agent response on SubagentStop: {file_path.name}"
|
|
335
313
|
)
|
|
336
314
|
|
|
337
315
|
# Clean up the request data
|
|
338
316
|
self.state_manager.remove_request(session_id)
|
|
339
317
|
|
|
340
318
|
elif DEBUG:
|
|
341
|
-
|
|
342
|
-
f"No request data for SubagentStop session {session_id[:8]}..., agent: {agent_type}"
|
|
343
|
-
file=sys.stderr,
|
|
319
|
+
_log(
|
|
320
|
+
f"No request data for SubagentStop session {session_id[:8]}..., agent: {agent_type}"
|
|
344
321
|
)
|
|
345
322
|
|
|
346
323
|
except Exception as e:
|
|
347
324
|
if DEBUG:
|
|
348
|
-
|
|
349
|
-
f"❌ Failed to track response on SubagentStop: {e}",
|
|
350
|
-
file=sys.stderr,
|
|
351
|
-
)
|
|
325
|
+
_log(f"❌ Failed to track response on SubagentStop: {e}")
|
|
352
326
|
|
|
353
327
|
def _build_subagent_stop_data(
|
|
354
328
|
self,
|
|
@@ -12,13 +12,21 @@ DESIGN DECISIONS:
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
import json
|
|
15
|
-
import sys
|
|
16
15
|
from pathlib import Path
|
|
17
16
|
from typing import Any, Dict, Optional
|
|
18
17
|
|
|
19
18
|
from claude_mpm.core.logger import get_logger
|
|
20
19
|
from claude_mpm.services.cli.session_resume_helper import SessionResumeHelper
|
|
21
20
|
|
|
21
|
+
# Try to import _log from hook_handler, fall back to no-op
|
|
22
|
+
try:
|
|
23
|
+
from claude_mpm.hooks.claude_hooks.hook_handler import _log
|
|
24
|
+
except ImportError:
|
|
25
|
+
|
|
26
|
+
def _log(msg: str) -> None:
|
|
27
|
+
pass # Silent fallback
|
|
28
|
+
|
|
29
|
+
|
|
22
30
|
logger = get_logger(__name__)
|
|
23
31
|
|
|
24
32
|
|
|
@@ -86,23 +94,19 @@ class SessionResumeStartupHook:
|
|
|
86
94
|
Args:
|
|
87
95
|
pause_info: Pause session metadata from check_for_active_pause()
|
|
88
96
|
"""
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
print(" 1. Continue (actions will be appended)", file=sys.stderr)
|
|
103
|
-
print(" 2. Use /mpm-init pause --finalize to create snapshot", file=sys.stderr)
|
|
104
|
-
print(" 3. Use /mpm-init pause --discard to abandon", file=sys.stderr)
|
|
105
|
-
print("=" * 60 + "\n", file=sys.stderr)
|
|
97
|
+
_log("=" * 60)
|
|
98
|
+
_log("⚠️ ACTIVE AUTO-PAUSE SESSION DETECTED")
|
|
99
|
+
_log("=" * 60)
|
|
100
|
+
_log(f"Session ID: {pause_info['session_id']}")
|
|
101
|
+
_log(f"Started at: {pause_info['started_at']}")
|
|
102
|
+
_log(f"Context at pause: {pause_info['context_at_start']:.1%}")
|
|
103
|
+
_log(f"Actions recorded: {pause_info['action_count']}")
|
|
104
|
+
_log("\nThis session was auto-paused due to high context usage.")
|
|
105
|
+
_log("Options:")
|
|
106
|
+
_log(" 1. Continue (actions will be appended)")
|
|
107
|
+
_log(" 2. Use /mpm-init pause --finalize to create snapshot")
|
|
108
|
+
_log(" 3. Use /mpm-init pause --discard to abandon")
|
|
109
|
+
_log("=" * 60 + "\n")
|
|
106
110
|
|
|
107
111
|
def on_pm_startup(self) -> Optional[Dict[str, Any]]:
|
|
108
112
|
"""Execute on PM startup to check for paused sessions.
|
|
@@ -55,6 +55,14 @@ import sys
|
|
|
55
55
|
from pathlib import Path
|
|
56
56
|
from typing import Any, Dict, Optional
|
|
57
57
|
|
|
58
|
+
# Try to import _log from hook_handler, fall back to no-op
|
|
59
|
+
try:
|
|
60
|
+
from claude_mpm.hooks.claude_hooks.hook_handler import _log
|
|
61
|
+
except ImportError:
|
|
62
|
+
|
|
63
|
+
def _log(msg: str) -> None:
|
|
64
|
+
pass # Silent fallback
|
|
65
|
+
|
|
58
66
|
|
|
59
67
|
class PreToolUseHook:
|
|
60
68
|
"""Base class for PreToolUse hooks with input modification support."""
|
|
@@ -64,9 +72,9 @@ class PreToolUseHook:
|
|
|
64
72
|
self.debug = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "false").lower() == "true"
|
|
65
73
|
|
|
66
74
|
def log_debug(self, message: str) -> None:
|
|
67
|
-
"""Log debug message
|
|
75
|
+
"""Log debug message using _log helper."""
|
|
68
76
|
if self.debug:
|
|
69
|
-
|
|
77
|
+
_log(f"[PreToolUse Hook] {message}")
|
|
70
78
|
|
|
71
79
|
def read_event(self) -> Optional[Dict[str, Any]]:
|
|
72
80
|
"""Read and parse the hook event from stdin."""
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
|
2
|
-
claude_mpm/VERSION,sha256=
|
|
2
|
+
claude_mpm/VERSION,sha256=Wwas5xnKQTkqXgApeVHQvWZFinNkdNv7W6HjYbrwERA,6
|
|
3
3
|
claude_mpm/__init__.py,sha256=AGfh00BHKvLYD-UVFw7qbKtl7NMRIzRXOWw7vEuZ-h4,2214
|
|
4
4
|
claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
|
|
5
5
|
claude_mpm/constants.py,sha256=pz3lTrZZR5HhV3eZzYtIbtBwWo7iM6pkBHP_ixxmI6Y,6827
|
|
@@ -402,34 +402,60 @@ claude_mpm/hooks/kuzu_enrichment_hook.py,sha256=jghoEZX8fA6HZ1kM_5l93cuCyy-AMBjW
|
|
|
402
402
|
claude_mpm/hooks/kuzu_memory_hook.py,sha256=PK7AABvk5SHqmLyjIBEGl5nrsExJK1IVQvcXG8xeorM,12639
|
|
403
403
|
claude_mpm/hooks/kuzu_response_hook.py,sha256=1eJ4WjME5eRN-7TdFD3nNsXm7nE16BjkhlvycaYvngM,6119
|
|
404
404
|
claude_mpm/hooks/memory_integration_hook.py,sha256=MWy2NjbovTnBleTt-6JO6EqkYDP3PGai1HUK4pHLL0o,18517
|
|
405
|
-
claude_mpm/hooks/session_resume_hook.py,sha256=
|
|
405
|
+
claude_mpm/hooks/session_resume_hook.py,sha256=mUkH2zsqrF_MCLT2wfRnPpv7Dp0Qx3YCdaMB4pdWfag,7305
|
|
406
406
|
claude_mpm/hooks/tool_call_interceptor.py,sha256=tYUBJHjbtaI5-HSWcz0aeUW0CaiQPypuDOTULQ0BCNI,7506
|
|
407
407
|
claude_mpm/hooks/validation_hooks.py,sha256=i5uOaXifItwJfIdjjLCxAwrkKdkmo2Qa4qMc5-dwsKw,6465
|
|
408
408
|
claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md,sha256=w21pg7JRuOLdg28f1A7EcyPxkRH_SXLgbQTKdfBCNsU,7484
|
|
409
409
|
claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md,sha256=l7A6f-yi-Z1s1t3vlNmjgZjcGVxwSUt1ZDNuUuF4cJ0,12449
|
|
410
410
|
claude_mpm/hooks/claude_hooks/__init__.py,sha256=b4mud_g3S-3itHY_Dzpbb_SmdMEcJwtUU8fTcqpLqqs,130
|
|
411
|
-
claude_mpm/hooks/claude_hooks/auto_pause_handler.py,sha256=
|
|
411
|
+
claude_mpm/hooks/claude_hooks/auto_pause_handler.py,sha256=Iy80whkkPFJpn1z7u8PY57r9LC5BvEg3wfDlyknv0a0,17184
|
|
412
412
|
claude_mpm/hooks/claude_hooks/connection_pool.py,sha256=vpi-XbVf61GWhh85tHBzubbOgbJly_I-5-QmsleND2M,8658
|
|
413
413
|
claude_mpm/hooks/claude_hooks/correlation_manager.py,sha256=3n-RxzqE8egG4max_NcpJgL9gzrBY6Ti529LrjleI1g,2033
|
|
414
|
-
claude_mpm/hooks/claude_hooks/event_handlers.py,sha256=
|
|
414
|
+
claude_mpm/hooks/claude_hooks/event_handlers.py,sha256=u7qkfthzAJxE5X4vAp5dCYhVDsadfC--vsqZVlmcrvE,45768
|
|
415
415
|
claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=UOl5IVvz0Ro8Z0Owx4sKUWCxoIhvQpt7VTJ8lRC7Y8o,28266
|
|
416
416
|
claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=XYkdYtcM0nfnwYvMdyIFCasr80ry3uI5-fLYsLtDGw4,2214
|
|
417
417
|
claude_mpm/hooks/claude_hooks/installer.py,sha256=X6m0CQ9mjaESqUu9RF00uOopZx1u5VOeR0-ilyaP6Xg,33275
|
|
418
|
-
claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=
|
|
419
|
-
claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=
|
|
418
|
+
claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=fj_d9N7aytLELomdphLLwYApXzmbhBxtwSK4xkmd55o,10759
|
|
419
|
+
claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=2dyDOK9u-N4KcqWF7qq2T17bkps0grbs8MeWBRSC8vE,16323
|
|
420
420
|
claude_mpm/hooks/claude_hooks/tool_analysis.py,sha256=3_o2PP9D7wEMwLriCtIBOw0cj2fSZfepN7lI4P1meSQ,7862
|
|
421
|
+
claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc,sha256=EGpgXqhPM0iRRZtCqHaLVQ6wDH42OH_M7Gt5GiFLyro,346
|
|
422
|
+
claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-314.pyc,sha256=tBzcQ_3WxkmgPTQAPd7uKgFGtz-Yb6r2hEgF9Y_Flwc,319
|
|
423
|
+
claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc,sha256=7YbusOM2EaL4NqIuNsLTJRCRJWRxo0DhVLXm9ZVFc7Y,20829
|
|
424
|
+
claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc,sha256=vo_mPXj0KTtBz2_SAU4NZ7TEWPfgBZtLeXD3CMAvJ3M,21381
|
|
425
|
+
claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc,sha256=SQX5iiP9bQZkLL-cj_2tlGH7lpAzarO0mYal7btj3tc,3521
|
|
426
|
+
claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc,sha256=43y-O3fzE07cyJx1we9DfLeaIkL0GQR4KKpnzh_94uk,44526
|
|
427
|
+
claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc,sha256=DC4owkvPyhcCT7ScUxlKS6pUygaUYEMj0k3eVYZHdMk,42528
|
|
428
|
+
claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc,sha256=vhJjvAMTdDWkB_qWaWr_PeDb4I8-h7UymR1wDVHeyYM,30789
|
|
429
|
+
claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc,sha256=RVz6WvW-sD7kLbh6S5a96WarpPvZv4_qfFMR5SN8WUo,30603
|
|
430
|
+
claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc,sha256=hxxLzkAFGV4sBK3NiYZ6zVlc1Cq9yTc8YPzp-mf5sxo,37219
|
|
431
|
+
claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc,sha256=Xu_hwOf9AG0mZthl5gcDcVv68FiSo5KgZ6lDxdZXCfU,11185
|
|
432
|
+
claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc,sha256=oJhMGouqaFI1u3NZryHoRh6ucfPKHPe8GufcsPzi89o,11081
|
|
433
|
+
claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc,sha256=qJ5xY8yYwo8ZO7P-Gem_GK4VZdqyNeYvs8ANvC45jnw,16228
|
|
434
|
+
claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc,sha256=yu70SIPNsdECY8l_P971JPFuUPXqD4HmjuuGMU-nSAU,15820
|
|
435
|
+
claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc,sha256=ZjcNfNY5Ht6FhalPeh7M7OzMffcey5iF4AVjDDg9kak,10694
|
|
436
|
+
claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc,sha256=ck8ifVIoVPaMVVRcMgvsM8RfIHnQbwGBUVs25A-yQBw,10771
|
|
421
437
|
claude_mpm/hooks/claude_hooks/services/__init__.py,sha256=OIYOKsUNw1BHYawOCp-KFK5kmQKuj92cCqCEPO0nwo0,585
|
|
422
|
-
claude_mpm/hooks/claude_hooks/services/connection_manager.py,sha256=
|
|
423
|
-
claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=
|
|
438
|
+
claude_mpm/hooks/claude_hooks/services/connection_manager.py,sha256=shpoCLJpM9qoCDMUuUhk6L9WEKdzLB_OsPtwtDyJMdk,10197
|
|
439
|
+
claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=rdwUhK7DoPqDSRGPHW1uiaE8McsnmggvCQGZ2x_vX-o,7583
|
|
424
440
|
claude_mpm/hooks/claude_hooks/services/duplicate_detector.py,sha256=Fh9LmEMsVmQM9t0U1v2l_fuBwvNpVkl_0EF8Wu5KLHQ,3882
|
|
425
|
-
claude_mpm/hooks/claude_hooks/services/state_manager.py,sha256=
|
|
426
|
-
claude_mpm/hooks/claude_hooks/services/subagent_processor.py,sha256=
|
|
441
|
+
claude_mpm/hooks/claude_hooks/services/state_manager.py,sha256=PcEpAzwEnZRjw6JnbtbekDRdhIoaKql5VhhZJCEPNt4,10899
|
|
442
|
+
claude_mpm/hooks/claude_hooks/services/subagent_processor.py,sha256=unHGeU6PJxc00_3xnLyyZHeLa47x98knxn6cl-i8ALA,15040
|
|
443
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc,sha256=xBfLBSqnpcKfcQBWfh7xUm454g1lq1LvbO7SxGvcOPc,644
|
|
444
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.pyc,sha256=nZDxNz67tIFwbZNRqyCRX8cSi0v3JKCZS5U5FhwwApA,562
|
|
445
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc,sha256=SydGEQ9oUWs161Ro4ULHfnPB0wiZgiB7V628B3V6N2U,9613
|
|
446
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc,sha256=PjdPDUyUQWm0FqYRdG2knPoZDSKS0g1vk-BDAXfzCi8,9627
|
|
447
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc,sha256=Yy_REAUhJCiFjOhxeDb4v0qyEvEbUtCmXD9PAz40dhw,5321
|
|
448
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc,sha256=Xy9iNAtQMfXC_eW9rvumG9rFqK5t-QlLPmUahlqza_I,5341
|
|
449
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc,sha256=P-Au2P5H0enEeKm7sP1eQv-SU6AAnCqjjOE5jhXcrgs,12352
|
|
450
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc,sha256=-H3-oDao1c8Dy1reMR98kR1W556eNpPmRWOvKGszKz4,13101
|
|
451
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc,sha256=4SfbElFMcQK07Frewl9mQ0eB5yCqZUe-CGfGYNUUMh0,14931
|
|
452
|
+
claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc,sha256=o6Dc1-yyZjUdVh_JWZmEIvVt0qG0R1-aLhr7XTt-oX0,15104
|
|
427
453
|
claude_mpm/hooks/failure_learning/__init__.py,sha256=iJ80AKFHiT8DjIH2a72DQVJvL6nAFrizNA2yTKwZ4rw,1805
|
|
428
454
|
claude_mpm/hooks/failure_learning/failure_detection_hook.py,sha256=KENoB5N-dBm5hb0SxeIZtCvNKbmG2BKHOJSrSO-3Z_I,7500
|
|
429
455
|
claude_mpm/hooks/failure_learning/fix_detection_hook.py,sha256=XUk1bnBVLdfhQ9AMQSvGsTSeFQsKsVud2wbWX-Jjor8,7164
|
|
430
456
|
claude_mpm/hooks/failure_learning/learning_extraction_hook.py,sha256=vAOwVuZa_bBBSrFvM9v3wt7T1frZO_Yb5iNGOCgWVuk,9981
|
|
431
457
|
claude_mpm/hooks/templates/pre_tool_use_simple.py,sha256=E7EIiX0ERjgQ5-hzPeZnT18NBdU5hJHxXq0LH7K984M,2156
|
|
432
|
-
claude_mpm/hooks/templates/pre_tool_use_template.py,sha256=
|
|
458
|
+
claude_mpm/hooks/templates/pre_tool_use_template.py,sha256=y-FrEg04X1BAaMfhXO3ITLPg3j-aSmI7UwLpZRWzAK0,10230
|
|
433
459
|
claude_mpm/models/__init__.py,sha256=GADyLAiF-1VVghYKI7Urz3zSnf2sjJUXlOEMuCOs7_g,468
|
|
434
460
|
claude_mpm/models/agent_definition.py,sha256=rMCVu4qYpHvw0wSmr5KPyNf8p6Hne049w2erb2Ba_20,7122
|
|
435
461
|
claude_mpm/models/agent_session.py,sha256=Tc-0OfAorb5BCmOpoZmC7jMdbtm6zZKF1Wtj16MO27s,20054
|
|
@@ -1070,10 +1096,10 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
|
|
|
1070
1096
|
claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
|
|
1071
1097
|
claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
|
|
1072
1098
|
claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
|
|
1073
|
-
claude_mpm-5.6.
|
|
1074
|
-
claude_mpm-5.6.
|
|
1075
|
-
claude_mpm-5.6.
|
|
1076
|
-
claude_mpm-5.6.
|
|
1077
|
-
claude_mpm-5.6.
|
|
1078
|
-
claude_mpm-5.6.
|
|
1079
|
-
claude_mpm-5.6.
|
|
1099
|
+
claude_mpm-5.6.5.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
|
|
1100
|
+
claude_mpm-5.6.5.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
|
|
1101
|
+
claude_mpm-5.6.5.dist-info/METADATA,sha256=G50Re3GrZttFycswLOr3Q_yl-JH3cuDqPMJu2UraWTE,14983
|
|
1102
|
+
claude_mpm-5.6.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1103
|
+
claude_mpm-5.6.5.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
|
|
1104
|
+
claude_mpm-5.6.5.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
|
|
1105
|
+
claude_mpm-5.6.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|