superlocalmemory 2.7.6 → 2.8.0
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.
- package/CHANGELOG.md +120 -155
- package/README.md +115 -89
- package/api_server.py +2 -12
- package/docs/PATTERN-LEARNING.md +64 -199
- package/docs/example_graph_usage.py +4 -6
- package/install.sh +59 -0
- package/mcp_server.py +83 -7
- package/package.json +1 -8
- package/scripts/generate-thumbnails.py +3 -5
- package/skills/slm-build-graph/SKILL.md +1 -1
- package/skills/slm-list-recent/SKILL.md +1 -1
- package/skills/slm-recall/SKILL.md +1 -1
- package/skills/slm-remember/SKILL.md +1 -1
- package/skills/slm-show-patterns/SKILL.md +1 -1
- package/skills/slm-status/SKILL.md +1 -1
- package/skills/slm-switch-profile/SKILL.md +1 -1
- package/src/agent_registry.py +7 -18
- package/src/auth_middleware.py +3 -5
- package/src/auto_backup.py +3 -7
- package/src/behavioral/__init__.py +49 -0
- package/src/behavioral/behavioral_listener.py +203 -0
- package/src/behavioral/behavioral_patterns.py +275 -0
- package/src/behavioral/cross_project_transfer.py +206 -0
- package/src/behavioral/outcome_inference.py +194 -0
- package/src/behavioral/outcome_tracker.py +193 -0
- package/src/behavioral/tests/__init__.py +4 -0
- package/src/behavioral/tests/test_behavioral_integration.py +108 -0
- package/src/behavioral/tests/test_behavioral_patterns.py +150 -0
- package/src/behavioral/tests/test_cross_project_transfer.py +142 -0
- package/src/behavioral/tests/test_mcp_behavioral.py +139 -0
- package/src/behavioral/tests/test_mcp_report_outcome.py +117 -0
- package/src/behavioral/tests/test_outcome_inference.py +107 -0
- package/src/behavioral/tests/test_outcome_tracker.py +96 -0
- package/src/cache_manager.py +4 -6
- package/src/compliance/__init__.py +48 -0
- package/src/compliance/abac_engine.py +149 -0
- package/src/compliance/abac_middleware.py +116 -0
- package/src/compliance/audit_db.py +215 -0
- package/src/compliance/audit_logger.py +148 -0
- package/src/compliance/retention_manager.py +289 -0
- package/src/compliance/retention_scheduler.py +186 -0
- package/src/compliance/tests/__init__.py +4 -0
- package/src/compliance/tests/test_abac_enforcement.py +95 -0
- package/src/compliance/tests/test_abac_engine.py +124 -0
- package/src/compliance/tests/test_abac_mcp_integration.py +118 -0
- package/src/compliance/tests/test_audit_db.py +123 -0
- package/src/compliance/tests/test_audit_logger.py +98 -0
- package/src/compliance/tests/test_mcp_audit.py +128 -0
- package/src/compliance/tests/test_mcp_retention_policy.py +125 -0
- package/src/compliance/tests/test_retention_manager.py +131 -0
- package/src/compliance/tests/test_retention_scheduler.py +99 -0
- package/src/db_connection_manager.py +2 -12
- package/src/embedding_engine.py +61 -669
- package/src/embeddings/__init__.py +47 -0
- package/src/embeddings/cache.py +70 -0
- package/src/embeddings/cli.py +113 -0
- package/src/embeddings/constants.py +47 -0
- package/src/embeddings/database.py +91 -0
- package/src/embeddings/engine.py +247 -0
- package/src/embeddings/model_loader.py +145 -0
- package/src/event_bus.py +3 -13
- package/src/graph/__init__.py +36 -0
- package/src/graph/build_helpers.py +74 -0
- package/src/graph/cli.py +87 -0
- package/src/graph/cluster_builder.py +188 -0
- package/src/graph/cluster_summary.py +148 -0
- package/src/graph/constants.py +47 -0
- package/src/graph/edge_builder.py +162 -0
- package/src/graph/entity_extractor.py +95 -0
- package/src/graph/graph_core.py +226 -0
- package/src/graph/graph_search.py +231 -0
- package/src/graph/hierarchical.py +207 -0
- package/src/graph/schema.py +99 -0
- package/src/graph_engine.py +45 -1451
- package/src/hnsw_index.py +3 -7
- package/src/hybrid_search.py +36 -683
- package/src/learning/__init__.py +27 -12
- package/src/learning/adaptive_ranker.py +50 -12
- package/src/learning/cross_project_aggregator.py +2 -12
- package/src/learning/engagement_tracker.py +2 -12
- package/src/learning/feature_extractor.py +175 -43
- package/src/learning/feedback_collector.py +7 -12
- package/src/learning/learning_db.py +180 -12
- package/src/learning/project_context_manager.py +2 -12
- package/src/learning/source_quality_scorer.py +2 -12
- package/src/learning/synthetic_bootstrap.py +2 -12
- package/src/learning/tests/__init__.py +2 -0
- package/src/learning/tests/test_adaptive_ranker.py +2 -6
- package/src/learning/tests/test_adaptive_ranker_v28.py +60 -0
- package/src/learning/tests/test_aggregator.py +2 -6
- package/src/learning/tests/test_auto_retrain_v28.py +35 -0
- package/src/learning/tests/test_e2e_ranking_v28.py +82 -0
- package/src/learning/tests/test_feature_extractor_v28.py +93 -0
- package/src/learning/tests/test_feedback_collector.py +2 -6
- package/src/learning/tests/test_learning_db.py +2 -6
- package/src/learning/tests/test_learning_db_v28.py +110 -0
- package/src/learning/tests/test_learning_init_v28.py +48 -0
- package/src/learning/tests/test_outcome_signals.py +48 -0
- package/src/learning/tests/test_project_context.py +2 -6
- package/src/learning/tests/test_schema_migration.py +319 -0
- package/src/learning/tests/test_signal_inference.py +11 -13
- package/src/learning/tests/test_source_quality.py +2 -6
- package/src/learning/tests/test_synthetic_bootstrap.py +3 -7
- package/src/learning/tests/test_workflow_miner.py +2 -6
- package/src/learning/workflow_pattern_miner.py +2 -12
- package/src/lifecycle/__init__.py +54 -0
- package/src/lifecycle/bounded_growth.py +239 -0
- package/src/lifecycle/compaction_engine.py +226 -0
- package/src/lifecycle/lifecycle_engine.py +302 -0
- package/src/lifecycle/lifecycle_evaluator.py +225 -0
- package/src/lifecycle/lifecycle_scheduler.py +130 -0
- package/src/lifecycle/retention_policy.py +285 -0
- package/src/lifecycle/tests/__init__.py +4 -0
- package/src/lifecycle/tests/test_bounded_growth.py +193 -0
- package/src/lifecycle/tests/test_compaction.py +179 -0
- package/src/lifecycle/tests/test_lifecycle_engine.py +137 -0
- package/src/lifecycle/tests/test_lifecycle_evaluation.py +177 -0
- package/src/lifecycle/tests/test_lifecycle_scheduler.py +127 -0
- package/src/lifecycle/tests/test_lifecycle_search.py +109 -0
- package/src/lifecycle/tests/test_mcp_compact.py +149 -0
- package/src/lifecycle/tests/test_mcp_lifecycle_status.py +114 -0
- package/src/lifecycle/tests/test_retention_policy.py +162 -0
- package/src/mcp_tools_v28.py +280 -0
- package/src/memory-profiles.py +2 -12
- package/src/memory-reset.py +2 -12
- package/src/memory_compression.py +2 -12
- package/src/memory_store_v2.py +76 -20
- package/src/migrate_v1_to_v2.py +2 -12
- package/src/pattern_learner.py +29 -975
- package/src/patterns/__init__.py +24 -0
- package/src/patterns/analyzers.py +247 -0
- package/src/patterns/learner.py +267 -0
- package/src/patterns/scoring.py +167 -0
- package/src/patterns/store.py +223 -0
- package/src/patterns/terminology.py +138 -0
- package/src/provenance_tracker.py +4 -14
- package/src/query_optimizer.py +4 -6
- package/src/rate_limiter.py +2 -6
- package/src/search/__init__.py +20 -0
- package/src/search/cli.py +77 -0
- package/src/search/constants.py +26 -0
- package/src/search/engine.py +239 -0
- package/src/search/fusion.py +122 -0
- package/src/search/index_loader.py +112 -0
- package/src/search/methods.py +162 -0
- package/src/search_engine_v2.py +4 -6
- package/src/setup_validator.py +7 -13
- package/src/subscription_manager.py +2 -12
- package/src/tree/__init__.py +59 -0
- package/src/tree/builder.py +183 -0
- package/src/tree/nodes.py +196 -0
- package/src/tree/queries.py +252 -0
- package/src/tree/schema.py +76 -0
- package/src/tree_manager.py +10 -711
- package/src/trust/__init__.py +45 -0
- package/src/trust/constants.py +66 -0
- package/src/trust/queries.py +157 -0
- package/src/trust/schema.py +95 -0
- package/src/trust/scorer.py +299 -0
- package/src/trust/signals.py +95 -0
- package/src/trust_scorer.py +39 -697
- package/src/webhook_dispatcher.py +2 -12
- package/ui/app.js +1 -1
- package/ui/js/agents.js +1 -1
- package/ui_server.py +2 -14
- package/ATTRIBUTION.md +0 -140
- package/docs/ARCHITECTURE-V2.5.md +0 -190
- package/docs/GRAPH-ENGINE.md +0 -503
- package/docs/architecture-diagram.drawio +0 -405
- package/docs/plans/2026-02-13-benchmark-suite.md +0 -1349
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
"""
|
|
5
|
+
High-level signal helpers and burst detection mixin for TrustScorer.
|
|
6
|
+
|
|
7
|
+
Contains: on_memory_created, on_memory_deleted, on_memory_recalled,
|
|
8
|
+
_track_write, _is_burst.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from datetime import datetime, timedelta
|
|
13
|
+
from typing import Optional
|
|
14
|
+
|
|
15
|
+
from .constants import (
|
|
16
|
+
QUICK_DELETE_HOURS,
|
|
17
|
+
BURST_THRESHOLD,
|
|
18
|
+
BURST_WINDOW_MINUTES,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger("superlocalmemory.trust")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TrustSignalsMixin:
|
|
25
|
+
"""Mixin providing high-level signal helpers and burst detection."""
|
|
26
|
+
|
|
27
|
+
# =========================================================================
|
|
28
|
+
# High-Level Signal Helpers (called from memory_store_v2 / mcp_server)
|
|
29
|
+
# =========================================================================
|
|
30
|
+
|
|
31
|
+
def on_memory_created(self, agent_id: str, memory_id: int, importance: int = 5):
|
|
32
|
+
"""Record signals when a memory is created."""
|
|
33
|
+
# Track write timestamp for burst detection
|
|
34
|
+
self._track_write(agent_id)
|
|
35
|
+
|
|
36
|
+
if importance >= 7:
|
|
37
|
+
self.record_signal(agent_id, "high_importance_write",
|
|
38
|
+
context={"memory_id": memory_id, "importance": importance})
|
|
39
|
+
else:
|
|
40
|
+
self.record_signal(agent_id, "normal_write",
|
|
41
|
+
context={"memory_id": memory_id})
|
|
42
|
+
|
|
43
|
+
# Check for burst pattern
|
|
44
|
+
if self._is_burst(agent_id):
|
|
45
|
+
self.record_signal(agent_id, "high_volume_burst",
|
|
46
|
+
context={"memory_id": memory_id})
|
|
47
|
+
|
|
48
|
+
def on_memory_deleted(self, agent_id: str, memory_id: int, created_at: Optional[str] = None):
|
|
49
|
+
"""Record signals when a memory is deleted."""
|
|
50
|
+
if created_at:
|
|
51
|
+
try:
|
|
52
|
+
created = datetime.fromisoformat(created_at)
|
|
53
|
+
age_hours = (datetime.now() - created).total_seconds() / 3600
|
|
54
|
+
if age_hours < QUICK_DELETE_HOURS:
|
|
55
|
+
self.record_signal(agent_id, "quick_delete",
|
|
56
|
+
context={"memory_id": memory_id, "age_hours": round(age_hours, 2)})
|
|
57
|
+
return
|
|
58
|
+
except (ValueError, TypeError):
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
# Normal delete (no negative signal)
|
|
62
|
+
self.record_signal(agent_id, "normal_write",
|
|
63
|
+
context={"memory_id": memory_id, "action": "delete"})
|
|
64
|
+
|
|
65
|
+
def on_memory_recalled(self, agent_id: str, memory_id: int, created_by: Optional[str] = None):
|
|
66
|
+
"""Record signals when a memory is recalled."""
|
|
67
|
+
if created_by and created_by != agent_id:
|
|
68
|
+
# Cross-agent validation: another agent found this memory useful
|
|
69
|
+
self.record_signal(created_by, "memory_recalled_by_others",
|
|
70
|
+
context={"memory_id": memory_id, "recalled_by": agent_id})
|
|
71
|
+
|
|
72
|
+
self.record_signal(agent_id, "normal_recall",
|
|
73
|
+
context={"memory_id": memory_id})
|
|
74
|
+
|
|
75
|
+
# =========================================================================
|
|
76
|
+
# Burst Detection
|
|
77
|
+
# =========================================================================
|
|
78
|
+
|
|
79
|
+
def _track_write(self, agent_id: str):
|
|
80
|
+
"""Track a write timestamp for burst detection."""
|
|
81
|
+
now = datetime.now()
|
|
82
|
+
with self._timestamps_lock:
|
|
83
|
+
if agent_id not in self._write_timestamps:
|
|
84
|
+
self._write_timestamps[agent_id] = []
|
|
85
|
+
timestamps = self._write_timestamps[agent_id]
|
|
86
|
+
timestamps.append(now)
|
|
87
|
+
# Keep only recent timestamps (within burst window)
|
|
88
|
+
cutoff = now - timedelta(minutes=BURST_WINDOW_MINUTES)
|
|
89
|
+
self._write_timestamps[agent_id] = [t for t in timestamps if t > cutoff]
|
|
90
|
+
|
|
91
|
+
def _is_burst(self, agent_id: str) -> bool:
|
|
92
|
+
"""Check if agent is in a burst write pattern."""
|
|
93
|
+
with self._timestamps_lock:
|
|
94
|
+
timestamps = self._write_timestamps.get(agent_id, [])
|
|
95
|
+
return len(timestamps) > BURST_THRESHOLD
|