superlocalmemory 2.8.5 → 3.0.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 +11 -0
- package/LICENSE +9 -1
- package/NOTICE +63 -0
- package/README.md +165 -480
- package/bin/slm +17 -449
- package/bin/slm-npm +2 -2
- package/bin/slm.bat +4 -2
- package/conftest.py +5 -0
- package/docs/api-reference.md +284 -0
- package/docs/architecture.md +149 -0
- package/docs/auto-memory.md +150 -0
- package/docs/cli-reference.md +276 -0
- package/docs/compliance.md +191 -0
- package/docs/configuration.md +182 -0
- package/docs/getting-started.md +102 -0
- package/docs/ide-setup.md +261 -0
- package/docs/mcp-tools.md +220 -0
- package/docs/migration-from-v2.md +170 -0
- package/docs/profiles.md +173 -0
- package/docs/troubleshooting.md +310 -0
- package/{configs → ide/configs}/antigravity-mcp.json +3 -3
- package/ide/configs/chatgpt-desktop-mcp.json +16 -0
- package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
- package/{configs → ide/configs}/codex-mcp.toml +4 -4
- package/{configs → ide/configs}/continue-mcp.yaml +4 -3
- package/{configs → ide/configs}/continue-skills.yaml +6 -6
- package/ide/configs/cursor-mcp.json +15 -0
- package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
- package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
- package/{configs → ide/configs}/opencode-mcp.json +2 -2
- package/{configs → ide/configs}/perplexity-mcp.json +2 -2
- package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
- package/{configs → ide/configs}/windsurf-mcp.json +3 -3
- package/{configs → ide/configs}/zed-mcp.json +2 -2
- package/{hooks → ide/hooks}/context-hook.js +9 -20
- package/ide/hooks/memory-list-skill.js +70 -0
- package/ide/hooks/memory-profile-skill.js +101 -0
- package/ide/hooks/memory-recall-skill.js +62 -0
- package/ide/hooks/memory-remember-skill.js +68 -0
- package/ide/hooks/memory-reset-skill.js +160 -0
- package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
- package/ide/integrations/langchain/README.md +106 -0
- package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
- package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
- package/ide/integrations/langchain/pyproject.toml +38 -0
- package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
- package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
- package/ide/integrations/langchain/tests/test_security.py +117 -0
- package/ide/integrations/llamaindex/README.md +81 -0
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
- package/ide/integrations/llamaindex/pyproject.toml +43 -0
- package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
- package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
- package/ide/integrations/llamaindex/tests/test_security.py +241 -0
- package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
- package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
- package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
- package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
- package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
- package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
- package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
- package/package.json +13 -22
- package/pyproject.toml +85 -0
- package/scripts/build-dmg.sh +417 -0
- package/scripts/install-skills.ps1 +334 -0
- package/{install.ps1 → scripts/install.ps1} +36 -4
- package/{install.sh → scripts/install.sh} +14 -13
- package/scripts/postinstall.js +2 -2
- package/scripts/start-dashboard.ps1 +52 -0
- package/scripts/start-dashboard.sh +41 -0
- package/scripts/sync-wiki.ps1 +127 -0
- package/scripts/sync-wiki.sh +82 -0
- package/scripts/test-dmg.sh +161 -0
- package/scripts/test-npm-package.ps1 +252 -0
- package/scripts/test-npm-package.sh +207 -0
- package/scripts/verify-install.ps1 +294 -0
- package/scripts/verify-install.sh +266 -0
- package/src/superlocalmemory/__init__.py +0 -0
- package/src/superlocalmemory/attribution/__init__.py +9 -0
- package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
- package/src/superlocalmemory/attribution/signer.py +153 -0
- package/src/superlocalmemory/attribution/watermark.py +189 -0
- package/src/superlocalmemory/cli/__init__.py +5 -0
- package/src/superlocalmemory/cli/commands.py +245 -0
- package/src/superlocalmemory/cli/main.py +89 -0
- package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
- package/src/superlocalmemory/cli/post_install.py +99 -0
- package/src/superlocalmemory/cli/setup_wizard.py +129 -0
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +204 -0
- package/src/superlocalmemory/compliance/audit.py +314 -0
- package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
- package/src/superlocalmemory/compliance/gdpr.py +294 -0
- package/src/superlocalmemory/compliance/lifecycle.py +158 -0
- package/src/superlocalmemory/compliance/retention.py +232 -0
- package/src/superlocalmemory/compliance/scheduler.py +148 -0
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/config.py +391 -0
- package/src/superlocalmemory/core/embeddings.py +293 -0
- package/src/superlocalmemory/core/engine.py +701 -0
- package/src/superlocalmemory/core/hooks.py +65 -0
- package/src/superlocalmemory/core/maintenance.py +172 -0
- package/src/superlocalmemory/core/modes.py +140 -0
- package/src/superlocalmemory/core/profiles.py +234 -0
- package/src/superlocalmemory/core/registry.py +117 -0
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/consolidator.py +485 -0
- package/src/superlocalmemory/encoding/emotional.py +125 -0
- package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
- package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
- package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
- package/src/superlocalmemory/encoding/foresight.py +91 -0
- package/src/superlocalmemory/encoding/graph_builder.py +302 -0
- package/src/superlocalmemory/encoding/observation_builder.py +160 -0
- package/src/superlocalmemory/encoding/scene_builder.py +183 -0
- package/src/superlocalmemory/encoding/signal_inference.py +90 -0
- package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
- package/src/superlocalmemory/encoding/type_router.py +235 -0
- package/src/superlocalmemory/hooks/__init__.py +3 -0
- package/src/superlocalmemory/hooks/auto_capture.py +111 -0
- package/src/superlocalmemory/hooks/auto_recall.py +93 -0
- package/src/superlocalmemory/hooks/ide_connector.py +204 -0
- package/src/superlocalmemory/hooks/rules_engine.py +99 -0
- package/src/superlocalmemory/infra/__init__.py +3 -0
- package/src/superlocalmemory/infra/auth_middleware.py +82 -0
- package/src/superlocalmemory/infra/backup.py +317 -0
- package/src/superlocalmemory/infra/cache_manager.py +267 -0
- package/src/superlocalmemory/infra/event_bus.py +381 -0
- package/src/superlocalmemory/infra/rate_limiter.py +135 -0
- package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +172 -0
- package/src/superlocalmemory/learning/behavioral.py +490 -0
- package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
- package/src/superlocalmemory/learning/bootstrap.py +298 -0
- package/src/superlocalmemory/learning/cross_project.py +399 -0
- package/src/superlocalmemory/learning/database.py +376 -0
- package/src/superlocalmemory/learning/engagement.py +323 -0
- package/src/superlocalmemory/learning/features.py +138 -0
- package/src/superlocalmemory/learning/feedback.py +316 -0
- package/src/superlocalmemory/learning/outcomes.py +255 -0
- package/src/superlocalmemory/learning/project_context.py +366 -0
- package/src/superlocalmemory/learning/ranker.py +155 -0
- package/src/superlocalmemory/learning/source_quality.py +303 -0
- package/src/superlocalmemory/learning/workflows.py +309 -0
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +316 -0
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/fisher.py +356 -0
- package/src/superlocalmemory/math/langevin.py +398 -0
- package/src/superlocalmemory/math/sheaf.py +257 -0
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/resources.py +245 -0
- package/src/superlocalmemory/mcp/server.py +61 -0
- package/src/superlocalmemory/mcp/tools.py +18 -0
- package/src/superlocalmemory/mcp/tools_core.py +305 -0
- package/src/superlocalmemory/mcp/tools_v28.py +223 -0
- package/src/superlocalmemory/mcp/tools_v3.py +286 -0
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +295 -0
- package/src/superlocalmemory/retrieval/ann_index.py +223 -0
- package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
- package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
- package/src/superlocalmemory/retrieval/engine.py +390 -0
- package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
- package/src/superlocalmemory/retrieval/fusion.py +78 -0
- package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
- package/src/superlocalmemory/retrieval/reranker.py +154 -0
- package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
- package/src/superlocalmemory/retrieval/strategy.py +96 -0
- package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
- package/src/superlocalmemory/server/__init__.py +1 -0
- package/src/superlocalmemory/server/api.py +248 -0
- package/src/superlocalmemory/server/routes/__init__.py +4 -0
- package/src/superlocalmemory/server/routes/agents.py +107 -0
- package/src/superlocalmemory/server/routes/backup.py +91 -0
- package/src/superlocalmemory/server/routes/behavioral.py +127 -0
- package/src/superlocalmemory/server/routes/compliance.py +160 -0
- package/src/superlocalmemory/server/routes/data_io.py +188 -0
- package/src/superlocalmemory/server/routes/events.py +183 -0
- package/src/superlocalmemory/server/routes/helpers.py +85 -0
- package/src/superlocalmemory/server/routes/learning.py +273 -0
- package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
- package/src/superlocalmemory/server/routes/memories.py +399 -0
- package/src/superlocalmemory/server/routes/profiles.py +219 -0
- package/src/superlocalmemory/server/routes/stats.py +346 -0
- package/src/superlocalmemory/server/routes/v3_api.py +365 -0
- package/src/superlocalmemory/server/routes/ws.py +82 -0
- package/src/superlocalmemory/server/security_middleware.py +57 -0
- package/src/superlocalmemory/server/ui.py +245 -0
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/access_control.py +182 -0
- package/src/superlocalmemory/storage/database.py +594 -0
- package/src/superlocalmemory/storage/migrations.py +303 -0
- package/src/superlocalmemory/storage/models.py +406 -0
- package/src/superlocalmemory/storage/schema.py +726 -0
- package/src/superlocalmemory/storage/v2_migrator.py +317 -0
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +130 -0
- package/src/superlocalmemory/trust/provenance.py +124 -0
- package/src/superlocalmemory/trust/scorer.py +347 -0
- package/src/superlocalmemory/trust/signals.py +153 -0
- package/ui/index.html +278 -5
- package/ui/js/auto-settings.js +70 -0
- package/ui/js/dashboard.js +90 -0
- package/ui/js/fact-detail.js +92 -0
- package/ui/js/feedback.js +2 -2
- package/ui/js/ide-status.js +102 -0
- package/ui/js/math-health.js +98 -0
- package/ui/js/recall-lab.js +127 -0
- package/ui/js/settings.js +2 -2
- package/ui/js/trust-dashboard.js +73 -0
- package/api_server.py +0 -724
- package/bin/aider-smart +0 -72
- package/bin/superlocalmemoryv2-learning +0 -4
- package/bin/superlocalmemoryv2-list +0 -3
- package/bin/superlocalmemoryv2-patterns +0 -4
- package/bin/superlocalmemoryv2-profile +0 -3
- package/bin/superlocalmemoryv2-recall +0 -3
- package/bin/superlocalmemoryv2-remember +0 -3
- package/bin/superlocalmemoryv2-reset +0 -3
- package/bin/superlocalmemoryv2-status +0 -3
- package/configs/chatgpt-desktop-mcp.json +0 -16
- package/configs/cursor-mcp.json +0 -15
- package/docs/SECURITY-QUICK-REFERENCE.md +0 -214
- package/hooks/memory-list-skill.js +0 -139
- package/hooks/memory-profile-skill.js +0 -273
- package/hooks/memory-recall-skill.js +0 -114
- package/hooks/memory-remember-skill.js +0 -127
- package/hooks/memory-reset-skill.js +0 -274
- package/mcp_server.py +0 -1800
- package/requirements-core.txt +0 -22
- package/requirements-learning.txt +0 -12
- package/requirements.txt +0 -12
- package/src/agent_registry.py +0 -411
- package/src/auth_middleware.py +0 -61
- package/src/auto_backup.py +0 -459
- package/src/behavioral/__init__.py +0 -49
- package/src/behavioral/behavioral_listener.py +0 -203
- package/src/behavioral/behavioral_patterns.py +0 -275
- package/src/behavioral/cross_project_transfer.py +0 -206
- package/src/behavioral/outcome_inference.py +0 -194
- package/src/behavioral/outcome_tracker.py +0 -193
- package/src/behavioral/tests/__init__.py +0 -4
- package/src/behavioral/tests/test_behavioral_integration.py +0 -108
- package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
- package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
- package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
- package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
- package/src/behavioral/tests/test_outcome_inference.py +0 -107
- package/src/behavioral/tests/test_outcome_tracker.py +0 -96
- package/src/cache_manager.py +0 -518
- package/src/compliance/__init__.py +0 -48
- package/src/compliance/abac_engine.py +0 -149
- package/src/compliance/abac_middleware.py +0 -116
- package/src/compliance/audit_db.py +0 -215
- package/src/compliance/audit_logger.py +0 -148
- package/src/compliance/retention_manager.py +0 -289
- package/src/compliance/retention_scheduler.py +0 -186
- package/src/compliance/tests/__init__.py +0 -4
- package/src/compliance/tests/test_abac_enforcement.py +0 -95
- package/src/compliance/tests/test_abac_engine.py +0 -124
- package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
- package/src/compliance/tests/test_audit_db.py +0 -123
- package/src/compliance/tests/test_audit_logger.py +0 -98
- package/src/compliance/tests/test_mcp_audit.py +0 -128
- package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
- package/src/compliance/tests/test_retention_manager.py +0 -131
- package/src/compliance/tests/test_retention_scheduler.py +0 -99
- package/src/compression/__init__.py +0 -25
- package/src/compression/cli.py +0 -150
- package/src/compression/cold_storage.py +0 -217
- package/src/compression/config.py +0 -72
- package/src/compression/orchestrator.py +0 -133
- package/src/compression/tier2_compressor.py +0 -228
- package/src/compression/tier3_compressor.py +0 -153
- package/src/compression/tier_classifier.py +0 -148
- package/src/db_connection_manager.py +0 -536
- package/src/embedding_engine.py +0 -63
- package/src/embeddings/__init__.py +0 -47
- package/src/embeddings/cache.py +0 -70
- package/src/embeddings/cli.py +0 -113
- package/src/embeddings/constants.py +0 -47
- package/src/embeddings/database.py +0 -91
- package/src/embeddings/engine.py +0 -247
- package/src/embeddings/model_loader.py +0 -145
- package/src/event_bus.py +0 -562
- package/src/graph/__init__.py +0 -36
- package/src/graph/build_helpers.py +0 -74
- package/src/graph/cli.py +0 -87
- package/src/graph/cluster_builder.py +0 -188
- package/src/graph/cluster_summary.py +0 -148
- package/src/graph/constants.py +0 -47
- package/src/graph/edge_builder.py +0 -162
- package/src/graph/entity_extractor.py +0 -95
- package/src/graph/graph_core.py +0 -226
- package/src/graph/graph_search.py +0 -231
- package/src/graph/hierarchical.py +0 -207
- package/src/graph/schema.py +0 -99
- package/src/graph_engine.py +0 -52
- package/src/hnsw_index.py +0 -628
- package/src/hybrid_search.py +0 -46
- package/src/learning/__init__.py +0 -217
- package/src/learning/adaptive_ranker.py +0 -682
- package/src/learning/bootstrap/__init__.py +0 -69
- package/src/learning/bootstrap/constants.py +0 -93
- package/src/learning/bootstrap/db_queries.py +0 -316
- package/src/learning/bootstrap/sampling.py +0 -82
- package/src/learning/bootstrap/text_utils.py +0 -71
- package/src/learning/cross_project_aggregator.py +0 -857
- package/src/learning/db/__init__.py +0 -40
- package/src/learning/db/constants.py +0 -44
- package/src/learning/db/schema.py +0 -279
- package/src/learning/engagement_tracker.py +0 -628
- package/src/learning/feature_extractor.py +0 -708
- package/src/learning/feedback_collector.py +0 -806
- package/src/learning/learning_db.py +0 -915
- package/src/learning/project_context_manager.py +0 -572
- package/src/learning/ranking/__init__.py +0 -33
- package/src/learning/ranking/constants.py +0 -84
- package/src/learning/ranking/helpers.py +0 -278
- package/src/learning/source_quality_scorer.py +0 -676
- package/src/learning/synthetic_bootstrap.py +0 -755
- package/src/learning/tests/test_adaptive_ranker.py +0 -325
- package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
- package/src/learning/tests/test_aggregator.py +0 -306
- package/src/learning/tests/test_auto_retrain_v28.py +0 -35
- package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
- package/src/learning/tests/test_feature_extractor_v28.py +0 -93
- package/src/learning/tests/test_feedback_collector.py +0 -294
- package/src/learning/tests/test_learning_db.py +0 -602
- package/src/learning/tests/test_learning_db_v28.py +0 -110
- package/src/learning/tests/test_learning_init_v28.py +0 -48
- package/src/learning/tests/test_outcome_signals.py +0 -48
- package/src/learning/tests/test_project_context.py +0 -292
- package/src/learning/tests/test_schema_migration.py +0 -319
- package/src/learning/tests/test_signal_inference.py +0 -397
- package/src/learning/tests/test_source_quality.py +0 -351
- package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
- package/src/learning/tests/test_workflow_miner.py +0 -318
- package/src/learning/workflow_pattern_miner.py +0 -655
- package/src/lifecycle/__init__.py +0 -54
- package/src/lifecycle/bounded_growth.py +0 -239
- package/src/lifecycle/compaction_engine.py +0 -226
- package/src/lifecycle/lifecycle_engine.py +0 -355
- package/src/lifecycle/lifecycle_evaluator.py +0 -257
- package/src/lifecycle/lifecycle_scheduler.py +0 -130
- package/src/lifecycle/retention_policy.py +0 -285
- package/src/lifecycle/tests/test_bounded_growth.py +0 -193
- package/src/lifecycle/tests/test_compaction.py +0 -179
- package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
- package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
- package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
- package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
- package/src/lifecycle/tests/test_mcp_compact.py +0 -149
- package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
- package/src/lifecycle/tests/test_retention_policy.py +0 -162
- package/src/mcp_tools_v28.py +0 -281
- package/src/memory/__init__.py +0 -36
- package/src/memory/cli.py +0 -205
- package/src/memory/constants.py +0 -39
- package/src/memory/helpers.py +0 -28
- package/src/memory/schema.py +0 -166
- package/src/memory-profiles.py +0 -595
- package/src/memory-reset.py +0 -491
- package/src/memory_compression.py +0 -989
- package/src/memory_store_v2.py +0 -1155
- package/src/migrate_v1_to_v2.py +0 -629
- package/src/pattern_learner.py +0 -34
- package/src/patterns/__init__.py +0 -24
- package/src/patterns/analyzers.py +0 -251
- package/src/patterns/learner.py +0 -271
- package/src/patterns/scoring.py +0 -171
- package/src/patterns/store.py +0 -225
- package/src/patterns/terminology.py +0 -140
- package/src/provenance_tracker.py +0 -312
- package/src/qualixar_attribution.py +0 -139
- package/src/qualixar_watermark.py +0 -78
- package/src/query_optimizer.py +0 -511
- package/src/rate_limiter.py +0 -83
- package/src/search/__init__.py +0 -20
- package/src/search/cli.py +0 -77
- package/src/search/constants.py +0 -26
- package/src/search/engine.py +0 -241
- package/src/search/fusion.py +0 -122
- package/src/search/index_loader.py +0 -114
- package/src/search/methods.py +0 -162
- package/src/search_engine_v2.py +0 -401
- package/src/setup_validator.py +0 -482
- package/src/subscription_manager.py +0 -391
- package/src/tree/__init__.py +0 -59
- package/src/tree/builder.py +0 -185
- package/src/tree/nodes.py +0 -202
- package/src/tree/queries.py +0 -257
- package/src/tree/schema.py +0 -80
- package/src/tree_manager.py +0 -19
- package/src/trust/__init__.py +0 -45
- package/src/trust/constants.py +0 -66
- package/src/trust/queries.py +0 -157
- package/src/trust/schema.py +0 -95
- package/src/trust/scorer.py +0 -299
- package/src/trust/signals.py +0 -95
- package/src/trust_scorer.py +0 -44
- package/ui/app.js +0 -1588
- package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
- package/ui/js/graph-cytoscape.js +0 -1168
- package/ui/js/graph-d3-backup.js +0 -32
- package/ui/js/graph.js +0 -32
- package/ui_server.py +0 -266
- /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
- /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
- /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
- /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
- /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
- /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
- /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
- /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
- /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
- /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
- /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
- /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
- /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
- /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
- /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
- /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
- /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
- /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
- /package/{completions → ide/completions}/slm.bash +0 -0
- /package/{completions → ide/completions}/slm.zsh +0 -0
- /package/{configs → ide/configs}/cody-commands.json +0 -0
- /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Reset CLI Skill (V3)
|
|
4
|
+
* Provides /memory-reset command with safety warnings
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { execFile } = require('child_process');
|
|
8
|
+
const { promisify } = require('util');
|
|
9
|
+
const readline = require('readline');
|
|
10
|
+
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
|
|
13
|
+
const rl = readline.createInterface({
|
|
14
|
+
input: process.stdin,
|
|
15
|
+
output: process.stdout
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const question = (query) => new Promise((resolve) => rl.question(query, resolve));
|
|
19
|
+
|
|
20
|
+
async function memoryResetSkill() {
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
|
|
23
|
+
// Show help if no args
|
|
24
|
+
if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
|
|
25
|
+
console.log(`
|
|
26
|
+
SuperLocalMemory V3 - Reset Commands
|
|
27
|
+
|
|
28
|
+
Usage: /memory-reset <command> [options]
|
|
29
|
+
|
|
30
|
+
Commands:
|
|
31
|
+
status Show current memory system status (SAFE)
|
|
32
|
+
soft Clear all memories, keep schema (DESTRUCTIVE)
|
|
33
|
+
hard --confirm Delete everything, reinitialize (NUCLEAR)
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
/memory-reset status
|
|
37
|
+
/memory-reset soft
|
|
38
|
+
/memory-reset hard --confirm
|
|
39
|
+
|
|
40
|
+
WARNING: soft/hard operations create automatic backups
|
|
41
|
+
but will delete data. Always check status first!
|
|
42
|
+
`);
|
|
43
|
+
rl.close();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const command = args[0];
|
|
48
|
+
|
|
49
|
+
// STATUS command (safe, no warnings)
|
|
50
|
+
if (command === 'status') {
|
|
51
|
+
try {
|
|
52
|
+
const { stdout } = await execFileAsync('python3', [
|
|
53
|
+
'-m', 'superlocalmemory.cli.main', 'status'
|
|
54
|
+
]);
|
|
55
|
+
console.log(stdout);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error('Error:', error.message);
|
|
58
|
+
}
|
|
59
|
+
rl.close();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// SOFT RESET command (destructive, show warning)
|
|
64
|
+
if (command === 'soft') {
|
|
65
|
+
console.log(`
|
|
66
|
+
WARNING: SOFT RESET
|
|
67
|
+
|
|
68
|
+
This will:
|
|
69
|
+
- Delete ALL memories from current profile
|
|
70
|
+
- Clear graph data (nodes, edges, clusters)
|
|
71
|
+
- Clear learned patterns
|
|
72
|
+
- Create automatic backup before deletion
|
|
73
|
+
- Keep V3 schema structure intact
|
|
74
|
+
|
|
75
|
+
Backup location: ~/.superlocalmemory/backups/pre-reset-[timestamp].db
|
|
76
|
+
`);
|
|
77
|
+
|
|
78
|
+
const answer = await question('Proceed with soft reset? (yes/no): ');
|
|
79
|
+
|
|
80
|
+
if (answer.toLowerCase() === 'yes') {
|
|
81
|
+
try {
|
|
82
|
+
const { stdout } = await execFileAsync('python3', [
|
|
83
|
+
'-m', 'superlocalmemory.cli.main', 'reset', 'soft'
|
|
84
|
+
]);
|
|
85
|
+
console.log(stdout);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error('Error:', error.message);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
console.log('\nCancelled. No changes made.');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
rl.close();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// HARD RESET command (nuclear, extra warnings)
|
|
98
|
+
if (command === 'hard') {
|
|
99
|
+
if (!args.includes('--confirm')) {
|
|
100
|
+
console.log(`
|
|
101
|
+
Error: Hard reset requires --confirm flag
|
|
102
|
+
|
|
103
|
+
HARD RESET is DESTRUCTIVE and will:
|
|
104
|
+
- Delete the ENTIRE database file
|
|
105
|
+
- Remove ALL memories permanently
|
|
106
|
+
- Remove ALL graph data permanently
|
|
107
|
+
- Remove ALL learned patterns permanently
|
|
108
|
+
|
|
109
|
+
To proceed, use:
|
|
110
|
+
/memory-reset hard --confirm
|
|
111
|
+
`);
|
|
112
|
+
rl.close();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
console.log(`
|
|
117
|
+
DANGER: HARD RESET
|
|
118
|
+
|
|
119
|
+
This will:
|
|
120
|
+
- DELETE the entire database file (memory.db)
|
|
121
|
+
- DESTROY all memories (cannot undo within system)
|
|
122
|
+
- ERASE all graph relationships
|
|
123
|
+
- REMOVE all learned patterns
|
|
124
|
+
- Reinitialize fresh V3 schema
|
|
125
|
+
|
|
126
|
+
Backup location: ~/.superlocalmemory/backups/pre-reset-[timestamp].db
|
|
127
|
+
`);
|
|
128
|
+
|
|
129
|
+
const answer = await question('Type "DELETE EVERYTHING" to confirm: ');
|
|
130
|
+
|
|
131
|
+
if (answer === 'DELETE EVERYTHING') {
|
|
132
|
+
try {
|
|
133
|
+
const { stdout } = await execFileAsync('python3', [
|
|
134
|
+
'-m', 'superlocalmemory.cli.main', 'reset', 'hard', '--confirm'
|
|
135
|
+
]);
|
|
136
|
+
console.log(stdout);
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.error('Error:', error.message);
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
console.log('\nCancelled. No changes made.');
|
|
142
|
+
console.log('(You must type exactly "DELETE EVERYTHING" to confirm)');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
rl.close();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Unknown command
|
|
150
|
+
console.log(`
|
|
151
|
+
Unknown command: ${command}
|
|
152
|
+
|
|
153
|
+
Valid commands: status, soft, hard
|
|
154
|
+
|
|
155
|
+
Use: /memory-reset --help for more information
|
|
156
|
+
`);
|
|
157
|
+
rl.close();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
memoryResetSkill();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* SuperLocalMemory
|
|
3
|
+
* SuperLocalMemory V3 - Post-Recall Hook
|
|
4
4
|
* Copyright (c) 2026 Varun Pratap Bhardwaj
|
|
5
5
|
* Licensed under MIT License
|
|
6
6
|
*
|
|
@@ -16,7 +16,7 @@ const fs = require('fs');
|
|
|
16
16
|
const path = require('path');
|
|
17
17
|
const os = require('os');
|
|
18
18
|
|
|
19
|
-
const MEMORY_DIR = path.join(os.homedir(), '.
|
|
19
|
+
const MEMORY_DIR = path.join(os.homedir(), '.superlocalmemory');
|
|
20
20
|
const HOOK_LOG = path.join(MEMORY_DIR, 'recall-events.jsonl');
|
|
21
21
|
|
|
22
22
|
// Parse input from Claude Code hook system
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# langchain-superlocalmemory
|
|
2
|
+
|
|
3
|
+
LangChain chat message history backed by [SuperLocalMemory V2](https://github.com/varun369/SuperLocalMemoryV2) -- 100% local, zero cloud.
|
|
4
|
+
|
|
5
|
+
Every message stays on your machine in a SQLite database. No API keys, no subscriptions, no telemetry.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Python 3.10+
|
|
10
|
+
- [SuperLocalMemory V2](https://github.com/varun369/SuperLocalMemoryV2) installed (`~/.claude-memory/` must exist)
|
|
11
|
+
- `langchain-core >= 1.0.0`
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install langchain-superlocalmemory
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or install from source:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd integrations/langchain
|
|
23
|
+
pip install -e .
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Quick Start
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from langchain_core.messages import AIMessage, HumanMessage
|
|
30
|
+
from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
|
|
31
|
+
|
|
32
|
+
# Create a history for a conversation session
|
|
33
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="my-chat-session")
|
|
34
|
+
|
|
35
|
+
# Add messages
|
|
36
|
+
history.add_messages([
|
|
37
|
+
HumanMessage(content="What is SuperLocalMemory?"),
|
|
38
|
+
AIMessage(content="It's a local-first memory system for AI assistants."),
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
# Retrieve messages (chronological order)
|
|
42
|
+
for msg in history.messages:
|
|
43
|
+
print(f"{msg.type}: {msg.content}")
|
|
44
|
+
|
|
45
|
+
# Clear the session
|
|
46
|
+
history.clear()
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Features
|
|
50
|
+
|
|
51
|
+
- **Local-first storage** -- all data stays in `~/.claude-memory/memory.db`
|
|
52
|
+
- **Session isolation** -- each `session_id` is completely independent
|
|
53
|
+
- **Full LangChain compatibility** -- implements `BaseChatMessageHistory`
|
|
54
|
+
- **Persistent across restarts** -- SQLite-backed, survives process exit
|
|
55
|
+
- **Works alongside SLM** -- messages are queryable via CLI, MCP, Skills, and REST API
|
|
56
|
+
- **All message types** -- HumanMessage, AIMessage, SystemMessage, FunctionMessage, ToolMessage
|
|
57
|
+
- **additional_kwargs preserved** -- metadata round-trips through serialization
|
|
58
|
+
|
|
59
|
+
## Multi-Session Example
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
|
|
63
|
+
|
|
64
|
+
# Two independent conversations
|
|
65
|
+
support = SuperLocalMemoryChatMessageHistory(session_id="support-ticket-42")
|
|
66
|
+
coding = SuperLocalMemoryChatMessageHistory(session_id="code-review-pr-99")
|
|
67
|
+
|
|
68
|
+
# Messages are isolated -- support session cannot see coding session
|
|
69
|
+
support.add_messages([HumanMessage(content="My app is crashing")])
|
|
70
|
+
coding.add_messages([HumanMessage(content="Review this PR please")])
|
|
71
|
+
|
|
72
|
+
assert len(support.messages) == 1
|
|
73
|
+
assert len(coding.messages) == 1
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Custom Database Path
|
|
77
|
+
|
|
78
|
+
By default the package uses `~/.claude-memory/memory.db`. You can point to a different database:
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
history = SuperLocalMemoryChatMessageHistory(
|
|
82
|
+
session_id="my-session",
|
|
83
|
+
db_path="/path/to/custom/memory.db",
|
|
84
|
+
)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## How It Works
|
|
88
|
+
|
|
89
|
+
Each LangChain message is stored as an individual memory entry in SuperLocalMemory V2:
|
|
90
|
+
|
|
91
|
+
- **Content**: JSON-serialized message (type, content, additional_kwargs)
|
|
92
|
+
- **Tags**: `["langchain", "langchain:session:<session_id>"]`
|
|
93
|
+
- **Importance**: 3 (lower than user memories, so chat history does not crowd search results)
|
|
94
|
+
- **Project**: `"langchain"`
|
|
95
|
+
|
|
96
|
+
This means your LangChain conversations are visible in the SLM dashboard, searchable via `slm recall`, and accessible from any SLM-integrated tool.
|
|
97
|
+
|
|
98
|
+
## License
|
|
99
|
+
|
|
100
|
+
MIT -- see [LICENSE](../../LICENSE) for details.
|
|
101
|
+
|
|
102
|
+
## Links
|
|
103
|
+
|
|
104
|
+
- [SuperLocalMemory V2 Repository](https://github.com/varun369/SuperLocalMemoryV2)
|
|
105
|
+
- [Documentation](https://superlocalmemory.com/)
|
|
106
|
+
- [LangChain Documentation](https://python.langchain.com/)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
from langchain_superlocalmemory.chat_message_history import (
|
|
5
|
+
SuperLocalMemoryChatMessageHistory,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = ["SuperLocalMemoryChatMessageHistory"]
|
|
9
|
+
__version__ = "0.1.0"
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
"""SuperLocalMemory V2 - LangChain Chat Message History
|
|
5
|
+
|
|
6
|
+
Implements LangChain's BaseChatMessageHistory backed by SuperLocalMemory V2's
|
|
7
|
+
local SQLite storage. All data stays on your machine -- zero cloud, zero telemetry.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
|
|
11
|
+
|
|
12
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="my-session")
|
|
13
|
+
history.add_messages([HumanMessage(content="Hello")])
|
|
14
|
+
print(history.messages)
|
|
15
|
+
"""
|
|
16
|
+
import json
|
|
17
|
+
import sys
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import List, Optional, Sequence
|
|
20
|
+
|
|
21
|
+
from langchain_core.chat_history import BaseChatMessageHistory
|
|
22
|
+
from langchain_core.messages import (
|
|
23
|
+
AIMessage,
|
|
24
|
+
BaseMessage,
|
|
25
|
+
FunctionMessage,
|
|
26
|
+
HumanMessage,
|
|
27
|
+
SystemMessage,
|
|
28
|
+
ToolMessage,
|
|
29
|
+
message_to_dict,
|
|
30
|
+
messages_from_dict,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
# MemoryStoreV2 import strategy
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
# SuperLocalMemory V2 installs to ~/.claude-memory/. We add that path so
|
|
37
|
+
# the MemoryStoreV2 class can be imported. If SLM is not installed, we
|
|
38
|
+
# raise a clear error at construction time (not import time) so the package
|
|
39
|
+
# itself can still be imported for introspection.
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
_SLM_PATH = Path.home() / ".claude-memory"
|
|
43
|
+
_MemoryStoreV2 = None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _ensure_slm_imported():
|
|
47
|
+
"""Lazily import MemoryStoreV2, raising a clear error if unavailable."""
|
|
48
|
+
global _MemoryStoreV2
|
|
49
|
+
if _MemoryStoreV2 is not None:
|
|
50
|
+
return _MemoryStoreV2
|
|
51
|
+
|
|
52
|
+
slm_path_str = str(_SLM_PATH)
|
|
53
|
+
if slm_path_str not in sys.path:
|
|
54
|
+
sys.path.insert(0, slm_path_str)
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
from memory_store_v2 import MemoryStoreV2 # type: ignore[import-untyped]
|
|
58
|
+
|
|
59
|
+
_MemoryStoreV2 = MemoryStoreV2
|
|
60
|
+
return _MemoryStoreV2
|
|
61
|
+
except ImportError as exc:
|
|
62
|
+
raise ImportError(
|
|
63
|
+
"SuperLocalMemory V2 is not installed. "
|
|
64
|
+
"Run the installer from https://github.com/varun369/SuperLocalMemoryV2 "
|
|
65
|
+
"or ensure ~/.claude-memory/memory_store_v2.py exists."
|
|
66
|
+
) from exc
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# ---------------------------------------------------------------------------
|
|
70
|
+
# Message (de)serialization helpers
|
|
71
|
+
# ---------------------------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
# Map from LangChain message type string to the concrete class used for
|
|
74
|
+
# deserialization. LangChain's own `messages_from_dict` handles this, but we
|
|
75
|
+
# keep a lookup for the fallback path in case the dict format diverges.
|
|
76
|
+
|
|
77
|
+
_MESSAGE_TYPE_MAP = {
|
|
78
|
+
"human": HumanMessage,
|
|
79
|
+
"ai": AIMessage,
|
|
80
|
+
"system": SystemMessage,
|
|
81
|
+
"function": FunctionMessage,
|
|
82
|
+
"tool": ToolMessage,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _serialize_message(message: BaseMessage) -> str:
|
|
87
|
+
"""Serialize a LangChain BaseMessage to a JSON string for SLM storage."""
|
|
88
|
+
return json.dumps(message_to_dict(message), ensure_ascii=False)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _deserialize_messages(dicts: List[dict]) -> List[BaseMessage]:
|
|
92
|
+
"""Deserialize a list of message dicts back to BaseMessage instances.
|
|
93
|
+
|
|
94
|
+
Uses LangChain's ``messages_from_dict`` which handles all known message
|
|
95
|
+
types including ``additional_kwargs``.
|
|
96
|
+
"""
|
|
97
|
+
return messages_from_dict(dicts)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# ---------------------------------------------------------------------------
|
|
101
|
+
# Main class
|
|
102
|
+
# ---------------------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class SuperLocalMemoryChatMessageHistory(BaseChatMessageHistory):
|
|
106
|
+
"""LangChain chat message history backed by SuperLocalMemory V2.
|
|
107
|
+
|
|
108
|
+
Each message is stored as an individual memory entry in the SLM SQLite
|
|
109
|
+
database, tagged with the session ID for isolation. This keeps the data
|
|
110
|
+
fully local and queryable via any SLM access method (MCP, CLI, Skills,
|
|
111
|
+
REST API).
|
|
112
|
+
|
|
113
|
+
Parameters
|
|
114
|
+
----------
|
|
115
|
+
session_id : str
|
|
116
|
+
Unique identifier for the conversation session. Messages from
|
|
117
|
+
different session IDs are completely isolated.
|
|
118
|
+
db_path : str or None
|
|
119
|
+
Path to the SQLite database file. Defaults to
|
|
120
|
+
``~/.claude-memory/memory.db``.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
# Tag prefix used to isolate LangChain session messages inside SLM.
|
|
124
|
+
_TAG_PREFIX = "langchain:session:"
|
|
125
|
+
|
|
126
|
+
def __init__(self, session_id: str, db_path: Optional[str] = None) -> None:
|
|
127
|
+
self.session_id = session_id
|
|
128
|
+
self.db_path = db_path
|
|
129
|
+
|
|
130
|
+
MemoryStoreV2 = _ensure_slm_imported()
|
|
131
|
+
store_path = Path(db_path) if db_path else None
|
|
132
|
+
self._store = MemoryStoreV2(db_path=store_path)
|
|
133
|
+
|
|
134
|
+
# -- property: messages ------------------------------------------------
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def messages(self) -> List[BaseMessage]: # type: ignore[override]
|
|
138
|
+
"""Return all messages for this session, ordered chronologically."""
|
|
139
|
+
session_tag = f"{self._TAG_PREFIX}{self.session_id}"
|
|
140
|
+
|
|
141
|
+
# Retrieve a generous batch from SLM. We filter by tag in Python
|
|
142
|
+
# because list_all does not accept a tag filter parameter.
|
|
143
|
+
all_memories = self._store.list_all(limit=10_000)
|
|
144
|
+
|
|
145
|
+
# Filter to memories belonging to this session.
|
|
146
|
+
session_memories = [
|
|
147
|
+
m for m in all_memories if session_tag in (m.get("tags") or [])
|
|
148
|
+
]
|
|
149
|
+
|
|
150
|
+
# list_all returns newest-first (ORDER BY created_at DESC).
|
|
151
|
+
# We need chronological (oldest-first) order for chat history.
|
|
152
|
+
session_memories.sort(key=lambda m: m.get("created_at", ""))
|
|
153
|
+
|
|
154
|
+
# Deserialize each memory's content back to a BaseMessage.
|
|
155
|
+
message_dicts: List[dict] = []
|
|
156
|
+
for mem in session_memories:
|
|
157
|
+
try:
|
|
158
|
+
parsed = json.loads(mem["content"])
|
|
159
|
+
message_dicts.append(parsed)
|
|
160
|
+
except (json.JSONDecodeError, KeyError, TypeError):
|
|
161
|
+
# Skip malformed entries silently -- they may be non-LangChain
|
|
162
|
+
# memories that happen to share the tag pattern.
|
|
163
|
+
continue
|
|
164
|
+
|
|
165
|
+
if not message_dicts:
|
|
166
|
+
return []
|
|
167
|
+
|
|
168
|
+
return _deserialize_messages(message_dicts)
|
|
169
|
+
|
|
170
|
+
# -- add_messages ------------------------------------------------------
|
|
171
|
+
|
|
172
|
+
def add_messages(self, messages: Sequence[BaseMessage]) -> None:
|
|
173
|
+
"""Persist messages to SuperLocalMemory V2.
|
|
174
|
+
|
|
175
|
+
Each message becomes a separate memory entry tagged with the session
|
|
176
|
+
identifier. Importance is set to 3 (lower than typical user
|
|
177
|
+
memories at 5) so LangChain history does not crowd out higher-value
|
|
178
|
+
entries in search results.
|
|
179
|
+
"""
|
|
180
|
+
session_tag = f"{self._TAG_PREFIX}{self.session_id}"
|
|
181
|
+
|
|
182
|
+
for message in messages:
|
|
183
|
+
serialized = _serialize_message(message)
|
|
184
|
+
self._store.add_memory(
|
|
185
|
+
content=serialized,
|
|
186
|
+
tags=["langchain", session_tag],
|
|
187
|
+
importance=3,
|
|
188
|
+
project_name="langchain",
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# -- clear -------------------------------------------------------------
|
|
192
|
+
|
|
193
|
+
def clear(self) -> None:
|
|
194
|
+
"""Remove all messages for this session from the store."""
|
|
195
|
+
session_tag = f"{self._TAG_PREFIX}{self.session_id}"
|
|
196
|
+
|
|
197
|
+
all_memories = self._store.list_all(limit=10_000)
|
|
198
|
+
|
|
199
|
+
for mem in all_memories:
|
|
200
|
+
if session_tag in (mem.get("tags") or []):
|
|
201
|
+
self._store.delete_memory(mem["id"])
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "langchain-superlocalmemory"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "LangChain chat message history backed by SuperLocalMemory — 100% local, zero cloud"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Varun Pratap Bhardwaj" },
|
|
14
|
+
]
|
|
15
|
+
keywords = ["langchain", "memory", "local-first", "privacy", "sqlite", "chat-history", "mcp"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 4 - Beta",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"License :: OSI Approved :: MIT License",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Topic :: Software Development :: Libraries",
|
|
26
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
27
|
+
]
|
|
28
|
+
dependencies = [
|
|
29
|
+
"langchain-core>=1.0.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://github.com/varun369/SuperLocalMemoryV2"
|
|
34
|
+
Documentation = "https://superlocalmemory.com/"
|
|
35
|
+
Repository = "https://github.com/varun369/SuperLocalMemoryV2"
|
|
36
|
+
|
|
37
|
+
[tool.pytest.ini_options]
|
|
38
|
+
testpaths = ["tests"]
|