session-buddy 0.10.0__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.
Files changed (135) hide show
  1. session_buddy/__init__.py +32 -0
  2. session_buddy/__main__.py +23 -0
  3. session_buddy/acb_cache_adapter.py +282 -0
  4. session_buddy/adapters/__init__.py +38 -0
  5. session_buddy/adapters/knowledge_graph_adapter.py +715 -0
  6. session_buddy/adapters/knowledge_graph_adapter_acb_investigation.py +492 -0
  7. session_buddy/adapters/reflection_adapter.py +593 -0
  8. session_buddy/adapters/serverless_storage_adapter.py +336 -0
  9. session_buddy/adapters/session_storage_adapter.py +366 -0
  10. session_buddy/adapters/storage_registry.py +266 -0
  11. session_buddy/advanced_features.py +878 -0
  12. session_buddy/advanced_search.py +935 -0
  13. session_buddy/app_monitor.py +976 -0
  14. session_buddy/backends/__init__.py +25 -0
  15. session_buddy/backends/acb_cache_backend.py +280 -0
  16. session_buddy/backends/base.py +118 -0
  17. session_buddy/backends/local_backend.py +184 -0
  18. session_buddy/backends/redis_backend.py +260 -0
  19. session_buddy/backends/s3_backend.py +305 -0
  20. session_buddy/cli.py +482 -0
  21. session_buddy/config/feature_flags.py +107 -0
  22. session_buddy/context_manager.py +584 -0
  23. session_buddy/core/__init__.py +5 -0
  24. session_buddy/core/features.py +189 -0
  25. session_buddy/core/lifecycle/__init__.py +71 -0
  26. session_buddy/core/lifecycle/handoff.py +110 -0
  27. session_buddy/core/lifecycle/project_context.py +106 -0
  28. session_buddy/core/lifecycle/session_info.py +153 -0
  29. session_buddy/core/permissions.py +146 -0
  30. session_buddy/core/session_manager.py +799 -0
  31. session_buddy/crackerjack_integration.py +1097 -0
  32. session_buddy/di/__init__.py +409 -0
  33. session_buddy/di/config.py +99 -0
  34. session_buddy/di/constants.py +7 -0
  35. session_buddy/health_checks.py +366 -0
  36. session_buddy/interruption_manager.py +879 -0
  37. session_buddy/knowledge_graph_db.py +751 -0
  38. session_buddy/llm/__init__.py +44 -0
  39. session_buddy/llm/base.py +55 -0
  40. session_buddy/llm/models.py +75 -0
  41. session_buddy/llm/providers/__init__.py +19 -0
  42. session_buddy/llm/providers/anthropic_provider.py +140 -0
  43. session_buddy/llm/providers/gemini_provider.py +207 -0
  44. session_buddy/llm/providers/ollama_provider.py +302 -0
  45. session_buddy/llm/providers/openai_provider.py +156 -0
  46. session_buddy/llm/security.py +141 -0
  47. session_buddy/llm_providers.py +432 -0
  48. session_buddy/memory/conscious_agent.py +443 -0
  49. session_buddy/memory/entity_extractor.py +346 -0
  50. session_buddy/memory/file_context.py +33 -0
  51. session_buddy/memory/migration.py +339 -0
  52. session_buddy/memory/persistence.py +187 -0
  53. session_buddy/memory/schema_v2.py +194 -0
  54. session_buddy/memory_optimizer.py +799 -0
  55. session_buddy/multi_project_coordinator.py +699 -0
  56. session_buddy/natural_scheduler.py +616 -0
  57. session_buddy/parameter_models.py +734 -0
  58. session_buddy/quality_engine.py +1000 -0
  59. session_buddy/reflection_tools.py +999 -0
  60. session_buddy/resource_cleanup.py +392 -0
  61. session_buddy/search_enhanced.py +572 -0
  62. session_buddy/server.py +743 -0
  63. session_buddy/server_core.py +662 -0
  64. session_buddy/server_optimized.py +573 -0
  65. session_buddy/serverless_mode.py +327 -0
  66. session_buddy/session_commands.py +314 -0
  67. session_buddy/settings.py +485 -0
  68. session_buddy/shutdown_manager.py +427 -0
  69. session_buddy/team_knowledge.py +933 -0
  70. session_buddy/token_optimizer.py +601 -0
  71. session_buddy/tools/__init__.py +35 -0
  72. session_buddy/tools/access_log_tools.py +171 -0
  73. session_buddy/tools/agent_analyzer.py +237 -0
  74. session_buddy/tools/conscious_agent_tools.py +48 -0
  75. session_buddy/tools/crackerjack_tools.py +1402 -0
  76. session_buddy/tools/entity_extraction_tools.py +89 -0
  77. session_buddy/tools/feature_flags_tools.py +56 -0
  78. session_buddy/tools/health_tools.py +103 -0
  79. session_buddy/tools/history_cache.py +33 -0
  80. session_buddy/tools/hook_parser.py +216 -0
  81. session_buddy/tools/knowledge_graph_tools.py +701 -0
  82. session_buddy/tools/llm_tools.py +459 -0
  83. session_buddy/tools/memory_tools.py +566 -0
  84. session_buddy/tools/migration_tools.py +57 -0
  85. session_buddy/tools/monitoring_tools.py +625 -0
  86. session_buddy/tools/prompt_tools.py +452 -0
  87. session_buddy/tools/protocols.py +205 -0
  88. session_buddy/tools/quality_metrics.py +182 -0
  89. session_buddy/tools/recommendation_engine.py +516 -0
  90. session_buddy/tools/search_tools.py +802 -0
  91. session_buddy/tools/serverless_tools.py +440 -0
  92. session_buddy/tools/session_tools.py +897 -0
  93. session_buddy/tools/team_tools.py +377 -0
  94. session_buddy/tools/validated_memory_tools.py +537 -0
  95. session_buddy/trailing_period_removal_summary.md +64 -0
  96. session_buddy/types.py +41 -0
  97. session_buddy/utils/__init__.py +111 -0
  98. session_buddy/utils/crackerjack/__init__.py +18 -0
  99. session_buddy/utils/crackerjack/output_parser.py +527 -0
  100. session_buddy/utils/crackerjack/pattern_builder.py +85 -0
  101. session_buddy/utils/database_helpers.py +237 -0
  102. session_buddy/utils/database_pool.py +255 -0
  103. session_buddy/utils/error_handlers.py +188 -0
  104. session_buddy/utils/file_utils.py +246 -0
  105. session_buddy/utils/format_utils.py +305 -0
  106. session_buddy/utils/git_operations.py +520 -0
  107. session_buddy/utils/git_utils.py +164 -0
  108. session_buddy/utils/instance_managers.py +243 -0
  109. session_buddy/utils/lazy_imports.py +308 -0
  110. session_buddy/utils/logging.py +160 -0
  111. session_buddy/utils/logging_utils.py +8 -0
  112. session_buddy/utils/messages.py +329 -0
  113. session_buddy/utils/project_analysis.py +66 -0
  114. session_buddy/utils/quality/__init__.py +55 -0
  115. session_buddy/utils/quality/compaction.py +145 -0
  116. session_buddy/utils/quality/recommendations.py +52 -0
  117. session_buddy/utils/quality/summary.py +112 -0
  118. session_buddy/utils/quality_utils.py +264 -0
  119. session_buddy/utils/quality_utils_v2.py +885 -0
  120. session_buddy/utils/reflection_utils.py +234 -0
  121. session_buddy/utils/regex_patterns.py +762 -0
  122. session_buddy/utils/scheduler/__init__.py +23 -0
  123. session_buddy/utils/scheduler/models.py +59 -0
  124. session_buddy/utils/scheduler/time_parser.py +331 -0
  125. session_buddy/utils/search/__init__.py +31 -0
  126. session_buddy/utils/search/models.py +48 -0
  127. session_buddy/utils/search/utilities.py +129 -0
  128. session_buddy/utils/server_helpers.py +540 -0
  129. session_buddy/utils/tool_wrapper.py +379 -0
  130. session_buddy/worktree_manager.py +734 -0
  131. session_buddy-0.10.0.dist-info/METADATA +325 -0
  132. session_buddy-0.10.0.dist-info/RECORD +135 -0
  133. session_buddy-0.10.0.dist-info/WHEEL +4 -0
  134. session_buddy-0.10.0.dist-info/entry_points.txt +3 -0
  135. session_buddy-0.10.0.dist-info/licenses/LICENSE +28 -0
