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.
- session_buddy/__init__.py +32 -0
- session_buddy/__main__.py +23 -0
- session_buddy/acb_cache_adapter.py +282 -0
- session_buddy/adapters/__init__.py +38 -0
- session_buddy/adapters/knowledge_graph_adapter.py +715 -0
- session_buddy/adapters/knowledge_graph_adapter_acb_investigation.py +492 -0
- session_buddy/adapters/reflection_adapter.py +593 -0
- session_buddy/adapters/serverless_storage_adapter.py +336 -0
- session_buddy/adapters/session_storage_adapter.py +366 -0
- session_buddy/adapters/storage_registry.py +266 -0
- session_buddy/advanced_features.py +878 -0
- session_buddy/advanced_search.py +935 -0
- session_buddy/app_monitor.py +976 -0
- session_buddy/backends/__init__.py +25 -0
- session_buddy/backends/acb_cache_backend.py +280 -0
- session_buddy/backends/base.py +118 -0
- session_buddy/backends/local_backend.py +184 -0
- session_buddy/backends/redis_backend.py +260 -0
- session_buddy/backends/s3_backend.py +305 -0
- session_buddy/cli.py +482 -0
- session_buddy/config/feature_flags.py +107 -0
- session_buddy/context_manager.py +584 -0
- session_buddy/core/__init__.py +5 -0
- session_buddy/core/features.py +189 -0
- session_buddy/core/lifecycle/__init__.py +71 -0
- session_buddy/core/lifecycle/handoff.py +110 -0
- session_buddy/core/lifecycle/project_context.py +106 -0
- session_buddy/core/lifecycle/session_info.py +153 -0
- session_buddy/core/permissions.py +146 -0
- session_buddy/core/session_manager.py +799 -0
- session_buddy/crackerjack_integration.py +1097 -0
- session_buddy/di/__init__.py +409 -0
- session_buddy/di/config.py +99 -0
- session_buddy/di/constants.py +7 -0
- session_buddy/health_checks.py +366 -0
- session_buddy/interruption_manager.py +879 -0
- session_buddy/knowledge_graph_db.py +751 -0
- session_buddy/llm/__init__.py +44 -0
- session_buddy/llm/base.py +55 -0
- session_buddy/llm/models.py +75 -0
- session_buddy/llm/providers/__init__.py +19 -0
- session_buddy/llm/providers/anthropic_provider.py +140 -0
- session_buddy/llm/providers/gemini_provider.py +207 -0
- session_buddy/llm/providers/ollama_provider.py +302 -0
- session_buddy/llm/providers/openai_provider.py +156 -0
- session_buddy/llm/security.py +141 -0
- session_buddy/llm_providers.py +432 -0
- session_buddy/memory/conscious_agent.py +443 -0
- session_buddy/memory/entity_extractor.py +346 -0
- session_buddy/memory/file_context.py +33 -0
- session_buddy/memory/migration.py +339 -0
- session_buddy/memory/persistence.py +187 -0
- session_buddy/memory/schema_v2.py +194 -0
- session_buddy/memory_optimizer.py +799 -0
- session_buddy/multi_project_coordinator.py +699 -0
- session_buddy/natural_scheduler.py +616 -0
- session_buddy/parameter_models.py +734 -0
- session_buddy/quality_engine.py +1000 -0
- session_buddy/reflection_tools.py +999 -0
- session_buddy/resource_cleanup.py +392 -0
- session_buddy/search_enhanced.py +572 -0
- session_buddy/server.py +743 -0
- session_buddy/server_core.py +662 -0
- session_buddy/server_optimized.py +573 -0
- session_buddy/serverless_mode.py +327 -0
- session_buddy/session_commands.py +314 -0
- session_buddy/settings.py +485 -0
- session_buddy/shutdown_manager.py +427 -0
- session_buddy/team_knowledge.py +933 -0
- session_buddy/token_optimizer.py +601 -0
- session_buddy/tools/__init__.py +35 -0
- session_buddy/tools/access_log_tools.py +171 -0
- session_buddy/tools/agent_analyzer.py +237 -0
- session_buddy/tools/conscious_agent_tools.py +48 -0
- session_buddy/tools/crackerjack_tools.py +1402 -0
- session_buddy/tools/entity_extraction_tools.py +89 -0
- session_buddy/tools/feature_flags_tools.py +56 -0
- session_buddy/tools/health_tools.py +103 -0
- session_buddy/tools/history_cache.py +33 -0
- session_buddy/tools/hook_parser.py +216 -0
- session_buddy/tools/knowledge_graph_tools.py +701 -0
- session_buddy/tools/llm_tools.py +459 -0
- session_buddy/tools/memory_tools.py +566 -0
- session_buddy/tools/migration_tools.py +57 -0
- session_buddy/tools/monitoring_tools.py +625 -0
- session_buddy/tools/prompt_tools.py +452 -0
- session_buddy/tools/protocols.py +205 -0
- session_buddy/tools/quality_metrics.py +182 -0
- session_buddy/tools/recommendation_engine.py +516 -0
- session_buddy/tools/search_tools.py +802 -0
- session_buddy/tools/serverless_tools.py +440 -0
- session_buddy/tools/session_tools.py +897 -0
- session_buddy/tools/team_tools.py +377 -0
- session_buddy/tools/validated_memory_tools.py +537 -0
- session_buddy/trailing_period_removal_summary.md +64 -0
- session_buddy/types.py +41 -0
- session_buddy/utils/__init__.py +111 -0
- session_buddy/utils/crackerjack/__init__.py +18 -0
- session_buddy/utils/crackerjack/output_parser.py +527 -0
- session_buddy/utils/crackerjack/pattern_builder.py +85 -0
- session_buddy/utils/database_helpers.py +237 -0
- session_buddy/utils/database_pool.py +255 -0
- session_buddy/utils/error_handlers.py +188 -0
- session_buddy/utils/file_utils.py +246 -0
- session_buddy/utils/format_utils.py +305 -0
- session_buddy/utils/git_operations.py +520 -0
- session_buddy/utils/git_utils.py +164 -0
- session_buddy/utils/instance_managers.py +243 -0
- session_buddy/utils/lazy_imports.py +308 -0
- session_buddy/utils/logging.py +160 -0
- session_buddy/utils/logging_utils.py +8 -0
- session_buddy/utils/messages.py +329 -0
- session_buddy/utils/project_analysis.py +66 -0
- session_buddy/utils/quality/__init__.py +55 -0
- session_buddy/utils/quality/compaction.py +145 -0
- session_buddy/utils/quality/recommendations.py +52 -0
- session_buddy/utils/quality/summary.py +112 -0
- session_buddy/utils/quality_utils.py +264 -0
- session_buddy/utils/quality_utils_v2.py +885 -0
- session_buddy/utils/reflection_utils.py +234 -0
- session_buddy/utils/regex_patterns.py +762 -0
- session_buddy/utils/scheduler/__init__.py +23 -0
- session_buddy/utils/scheduler/models.py +59 -0
- session_buddy/utils/scheduler/time_parser.py +331 -0
- session_buddy/utils/search/__init__.py +31 -0
- session_buddy/utils/search/models.py +48 -0
- session_buddy/utils/search/utilities.py +129 -0
- session_buddy/utils/server_helpers.py +540 -0
- session_buddy/utils/tool_wrapper.py +379 -0
- session_buddy/worktree_manager.py +734 -0
- session_buddy-0.10.0.dist-info/METADATA +325 -0
- session_buddy-0.10.0.dist-info/RECORD +135 -0
- session_buddy-0.10.0.dist-info/WHEEL +4 -0
- session_buddy-0.10.0.dist-info/entry_points.txt +3 -0
- 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
|
+
]
|