spatial-memory-mcp 1.5.3__py3-none-any.whl → 1.6.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.
Potentially problematic release.
This version of spatial-memory-mcp might be problematic. Click here for more details.
- spatial_memory/__init__.py +1 -1
- spatial_memory/__main__.py +241 -2
- spatial_memory/adapters/lancedb_repository.py +74 -5
- spatial_memory/config.py +10 -2
- spatial_memory/core/__init__.py +9 -0
- spatial_memory/core/connection_pool.py +41 -3
- spatial_memory/core/consolidation_strategies.py +402 -0
- spatial_memory/core/database.py +774 -918
- spatial_memory/core/db_idempotency.py +242 -0
- spatial_memory/core/db_indexes.py +575 -0
- spatial_memory/core/db_migrations.py +584 -0
- spatial_memory/core/db_search.py +509 -0
- spatial_memory/core/db_versioning.py +177 -0
- spatial_memory/core/embeddings.py +65 -18
- spatial_memory/core/errors.py +75 -3
- spatial_memory/core/filesystem.py +178 -0
- spatial_memory/core/models.py +4 -0
- spatial_memory/core/rate_limiter.py +26 -9
- spatial_memory/core/response_types.py +497 -0
- spatial_memory/core/validation.py +86 -2
- spatial_memory/factory.py +407 -0
- spatial_memory/migrations/__init__.py +40 -0
- spatial_memory/ports/repositories.py +52 -2
- spatial_memory/server.py +131 -189
- spatial_memory/services/export_import.py +61 -43
- spatial_memory/services/lifecycle.py +397 -122
- spatial_memory/services/memory.py +2 -2
- spatial_memory/services/spatial.py +129 -46
- {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/METADATA +83 -3
- spatial_memory_mcp-1.6.0.dist-info/RECORD +54 -0
- spatial_memory_mcp-1.5.3.dist-info/RECORD +0 -44
- {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/WHEEL +0 -0
- {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/entry_points.txt +0 -0
- {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -63,6 +63,28 @@ except ImportError:
|
|
|
63
63
|
UMAP_AVAILABLE = False
|
|
64
64
|
logger.debug("UMAP not available - visualize operation will be disabled")
|
|
65
65
|
|
|
66
|
+
try:
|
|
67
|
+
from scipy.spatial.distance import cdist
|
|
68
|
+
|
|
69
|
+
SCIPY_AVAILABLE = True
|
|
70
|
+
except ImportError:
|
|
71
|
+
SCIPY_AVAILABLE = False
|
|
72
|
+
logger.debug("scipy not available - using fallback for similarity calculations")
|
|
73
|
+
|
|
74
|
+
# Common stop words for keyword extraction (module-level to avoid recreation)
|
|
75
|
+
_STOP_WORDS: frozenset[str] = frozenset({
|
|
76
|
+
"the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
|
|
77
|
+
"have", "has", "had", "do", "does", "did", "will", "would", "could",
|
|
78
|
+
"should", "may", "might", "must", "can", "to", "of", "in", "for",
|
|
79
|
+
"on", "with", "at", "by", "from", "as", "into", "through", "during",
|
|
80
|
+
"before", "after", "above", "below", "between", "under", "again",
|
|
81
|
+
"further", "then", "once", "here", "there", "when", "where", "why",
|
|
82
|
+
"how", "all", "each", "few", "more", "most", "other", "some", "such",
|
|
83
|
+
"no", "nor", "not", "only", "own", "same", "so", "than", "too",
|
|
84
|
+
"very", "just", "also", "now", "and", "but", "or", "if", "it", "its",
|
|
85
|
+
"this", "that", "these", "those", "i", "you", "he", "she", "we", "they",
|
|
86
|
+
})
|
|
87
|
+
|
|
66
88
|
if TYPE_CHECKING:
|
|
67
89
|
from spatial_memory.ports.repositories import (
|
|
68
90
|
EmbeddingServiceProtocol,
|
|
@@ -212,11 +234,12 @@ class SpatialService:
|
|
|
212
234
|
)
|
|
213
235
|
|
|
214
236
|
# Find nearest memories for each interpolation point
|
|
215
|
-
# Use batch search for efficiency
|
|
237
|
+
# Use batch search for efficiency, include vectors to avoid N+1 queries
|
|
216
238
|
search_results = self._batch_vector_search(
|
|
217
239
|
interpolated_vectors,
|
|
218
240
|
limit_per_query=self._config.journey_neighbors_per_step,
|
|
219
241
|
namespace=namespace,
|
|
242
|
+
include_vector=True, # Include vectors to avoid follow-up queries
|
|
220
243
|
)
|
|
221
244
|
|
|
222
245
|
# Build journey steps
|
|
@@ -230,9 +253,15 @@ class SpatialService:
|
|
|
230
253
|
distance_to_path = float("inf")
|
|
231
254
|
if neighbors:
|
|
232
255
|
for neighbor in neighbors:
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
256
|
+
# Use vector from search result (included via include_vector=True)
|
|
257
|
+
if neighbor.vector is not None:
|
|
258
|
+
neighbor_vec = np.array(neighbor.vector, dtype=np.float32)
|
|
259
|
+
dist = self._cosine_distance(interp_vec, neighbor_vec)
|
|
260
|
+
else:
|
|
261
|
+
# Fallback if vector not included (shouldn't happen)
|
|
262
|
+
dist = self._cosine_distance(
|
|
263
|
+
interp_vec, self._get_vector_for_memory(neighbor.id)
|
|
264
|
+
)
|
|
236
265
|
if dist < distance_to_path:
|
|
237
266
|
distance_to_path = dist
|
|
238
267
|
steps_with_memories += 1
|
|
@@ -330,10 +359,12 @@ class SpatialService:
|
|
|
330
359
|
|
|
331
360
|
for step_num in range(actual_steps):
|
|
332
361
|
# Find candidates from current position
|
|
362
|
+
# Include vectors to avoid follow-up get_with_vector queries
|
|
333
363
|
neighbors = self._repo.search(
|
|
334
364
|
current_vector,
|
|
335
365
|
limit=self._config.wander_candidates_per_step + len(visited_ids),
|
|
336
366
|
namespace=namespace,
|
|
367
|
+
include_vector=True,
|
|
337
368
|
)
|
|
338
369
|
|
|
339
370
|
# Filter out recently visited
|
|
@@ -358,12 +389,16 @@ class SpatialService:
|
|
|
358
389
|
candidates, actual_temp
|
|
359
390
|
)
|
|
360
391
|
|
|
361
|
-
#
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
392
|
+
# Get vector from search result (included via include_vector=True)
|
|
393
|
+
if next_memory.vector is not None:
|
|
394
|
+
next_vector = np.array(next_memory.vector, dtype=np.float32)
|
|
395
|
+
else:
|
|
396
|
+
# Fallback if vector not included (shouldn't happen)
|
|
397
|
+
next_result = self._repo.get_with_vector(next_memory.id)
|
|
398
|
+
if next_result is None:
|
|
399
|
+
logger.warning(f"Memory {next_memory.id} disappeared during wander")
|
|
400
|
+
break
|
|
401
|
+
_, next_vector = next_result
|
|
367
402
|
|
|
368
403
|
step_distance = self._cosine_distance(prev_vector, next_vector)
|
|
369
404
|
total_distance += step_distance
|
|
@@ -665,18 +700,26 @@ class SpatialService:
|
|
|
665
700
|
# Build edges if requested
|
|
666
701
|
edges: list[VisualizationEdge] = []
|
|
667
702
|
if include_edges:
|
|
668
|
-
# Calculate pairwise similarities
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
703
|
+
# Calculate pairwise similarities using vectorized operations
|
|
704
|
+
similarity_matrix = self._compute_pairwise_similarities(vectors)
|
|
705
|
+
threshold = self._config.visualize_similarity_threshold
|
|
706
|
+
|
|
707
|
+
# Extract upper triangle indices where similarity >= threshold
|
|
708
|
+
# (upper triangle avoids duplicate edges)
|
|
709
|
+
upper_tri_indices = np.triu_indices(len(vectors), k=1)
|
|
710
|
+
similarities = similarity_matrix[upper_tri_indices]
|
|
711
|
+
|
|
712
|
+
# Filter by threshold and create edges
|
|
713
|
+
mask = similarities >= threshold
|
|
714
|
+
for idx in np.where(mask)[0]:
|
|
715
|
+
i, j = upper_tri_indices[0][idx], upper_tri_indices[1][idx]
|
|
716
|
+
edges.append(
|
|
717
|
+
VisualizationEdge(
|
|
718
|
+
from_id=nodes[i].id,
|
|
719
|
+
to_id=nodes[j].id,
|
|
720
|
+
weight=float(similarities[idx]),
|
|
721
|
+
)
|
|
722
|
+
)
|
|
680
723
|
|
|
681
724
|
# Calculate bounds
|
|
682
725
|
x_coords = [n.x for n in nodes]
|
|
@@ -783,25 +826,50 @@ class SpatialService:
|
|
|
783
826
|
vectors: list[np.ndarray],
|
|
784
827
|
limit_per_query: int,
|
|
785
828
|
namespace: str | None,
|
|
829
|
+
include_vector: bool = False,
|
|
786
830
|
) -> list[list[MemoryResult]]:
|
|
787
|
-
"""Perform batch vector search.
|
|
831
|
+
"""Perform batch vector search using repository's native batch capability.
|
|
788
832
|
|
|
789
|
-
|
|
790
|
-
|
|
833
|
+
Uses the repository's batch_vector_search for efficient multi-query
|
|
834
|
+
searches in a single database operation.
|
|
791
835
|
|
|
792
836
|
Args:
|
|
793
837
|
vectors: List of query vectors.
|
|
794
838
|
limit_per_query: Results per query.
|
|
795
839
|
namespace: Optional namespace filter.
|
|
840
|
+
include_vector: Whether to include embedding vectors in results.
|
|
841
|
+
Defaults to False to reduce response size.
|
|
796
842
|
|
|
797
843
|
Returns:
|
|
798
|
-
List of result lists.
|
|
844
|
+
List of result lists. If include_vector=True, each MemoryResult
|
|
845
|
+
includes its embedding vector.
|
|
799
846
|
"""
|
|
800
|
-
#
|
|
847
|
+
# Use native batch search for efficiency
|
|
848
|
+
raw_results = self._repo.batch_vector_search(
|
|
849
|
+
query_vectors=vectors,
|
|
850
|
+
limit_per_query=limit_per_query,
|
|
851
|
+
namespace=namespace,
|
|
852
|
+
include_vector=include_vector,
|
|
853
|
+
)
|
|
854
|
+
|
|
855
|
+
# Convert raw dict results to MemoryResult objects
|
|
801
856
|
results: list[list[MemoryResult]] = []
|
|
802
|
-
for
|
|
803
|
-
|
|
804
|
-
|
|
857
|
+
for query_results in raw_results:
|
|
858
|
+
memory_results: list[MemoryResult] = []
|
|
859
|
+
for record in query_results:
|
|
860
|
+
memory_result = MemoryResult(
|
|
861
|
+
id=record["id"],
|
|
862
|
+
content=record["content"],
|
|
863
|
+
similarity=record.get("similarity", 0.0),
|
|
864
|
+
namespace=record.get("namespace", "default"),
|
|
865
|
+
tags=record.get("tags", []),
|
|
866
|
+
importance=record.get("importance", 0.5),
|
|
867
|
+
created_at=record.get("created_at"),
|
|
868
|
+
metadata=record.get("metadata", {}),
|
|
869
|
+
vector=record.get("vector") if include_vector else None,
|
|
870
|
+
)
|
|
871
|
+
memory_results.append(memory_result)
|
|
872
|
+
results.append(memory_results)
|
|
805
873
|
return results
|
|
806
874
|
|
|
807
875
|
def _get_vector_for_memory(self, memory_id: str) -> np.ndarray:
|
|
@@ -838,6 +906,35 @@ class SpatialService:
|
|
|
838
906
|
similarity = np.dot(vec1, vec2) / (norm1 * norm2)
|
|
839
907
|
return float(1.0 - similarity)
|
|
840
908
|
|
|
909
|
+
def _compute_pairwise_similarities(self, vectors: np.ndarray) -> np.ndarray:
|
|
910
|
+
"""Compute pairwise cosine similarities using vectorized operations.
|
|
911
|
+
|
|
912
|
+
Uses scipy.cdist if available for optimal performance, otherwise
|
|
913
|
+
falls back to numpy matrix operations.
|
|
914
|
+
|
|
915
|
+
Args:
|
|
916
|
+
vectors: 2D array of shape (n_vectors, embedding_dim).
|
|
917
|
+
|
|
918
|
+
Returns:
|
|
919
|
+
Symmetric similarity matrix of shape (n_vectors, n_vectors).
|
|
920
|
+
Values range from -1 (opposite) to 1 (identical).
|
|
921
|
+
"""
|
|
922
|
+
# Normalize vectors to unit length
|
|
923
|
+
norms = np.linalg.norm(vectors, axis=1, keepdims=True)
|
|
924
|
+
# Avoid division by zero for zero vectors
|
|
925
|
+
norms = np.where(norms < 1e-10, 1.0, norms)
|
|
926
|
+
normalized = vectors / norms
|
|
927
|
+
|
|
928
|
+
if SCIPY_AVAILABLE:
|
|
929
|
+
# scipy.cdist with cosine metric returns distances (1 - similarity)
|
|
930
|
+
distances = cdist(normalized, normalized, metric="cosine")
|
|
931
|
+
similarities = 1.0 - distances
|
|
932
|
+
else:
|
|
933
|
+
# Fallback: use numpy dot product (A @ A.T for normalized vectors)
|
|
934
|
+
similarities = normalized @ normalized.T
|
|
935
|
+
|
|
936
|
+
return similarities
|
|
937
|
+
|
|
841
938
|
def _temperature_select(
|
|
842
939
|
self,
|
|
843
940
|
candidates: list[MemoryResult],
|
|
@@ -888,23 +985,9 @@ class SpatialService:
|
|
|
888
985
|
List of top keywords.
|
|
889
986
|
"""
|
|
890
987
|
# Simple keyword extraction using word frequency
|
|
891
|
-
#
|
|
892
|
-
stop_words = {
|
|
893
|
-
"the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
|
|
894
|
-
"have", "has", "had", "do", "does", "did", "will", "would", "could",
|
|
895
|
-
"should", "may", "might", "must", "can", "to", "of", "in", "for",
|
|
896
|
-
"on", "with", "at", "by", "from", "as", "into", "through", "during",
|
|
897
|
-
"before", "after", "above", "below", "between", "under", "again",
|
|
898
|
-
"further", "then", "once", "here", "there", "when", "where", "why",
|
|
899
|
-
"how", "all", "each", "few", "more", "most", "other", "some", "such",
|
|
900
|
-
"no", "nor", "not", "only", "own", "same", "so", "than", "too",
|
|
901
|
-
"very", "just", "also", "now", "and", "but", "or", "if", "it", "its",
|
|
902
|
-
"this", "that", "these", "those", "i", "you", "he", "she", "we", "they",
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
# Tokenize and filter
|
|
988
|
+
# Tokenize and filter using module-level stop words
|
|
906
989
|
words = re.findall(r"\b[a-zA-Z]+\b", text.lower())
|
|
907
|
-
filtered = [w for w in words if w not in
|
|
990
|
+
filtered = [w for w in words if w not in _STOP_WORDS and len(w) > 2]
|
|
908
991
|
|
|
909
992
|
# Count frequencies
|
|
910
993
|
counter = Counter(filtered)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spatial-memory-mcp
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
4
4
|
Summary: Spatial bidirectional persistent memory MCP server for LLMs - vector-based semantic memory as a navigable landscape
|
|
5
5
|
Project-URL: Homepage, https://github.com/arman-tech/spatial-memory-mcp
|
|
6
6
|
Project-URL: Repository, https://github.com/arman-tech/spatial-memory-mcp
|
|
@@ -44,7 +44,7 @@ Description-Content-Type: text/markdown
|
|
|
44
44
|
|
|
45
45
|
A vector-based spatial memory system that treats knowledge as a navigable landscape, not a filing cabinet.
|
|
46
46
|
|
|
47
|
-
> **Project Status**: All phases complete. Production-ready with
|
|
47
|
+
> **Project Status**: All phases complete. Production-ready with 1360 tests passing.
|
|
48
48
|
|
|
49
49
|
## Supported Platforms
|
|
50
50
|
|
|
@@ -63,6 +63,42 @@ Spatial Memory MCP Server provides persistent, semantic memory for LLMs through
|
|
|
63
63
|
- **Visual Understanding**: Generate Mermaid/SVG/JSON visualizations of your knowledge space
|
|
64
64
|
- **Hybrid Search**: Combine vector similarity with full-text search
|
|
65
65
|
|
|
66
|
+
## Why Spatial Memory?
|
|
67
|
+
|
|
68
|
+
### Zero Cognitive Load
|
|
69
|
+
**You never think about memory. Claude handles everything automatically.**
|
|
70
|
+
|
|
71
|
+
- Auto-loads relevant context at session start
|
|
72
|
+
- Recognizes memory-worthy moments and asks "Save this? y/n"
|
|
73
|
+
- Synthesizes answers naturally—no raw JSON, no memory IDs
|
|
74
|
+
- MCP instructions inject automatically—zero configuration
|
|
75
|
+
|
|
76
|
+
### Cognitive Architecture, Not Storage
|
|
77
|
+
Other memory systems store embeddings. Spatial Memory implements how memory actually works:
|
|
78
|
+
|
|
79
|
+
- **Decay**: Memories fade over time (Ebbinghaus forgetting curve)
|
|
80
|
+
- **Reinforcement**: Frequently accessed memories grow stronger
|
|
81
|
+
- **Consolidation**: Similar memories merge intelligently
|
|
82
|
+
- **Extraction**: Auto-capture facts, decisions, patterns from conversations
|
|
83
|
+
|
|
84
|
+
### Spatial Navigation (Unique Innovation)
|
|
85
|
+
Navigate knowledge like a landscape, not a filing cabinet:
|
|
86
|
+
|
|
87
|
+
| Tool | What It Does |
|
|
88
|
+
|------|-------------|
|
|
89
|
+
| **Journey** | SLERP between two memories—discover what's conceptually in between |
|
|
90
|
+
| **Wander** | Random walk exploration—find unexpected connections |
|
|
91
|
+
| **Regions** | HDBSCAN clustering—see how your knowledge self-organizes |
|
|
92
|
+
| **Visualize** | UMAP projection—view your memory space in 2D/3D |
|
|
93
|
+
|
|
94
|
+
### 21 Tools vs. 3-6 in Competitors
|
|
95
|
+
Full lifecycle management: core operations, spatial navigation, memory lifecycle, hybrid search, namespace management, data import/export, and health/stats monitoring.
|
|
96
|
+
|
|
97
|
+
### Enterprise-Ready
|
|
98
|
+
Connection pooling, circuit breakers, per-agent rate limiting, request tracing, response caching, and defense-in-depth security (path traversal prevention, SQL injection detection, input validation).
|
|
99
|
+
|
|
100
|
+
> *See [MARKETING.md](MARKETING.md) for the complete comparison with competitors.*
|
|
101
|
+
|
|
66
102
|
## Features
|
|
67
103
|
|
|
68
104
|
- **21 MCP tools** across 4 categories (core, spatial, lifecycle, utility)
|
|
@@ -72,7 +108,7 @@ Spatial Memory MCP Server provides persistent, semantic memory for LLMs through
|
|
|
72
108
|
- **ONNX Runtime** by default for 2-3x faster embeddings
|
|
73
109
|
- **Enterprise features**: Connection pooling, retry logic, batch operations
|
|
74
110
|
- **Comprehensive security**: Path validation, SQL injection prevention, input sanitization
|
|
75
|
-
- **
|
|
111
|
+
- **1360 tests** including security edge cases
|
|
76
112
|
|
|
77
113
|
## Roadmap
|
|
78
114
|
|
|
@@ -130,6 +166,31 @@ If ONNX shows as unavailable, reinstall with:
|
|
|
130
166
|
pip install --force-reinstall "sentence-transformers[onnx]"
|
|
131
167
|
```
|
|
132
168
|
|
|
169
|
+
### Optional Performance Dependencies
|
|
170
|
+
|
|
171
|
+
For best performance, install these optional dependencies:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# ONNX Runtime - 2-3x faster embeddings, 60% less memory
|
|
175
|
+
pip install onnxruntime
|
|
176
|
+
|
|
177
|
+
# Or install with sentence-transformers ONNX support
|
|
178
|
+
pip install "sentence-transformers[onnx]"
|
|
179
|
+
|
|
180
|
+
# scipy - Optimized pairwise similarity calculations
|
|
181
|
+
# Used by visualize, regions, and consolidate operations
|
|
182
|
+
pip install scipy
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Performance comparison:**
|
|
186
|
+
|
|
187
|
+
| Component | Without | With | Benefit |
|
|
188
|
+
|-----------|---------|------|---------|
|
|
189
|
+
| ONNX Runtime | PyTorch inference | ONNX inference | 2-3x faster embeddings |
|
|
190
|
+
| scipy | numpy matrix ops | scipy.cdist | Faster similarity calculations |
|
|
191
|
+
|
|
192
|
+
Both are optional - the system includes fallbacks that use numpy when these aren't available.
|
|
193
|
+
|
|
133
194
|
## Configuration
|
|
134
195
|
|
|
135
196
|
Copy `.env.example` to `.env` and customize:
|
|
@@ -292,6 +353,25 @@ Export all memories to parquet format
|
|
|
292
353
|
- **Error Sanitization**: Internal errors return reference IDs, not stack traces
|
|
293
354
|
- **Secure Credential Handling**: API keys stored as SecretStr
|
|
294
355
|
|
|
356
|
+
## Deployment Considerations
|
|
357
|
+
|
|
358
|
+
### Network Filesystems (NFS/SMB/CIFS)
|
|
359
|
+
|
|
360
|
+
Spatial Memory uses file-based locking to prevent data corruption when multiple processes access the same storage. **File locking does not work reliably on network filesystems** such as NFS, SMB/CIFS, or SSHFS.
|
|
361
|
+
|
|
362
|
+
If the storage path is on a network filesystem, you will see a warning at startup:
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
WARNING: Storage path appears to be on a network filesystem (nfs).
|
|
366
|
+
File-based locking does not work reliably on network filesystems.
|
|
367
|
+
Running multiple instances against this storage may cause data corruption.
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**Recommendations:**
|
|
371
|
+
1. **Use local storage** (default: `./.spatial-memory`) for reliable operation
|
|
372
|
+
2. **Single instance only**: If you must use network storage, ensure only one MCP server instance accesses it
|
|
373
|
+
3. **Acknowledge the risk**: Set `SPATIAL_MEMORY_ACKNOWLEDGE_NETWORK_FS_RISK=true` to suppress the warning
|
|
374
|
+
|
|
295
375
|
## Development
|
|
296
376
|
|
|
297
377
|
### Running Tests
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
spatial_memory/__init__.py,sha256=5llnvvlYGS28SmMQcE_DhSSTaFyvhh0BASb-ZHX4Z1o,2154
|
|
2
|
+
spatial_memory/__main__.py,sha256=PaB4lkEBePNFCFDwjZo2mtQiWCNbK6U0fZ8jsQ9luNE,7761
|
|
3
|
+
spatial_memory/config.py,sha256=SvG67Z8Hjw0XAFzVn59lLm-_Pz5dzL-c4Dli3_mtG0M,22537
|
|
4
|
+
spatial_memory/factory.py,sha256=iuVKeE0q9SrDo816k2H744nELFeq7vVOdg4puHxCFOM,15806
|
|
5
|
+
spatial_memory/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
spatial_memory/server.py,sha256=4a4WbS_Us0OiLfRyt5Mj3WU9rMCdMRbU6ziWajG-72I,45779
|
|
7
|
+
spatial_memory/verify.py,sha256=4p4KQYRUBrKGax66n629hvb9Ul8sR2yXXnfyZLpNk-o,3939
|
|
8
|
+
spatial_memory/adapters/__init__.py,sha256=xNPQCOYVsTP2ogMEcYGbxGJYH9pdksB66MZ7ctK6KbM,187
|
|
9
|
+
spatial_memory/adapters/lancedb_repository.py,sha256=NwZQ-SGPTe82cFbOYtYERPRvY3eujz5iCd7EOaLiDfE,31247
|
|
10
|
+
spatial_memory/core/__init__.py,sha256=wG6fws4AIF3X1vJdWA2_w2bMQo4ZXez_BYtcYvFGQvY,3033
|
|
11
|
+
spatial_memory/core/cache.py,sha256=QqG0hhpaDH0mzBLIEinGP3WkKsb70QfCLMGpptguWIM,10038
|
|
12
|
+
spatial_memory/core/circuit_breaker.py,sha256=zxqnOWiAnx_S7oX44UY57ihpk7V27fzW6rYgBn1BWp8,10734
|
|
13
|
+
spatial_memory/core/connection_pool.py,sha256=ienTFQ-tFYwkaWD2_lcs9T8uYXL45OMpzCX5V-l_MMk,7617
|
|
14
|
+
spatial_memory/core/consolidation_strategies.py,sha256=_PGdVuz4Kkf96cdIEPieGTOfubgOc6PoUYuXfJRwBd8,12805
|
|
15
|
+
spatial_memory/core/database.py,sha256=3Llo2FLznQA2zUYf5r1JFnht61bPZQGTGeZ2IVhxDMI,118227
|
|
16
|
+
spatial_memory/core/db_idempotency.py,sha256=B0EYdZFZYmQ7s101RviswySta7Qp7TZ2fiqWES_djyw,7978
|
|
17
|
+
spatial_memory/core/db_indexes.py,sha256=p1glBuna81yY8bu8hhJkR6AhuzeZgaAaeKnsd3Oe4No,20115
|
|
18
|
+
spatial_memory/core/db_migrations.py,sha256=x-_dXZrtfZZQwb4d3ZW32zw1-CzbDLC7Y33fdsvQM5Y,19138
|
|
19
|
+
spatial_memory/core/db_search.py,sha256=XnNpqI2oto9EKbmp7bYBxeaxGfblJicR9KazvZKfhbg,19866
|
|
20
|
+
spatial_memory/core/db_versioning.py,sha256=7LGWQO6EiwIgw-C5e81xG4jEO34b5y95Ag6uoVrU7Xw,5984
|
|
21
|
+
spatial_memory/core/embeddings.py,sha256=g_C8rmrNH8qTroPcg-aYJo5Z6NR_YqGN050Iryytx5c,20892
|
|
22
|
+
spatial_memory/core/errors.py,sha256=mGQlPNNiNOdErYPXdEQXM1_-IeueUB_jtgdt8P8lzUQ,8799
|
|
23
|
+
spatial_memory/core/file_security.py,sha256=kHIYEnZIRFz94FxCJ7oOHiaihgQRB1rsOHHmJprHNhU,25766
|
|
24
|
+
spatial_memory/core/filesystem.py,sha256=aE8BvM8tyIMbjtaiyG0Si0F1c85jxAwa3IM5I_kvkME,5602
|
|
25
|
+
spatial_memory/core/health.py,sha256=Xq9TYfmBN3YLjYOrpFWtvbR1-fQbSrP1oorSVjRHOSg,9145
|
|
26
|
+
spatial_memory/core/helpers.py,sha256=nxLXGfkpydWzEgMj8PkdX9gVvybN2aCH-CfbEkq6U_w,1931
|
|
27
|
+
spatial_memory/core/import_security.py,sha256=DiG0BsX65JGGf6B1T855SVz1TZB1ViI3JXRi1uW03sQ,13296
|
|
28
|
+
spatial_memory/core/lifecycle_ops.py,sha256=P8jc4JGBF39ayNikgLu0I3kGcJ3ph0VsvAHSxjp35FI,35836
|
|
29
|
+
spatial_memory/core/logging.py,sha256=JfFRzHmhZ2BPNSJiKIHGjfUeskFVo8Bj7nOKznvv0kU,6542
|
|
30
|
+
spatial_memory/core/metrics.py,sha256=8B26sAd2y6xrpaJr8mNgOAMzAZDd1uXOvAGxz_1nhfY,5383
|
|
31
|
+
spatial_memory/core/models.py,sha256=VX61h5_pnsIQ5w5LjpElhVTW4UAa0RKadnrtLLOQb94,17353
|
|
32
|
+
spatial_memory/core/rate_limiter.py,sha256=5A3YI6C0_YrWZeSBBxF7Eu5HUD8rodS45301730doF0,10582
|
|
33
|
+
spatial_memory/core/response_types.py,sha256=VhfQLpTxgdJf3CYPtQALvh4KmaUbHzVAT_qtRVtoQgs,10603
|
|
34
|
+
spatial_memory/core/security.py,sha256=fjIYqsyzK4qqm7sI8FNEE2xx9WjNJnrAslOBLVRVwgs,19759
|
|
35
|
+
spatial_memory/core/spatial_ops.py,sha256=_xNrZzrbL7w2uAMJkQZEtTMjERQpo04cuSUoTNebiew,13360
|
|
36
|
+
spatial_memory/core/tracing.py,sha256=9O3WdUJfCl2sohYWlaQETrCO7_P_N3qY_MqSAnpQPl0,8438
|
|
37
|
+
spatial_memory/core/utils.py,sha256=YvvU3EbbAicR732LkHMM5-u4wvBaJ4G9DigBaB2CoI4,3438
|
|
38
|
+
spatial_memory/core/validation.py,sha256=A8a5PF7X8Veg8S176UFEqkZDBlWILbQM-5wtAMOgG3U,13476
|
|
39
|
+
spatial_memory/migrations/__init__.py,sha256=wljoV_u2PPx-dH6JOPmjEP5xEbwoM9HQ1WYDZr7PW58,1072
|
|
40
|
+
spatial_memory/ports/__init__.py,sha256=Lq9ht9AS4VwPbMojtd_FYkA7lUuCXmYHwv6sweJi9AQ,243
|
|
41
|
+
spatial_memory/ports/repositories.py,sha256=oJMU7UHoj4YudyeOQaSkI9A2z81L3Vn2q7hm3RILfXI,19920
|
|
42
|
+
spatial_memory/services/__init__.py,sha256=epaF3aHxK2sgGVMp6rS_fxMMAvDVPxjaWm1n4hKOMWU,1564
|
|
43
|
+
spatial_memory/services/export_import.py,sha256=2vZnFvX1deV-Zdj0HGkc2My8Oy1BrFJL8Peep25iUKI,38190
|
|
44
|
+
spatial_memory/services/lifecycle.py,sha256=asxFBp06qfnaZJpAph6Dm6i7kN1cREXuoopkjuOMvwc,42937
|
|
45
|
+
spatial_memory/services/memory.py,sha256=MZ9NMNXBRYEA39vzT5gAB7PXJrGFwC-D98SLZe7Z50Q,12944
|
|
46
|
+
spatial_memory/services/spatial.py,sha256=3UMPm4mRQ42oXNwLUEYp4SAinnGX4dwOnWaK9CkVViA,42552
|
|
47
|
+
spatial_memory/services/utility.py,sha256=89rn1gNJwNQIhrWjmVS3RKP5AQuCvjswFeefMp7yK-4,14950
|
|
48
|
+
spatial_memory/tools/__init__.py,sha256=ZhFZp5j8HA4Qx5pVcRmgTcBbqY3X5TmgMNpSkyAMqJA,127
|
|
49
|
+
spatial_memory/tools/definitions.py,sha256=Ueg_BrRGJcp_jnQD95DiYFPkxU419XPkbjzQFDG3jtY,25397
|
|
50
|
+
spatial_memory_mcp-1.6.0.dist-info/METADATA,sha256=SKMn9h_8wYhMK45Vh5iqkH8-HSyjaf5r96Fkyv0tBek,15438
|
|
51
|
+
spatial_memory_mcp-1.6.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
52
|
+
spatial_memory_mcp-1.6.0.dist-info/entry_points.txt,sha256=nJ4RJBB9SvhNktJdikcAS27fSwtKekpgPR4GTy2r1cE,64
|
|
53
|
+
spatial_memory_mcp-1.6.0.dist-info/licenses/LICENSE,sha256=g65vrroU3yJxekbYV8xmDj7KFrXAg89eCM8vcWrpKmU,1095
|
|
54
|
+
spatial_memory_mcp-1.6.0.dist-info/RECORD,,
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
spatial_memory/__init__.py,sha256=uunMrbEkIDKaLXB2nFaBQgIQZBGMaMuwQxBG_OKd3Mk,2154
|
|
2
|
-
spatial_memory/__main__.py,sha256=bhoAnPQkuD-jAHavxQEbv3JxpsbWB9qvWlYEWk0_TWQ,288
|
|
3
|
-
spatial_memory/config.py,sha256=rOUbKid57dCe2yAAOlw0K-5bQlK3UzyDSrMxqa5_Wrc,22122
|
|
4
|
-
spatial_memory/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
spatial_memory/server.py,sha256=_C2NMd3ZasWftFbxrRy7Y2W9vgiJ78wIvKr4iQ_JZf8,50768
|
|
6
|
-
spatial_memory/verify.py,sha256=4p4KQYRUBrKGax66n629hvb9Ul8sR2yXXnfyZLpNk-o,3939
|
|
7
|
-
spatial_memory/adapters/__init__.py,sha256=xNPQCOYVsTP2ogMEcYGbxGJYH9pdksB66MZ7ctK6KbM,187
|
|
8
|
-
spatial_memory/adapters/lancedb_repository.py,sha256=nFC3I_biNFMC546hoJLnqbTCgk5LSlyfnz3QDC77fX8,28430
|
|
9
|
-
spatial_memory/core/__init__.py,sha256=VbQifJwVu-HY-HzfHVQvIDQbVgiMFRjvSw7xpTcxE8Q,2652
|
|
10
|
-
spatial_memory/core/cache.py,sha256=QqG0hhpaDH0mzBLIEinGP3WkKsb70QfCLMGpptguWIM,10038
|
|
11
|
-
spatial_memory/core/circuit_breaker.py,sha256=zxqnOWiAnx_S7oX44UY57ihpk7V27fzW6rYgBn1BWp8,10734
|
|
12
|
-
spatial_memory/core/connection_pool.py,sha256=-mD8nvgiKpVlycMw24FNaEh3E1XA4hXNkaaQW023I40,6083
|
|
13
|
-
spatial_memory/core/database.py,sha256=PTy6-SZsEGjvQm2VU93NJAIJ3yHOAgwcBrLqupTwnD0,121551
|
|
14
|
-
spatial_memory/core/embeddings.py,sha256=M1fjBuY_e2LQ7kb5GjWQ55T3w832YoPXbO3pNciP0mA,18606
|
|
15
|
-
spatial_memory/core/errors.py,sha256=yqLt9KqE5iEBvKha1wZWNtN_QaVYcX9YPpiRmeIN11A,6551
|
|
16
|
-
spatial_memory/core/file_security.py,sha256=kHIYEnZIRFz94FxCJ7oOHiaihgQRB1rsOHHmJprHNhU,25766
|
|
17
|
-
spatial_memory/core/health.py,sha256=Xq9TYfmBN3YLjYOrpFWtvbR1-fQbSrP1oorSVjRHOSg,9145
|
|
18
|
-
spatial_memory/core/helpers.py,sha256=nxLXGfkpydWzEgMj8PkdX9gVvybN2aCH-CfbEkq6U_w,1931
|
|
19
|
-
spatial_memory/core/import_security.py,sha256=DiG0BsX65JGGf6B1T855SVz1TZB1ViI3JXRi1uW03sQ,13296
|
|
20
|
-
spatial_memory/core/lifecycle_ops.py,sha256=P8jc4JGBF39ayNikgLu0I3kGcJ3ph0VsvAHSxjp35FI,35836
|
|
21
|
-
spatial_memory/core/logging.py,sha256=JfFRzHmhZ2BPNSJiKIHGjfUeskFVo8Bj7nOKznvv0kU,6542
|
|
22
|
-
spatial_memory/core/metrics.py,sha256=8B26sAd2y6xrpaJr8mNgOAMzAZDd1uXOvAGxz_1nhfY,5383
|
|
23
|
-
spatial_memory/core/models.py,sha256=QU3fryNMucHMV8Cbd-jiCU0ofrAK525QNerVk_Zb1oo,17190
|
|
24
|
-
spatial_memory/core/rate_limiter.py,sha256=cn51dRe9G4UHq_f_BuVTMF_zfDsWZqdBTHsXzjjL8JU,10068
|
|
25
|
-
spatial_memory/core/security.py,sha256=fjIYqsyzK4qqm7sI8FNEE2xx9WjNJnrAslOBLVRVwgs,19759
|
|
26
|
-
spatial_memory/core/spatial_ops.py,sha256=_xNrZzrbL7w2uAMJkQZEtTMjERQpo04cuSUoTNebiew,13360
|
|
27
|
-
spatial_memory/core/tracing.py,sha256=9O3WdUJfCl2sohYWlaQETrCO7_P_N3qY_MqSAnpQPl0,8438
|
|
28
|
-
spatial_memory/core/utils.py,sha256=YvvU3EbbAicR732LkHMM5-u4wvBaJ4G9DigBaB2CoI4,3438
|
|
29
|
-
spatial_memory/core/validation.py,sha256=azjJcr1vo39i5x3v2_xY5WnRR-onqpy1zad5iuEAFEU,10013
|
|
30
|
-
spatial_memory/ports/__init__.py,sha256=Lq9ht9AS4VwPbMojtd_FYkA7lUuCXmYHwv6sweJi9AQ,243
|
|
31
|
-
spatial_memory/ports/repositories.py,sha256=_54TvFw5OIQ6ED8mNSC-7m2jOKVlyrFsuGDefhEADok,18081
|
|
32
|
-
spatial_memory/services/__init__.py,sha256=epaF3aHxK2sgGVMp6rS_fxMMAvDVPxjaWm1n4hKOMWU,1564
|
|
33
|
-
spatial_memory/services/export_import.py,sha256=ihPmObVOS86dbo0q_vIUMqlXFZOX6dth8pulnbK2dVM,37639
|
|
34
|
-
spatial_memory/services/lifecycle.py,sha256=bWGHdAjueU1dE16YmHO2BPsizxej8_RupdnjhiJuItg,32681
|
|
35
|
-
spatial_memory/services/memory.py,sha256=TElVWAIENdIFErCEt5B4a1naG8iQsylfWl6htt_Op84,12975
|
|
36
|
-
spatial_memory/services/spatial.py,sha256=7cnZbZbHHx3lhvSv_l6gEUCcx-drq6Q3XGtD5_oi0dc,38668
|
|
37
|
-
spatial_memory/services/utility.py,sha256=89rn1gNJwNQIhrWjmVS3RKP5AQuCvjswFeefMp7yK-4,14950
|
|
38
|
-
spatial_memory/tools/__init__.py,sha256=ZhFZp5j8HA4Qx5pVcRmgTcBbqY3X5TmgMNpSkyAMqJA,127
|
|
39
|
-
spatial_memory/tools/definitions.py,sha256=Ueg_BrRGJcp_jnQD95DiYFPkxU419XPkbjzQFDG3jtY,25397
|
|
40
|
-
spatial_memory_mcp-1.5.3.dist-info/METADATA,sha256=bNbwtM0JJ5fToF23vaCZREpcAOIMZRgE6_Fl8KjyjO8,12035
|
|
41
|
-
spatial_memory_mcp-1.5.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
42
|
-
spatial_memory_mcp-1.5.3.dist-info/entry_points.txt,sha256=nJ4RJBB9SvhNktJdikcAS27fSwtKekpgPR4GTy2r1cE,64
|
|
43
|
-
spatial_memory_mcp-1.5.3.dist-info/licenses/LICENSE,sha256=g65vrroU3yJxekbYV8xmDj7KFrXAg89eCM8vcWrpKmU,1095
|
|
44
|
-
spatial_memory_mcp-1.5.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|