@@ -0,0 +1,32 @@
1
+ """Session Management MCP Server.
2
+
3
+ Provides comprehensive session management, conversation memory,
4
+ and quality monitoring for Claude Code projects.
5
+ """
6
+
7
+ from contextlib import suppress
8
+
9
+ # Phase 2 Decomposition: New modular architecture
10
+ # These imports expose the decomposed server components
11
+ with suppress(ImportError):
12
+ from .advanced_features import (
13
+ AdvancedFeaturesHub,
14
+ )
15
+ from .core.permissions import (
16
+ SessionPermissionsManager,
17
+ )
18
+ # QualityScoreResult is not directly exposed from quality_engine as it doesn't exist
19
+ # MCPServerCore does not exist in server_core
20
+ from .utils.logging import SessionLogger
21
+
22
+ __version__ = "0.7.4"
23
+
24
+ __all__ = [
25
+ # Advanced features
26
+ "AdvancedFeaturesHub",
27
+ # Core components are not directly exposed
28
+ "SessionLogger",
29
+ "SessionPermissionsManager",
30
+ # Package metadata
31
+ "__version__",
32
+ ]
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env python3
2
+ """Session Management MCP Server - Module Entry Point.
3
+
4
+ Provides CLI interface matching crackerjack's server management pattern.
5
+
6
+ Usage:
7
+ python -m session_buddy --start-mcp-server # Start server
8
+ python -m session_buddy --stop-mcp-server # Stop server
9
+ python -m session_buddy --restart-mcp-server # Restart server
10
+ python -m session_buddy --status # Show status
11
+ python -m session_buddy --version # Show version
12
+ """
13
+
14
+
15
+ def main() -> None:
16
+ """Main entry point for the session management MCP server."""
17
+ from .cli import app
18
+
19
+ app()
20
+
21
+
22
+ if __name__ == "__main__":
23
+ main()
@@ -0,0 +1,282 @@
1
+ """Async-native, ACB-backed cache adapters for session-mgmt-mcp.
2
+
3
+ This module provides fully asynchronous cache adapters using aiocache,
4
+ leveraging ACB's underlying cache for optimized serialization and
5
+ lifecycle management.
6
+ """
7
+
8
+ import hashlib
9
+ import typing as t
10
+ from dataclasses import dataclass
11
+
12
+ from aiocache import SimpleMemoryCache
13
+ from aiocache.serializers import PickleSerializer
14
+
15
+
16
+ @dataclass
17
+ class CacheStats:
18
+ """Cache statistics for monitoring."""
19
+
20
+ hits: int = 0
21
+ misses: int = 0
22
+ evictions: int = 0
23
+ total_entries: int = 0
24
+
25
+ @property
26
+ def hit_rate(self) -> float:
27
+ """Calculate cache hit rate percentage."""
28
+ total = self.hits + self.misses
29
+ return (self.hits / total * 100) if total > 0 else 0.0
30
+
31
+ def to_dict(self) -> dict[str, t.Any]:
32
+ """Convert stats to dictionary for reporting."""
33
+ return {
34
+ "hits": self.hits,
35
+ "misses": self.misses,
36
+ "evictions": self.evictions,
37
+ "total_entries": self.total_entries,
38
+ "hit_rate_percent": round(self.hit_rate, 2),
39
+ }
40
+
41
+
42
+ class ACBChunkCache:
43
+ """Async-native, ACB-backed chunk cache for the token optimizer."""
44
+
45
+ def __init__(self, ttl: int = 3600) -> None:
46
+ """Initialize chunk cache.
47
+
48
+ Args:
49
+ ttl: Default time-to-live in seconds (default: 1 hour)
50
+
51
+ """
52
+ self._cache = SimpleMemoryCache(
53
+ serializer=PickleSerializer(),
54
+ namespace="session_mgmt:chunks:",
55
+ )
56
+ self._cache.timeout = 0.0 # No operation timeout
57
+ self._ttl = ttl
58
+ self.stats = CacheStats()
59
+
60
+ async def set(self, key: str, value: t.Any, ttl: int | None = None) -> None:
61
+ """Store chunk data in cache asynchronously.
62
+
63
+ Args:
64
+ key: Cache key
65
+ value: Value to cache (ChunkResult)
66
+ ttl: Optional TTL override in seconds
67
+
68
+ """
69
+ effective_ttl = ttl or self._ttl
70
+ await self._cache.set(key, value, ttl=effective_ttl)
71
+ self.stats.total_entries += 1
72
+
73
+ async def get(self, key: str) -> t.Any | None:
74
+ """Retrieve chunk data from cache asynchronously.
75
+
76
+ Args:
77
+ key: Cache key
78
+
79
+ Returns:
80
+ Cached value or None if not found/expired
81
+
82
+ """
83
+ result = await self._cache.get(key)
84
+ if result is None:
85
+ self.stats.misses += 1
86
+ else:
87
+ self.stats.hits += 1
88
+ return result
89
+
90
+ async def delete(self, key: str) -> None:
91
+ """Delete chunk data from cache asynchronously.
92
+
93
+ Args:
94
+ key: Cache key to delete
95
+
96
+ """
97
+ await self._cache.delete(key)
98
+ self.stats.evictions += 1
99
+
100
+ async def clear(self) -> None:
101
+ """Clear all cached chunk data asynchronously."""
102
+ await self._cache.clear()
103
+ self.stats = CacheStats()
104
+
105
+ async def __contains__(self, key: str) -> bool:
106
+ """Check if key exists in cache asynchronously.
107
+
108
+ Args:
109
+ key: Cache key to check
110
+
111
+ Returns:
112
+ True if key exists and is not expired
113
+
114
+ """
115
+ result = await self._cache.exists(key)
116
+ return bool(result)
117
+
118
+ async def __getitem__(self, key: str) -> t.Any:
119
+ """Get item using dict syntax asynchronously.
120
+
121
+ Args:
122
+ key: Cache key
123
+
124
+ Returns:
125
+ Cached value
126
+
127
+ Raises:
128
+ KeyError: If key not found in cache
129
+
130
+ """
131
+ result = await self.get(key)
132
+ if result is None:
133
+ raise KeyError(key)
134
+ return result
135
+
136
+ async def __setitem__(self, key: str, value: t.Any) -> None:
137
+ """Set item using dict syntax asynchronously.
138
+
139
+ Args:
140
+ key: Cache key
141
+ value: Value to cache
142
+
143
+ """
144
+ await self.set(key, value)
145
+
146
+ async def __delitem__(self, key: str) -> None:
147
+ """Delete item using dict syntax asynchronously.
148
+
149
+ Args:
150
+ key: Cache key to delete
151
+
152
+ """
153
+ await self.delete(key)
154
+
155
+ async def keys(self) -> list[str]:
156
+ """Get all cache keys (not efficiently supported by SimpleMemoryCache)."""
157
+ return []
158
+
159
+ def get_stats(self) -> dict[str, t.Any]:
160
+ """Get cache statistics."""
161
+ return {"chunk_cache": self.stats.to_dict()}
162
+
163
+
164
+ class ACBHistoryCache:
165
+ """Async-native, ACB-backed history cache for analysis results."""
166
+
167
+ def __init__(self, ttl: float = 300.0) -> None:
168
+ """Initialize history cache.
169
+
170
+ Args:
171
+ ttl: Time-to-live in seconds (default: 5 minutes)
172
+
173
+ """
174
+ self._cache = SimpleMemoryCache(
175
+ serializer=PickleSerializer(),
176
+ namespace="session_mgmt:history:",
177
+ )
178
+ self._cache.timeout = 0.0
179
+ self._ttl = int(ttl)
180
+ self.stats = CacheStats()
181
+
182
+ def _generate_key(self, project: str, days: int) -> str:
183
+ """Generate cache key from parameters."""
184
+ params = f"{project}:{days}"
185
+ return hashlib.md5(params.encode(), usedforsecurity=False).hexdigest()
186
+
187
+ async def get(self, project: str, days: int) -> dict[str, t.Any] | None:
188
+ """Retrieve cached analysis result asynchronously.
189
+
190
+ Args:
191
+ project: Project name
192
+ days: Number of days analyzed
193
+
194
+ Returns:
195
+ Cached analysis dict or None if not found/expired
196
+
197
+ """
198
+ key = self._generate_key(project, days)
199
+ result: dict[str, t.Any] | None = await self._cache.get(key)
200
+ if result is None:
201
+ self.stats.misses += 1
202
+ else:
203
+ self.stats.hits += 1
204
+ return result
205
+
206
+ async def set(self, project: str, days: int, data: dict[str, t.Any]) -> None:
207
+ """Store analysis result in cache asynchronously.
208
+
209
+ Args:
210
+ project: Project name
211
+ days: Number of days analyzed
212
+ data: Analysis result dictionary
213
+
214
+ """
215
+ key = self._generate_key(project, days)
216
+ await self._cache.set(key, data, ttl=self._ttl)
217
+ self.stats.total_entries += 1
218
+
219
+ async def invalidate(self, project: str | None = None) -> None:
220
+ """Invalidate cache entries asynchronously.
221
+
222
+ Args:
223
+ project: Optional project name (if None, clears entire cache)
224
+
225
+ """
226
+ if project is None:
227
+ await self._cache.clear()
228
+ self.stats = CacheStats()
229
+ else:
230
+ import warnings
231
+
232
+ warnings.warn(
233
+ "ACB cache doesn't support selective invalidation by project. "
234
+ "Use invalidate(None) to clear all cached data.",
235
+ stacklevel=2,
236
+ )
237
+
238
+ async def size(self) -> int:
239
+ """Get number of cached entries (approximate)."""
240
+ return self.stats.total_entries
241
+
242
+ def get_stats(self) -> dict[str, int]:
243
+ """Get cache statistics."""
244
+ return {
245
+ "total_entries": self.stats.total_entries,
246
+ "hits": self.stats.hits,
247
+ "misses": self.stats.misses,
248
+ "expired_entries": 0,
249
+ "active_entries": self.stats.total_entries,
250
+ }
251
+
252
+
253
+ # Global cache instances
254
+ _chunk_cache: ACBChunkCache | None = None
255
+ _history_cache: ACBHistoryCache | None = None
256
+
257
+
258
+ def get_chunk_cache(ttl: int = 3600) -> ACBChunkCache:
259
+ """Get or create global async chunk cache instance."""
260
+ global _chunk_cache
261
+ if _chunk_cache is None:
262
+ _chunk_cache = ACBChunkCache(ttl=ttl)
263
+ return _chunk_cache
264
+
265
+
266
+ def get_history_cache(ttl: float = 300.0) -> ACBHistoryCache:
267
+ """Get or create global async history cache instance."""
268
+ global _history_cache
269
+ if _history_cache is None:
270
+ _history_cache = ACBHistoryCache(ttl=ttl)
271
+ return _history_cache
272
+
273
+
274
+ async def reset_caches() -> None:
275
+ """Reset global cache instances asynchronously."""
276
+ global _chunk_cache, _history_cache
277
+ if _chunk_cache:
278
+ await _chunk_cache.clear()
279
+ if _history_cache:
280
+ await _history_cache.invalidate()
281
+ _chunk_cache = None
282
+ _history_cache = None
@@ -0,0 +1,38 @@
1
+ """ACB adapter compatibility wrappers for session management.
2
+
3
+ This module provides compatibility wrappers that maintain the existing ReflectionDatabase
4
+ and KnowledgeGraphDatabase APIs while using ACB adapters under the hood.
5
+
6
+ Phase 1: Storage adapter integration for session state persistence
7
+ Phase 2.7 (Week 7 Day 1-5): Migration to ACB dependency injection
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from .session_storage_adapter import (
13
+ DEFAULT_SESSION_BUCKET,
14
+ SessionStorageAdapter,
15
+ get_default_storage_adapter,
16
+ )
17
+ from .storage_registry import (
18
+ SUPPORTED_BACKENDS,
19
+ configure_storage_buckets,
20
+ get_default_session_buckets,
21
+ get_storage_adapter,
22
+ register_storage_adapter,
23
+ )
24
+
25
+ __all__ = [
26
+ "DEFAULT_SESSION_BUCKET",
27
+ "SUPPORTED_BACKENDS",
28
+ # Reflection adapter (Phase 2.7)
29
+ "ReflectionDatabaseAdapter",
30
+ # Storage adapters (Phase 1)
31
+ "SessionStorageAdapter",
32
+ "configure_storage_buckets",
33
+ "get_default_session_buckets",
34
+ "get_default_storage_adapter",
35
+ "get_storage_adapter",
36
+ # Storage registry
37
+ "register_storage_adapter",
38
+ ]