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.

Files changed (34) hide show
  1. spatial_memory/__init__.py +1 -1
  2. spatial_memory/__main__.py +241 -2
  3. spatial_memory/adapters/lancedb_repository.py +74 -5
  4. spatial_memory/config.py +10 -2
  5. spatial_memory/core/__init__.py +9 -0
  6. spatial_memory/core/connection_pool.py +41 -3
  7. spatial_memory/core/consolidation_strategies.py +402 -0
  8. spatial_memory/core/database.py +774 -918
  9. spatial_memory/core/db_idempotency.py +242 -0
  10. spatial_memory/core/db_indexes.py +575 -0
  11. spatial_memory/core/db_migrations.py +584 -0
  12. spatial_memory/core/db_search.py +509 -0
  13. spatial_memory/core/db_versioning.py +177 -0
  14. spatial_memory/core/embeddings.py +65 -18
  15. spatial_memory/core/errors.py +75 -3
  16. spatial_memory/core/filesystem.py +178 -0
  17. spatial_memory/core/models.py +4 -0
  18. spatial_memory/core/rate_limiter.py +26 -9
  19. spatial_memory/core/response_types.py +497 -0
  20. spatial_memory/core/validation.py +86 -2
  21. spatial_memory/factory.py +407 -0
  22. spatial_memory/migrations/__init__.py +40 -0
  23. spatial_memory/ports/repositories.py +52 -2
  24. spatial_memory/server.py +131 -189
  25. spatial_memory/services/export_import.py +61 -43
  26. spatial_memory/services/lifecycle.py +397 -122
  27. spatial_memory/services/memory.py +2 -2
  28. spatial_memory/services/spatial.py +129 -46
  29. {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/METADATA +83 -3
  30. spatial_memory_mcp-1.6.0.dist-info/RECORD +54 -0
  31. spatial_memory_mcp-1.5.3.dist-info/RECORD +0 -44
  32. {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/WHEEL +0 -0
  33. {spatial_memory_mcp-1.5.3.dist-info → spatial_memory_mcp-1.6.0.dist-info}/entry_points.txt +0 -0
  34. {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
- dist = self._cosine_distance(
234
- interp_vec, self._get_vector_for_memory(neighbor.id)
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
- # Calculate distance traveled
362
- next_result = self._repo.get_with_vector(next_memory.id)
363
- if next_result is None:
364
- logger.warning(f"Memory {next_memory.id} disappeared during wander")
365
- break
366
- _, next_vector = next_result
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 and create edges for high similarity
669
- for i in range(len(vectors)):
670
- for j in range(i + 1, len(vectors)):
671
- similarity = 1.0 - self._cosine_distance(vectors[i], vectors[j])
672
- if similarity >= self._config.visualize_similarity_threshold:
673
- edges.append(
674
- VisualizationEdge(
675
- from_id=nodes[i].id,
676
- to_id=nodes[j].id,
677
- weight=similarity,
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
- Delegates to repository if batch search is available, otherwise
790
- performs individual searches.
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
- # Fall back to individual searches (repository handles batch internally)
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 vec in vectors:
803
- neighbors = self._repo.search(vec, limit=limit_per_query, namespace=namespace)
804
- results.append(neighbors)
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
- # Remove common stop words and short words
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 stop_words and len(w) > 2]
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.5.3
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 1094 tests passing.
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
- - **1094 tests** including security edge cases
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,,