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,215 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
"""SuperLocalMemory V2 - LangChain Chat Message History Tests
|
|
5
|
+
|
|
6
|
+
Functional tests for SuperLocalMemoryChatMessageHistory.
|
|
7
|
+
All tests use a temporary database -- the user's real memory is never touched.
|
|
8
|
+
"""
|
|
9
|
+
import os
|
|
10
|
+
import tempfile
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
|
|
14
|
+
|
|
15
|
+
from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
# Fixtures
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture
|
|
24
|
+
def tmp_db():
|
|
25
|
+
"""Yield a path to a temporary SQLite database that is cleaned up after use."""
|
|
26
|
+
with tempfile.TemporaryDirectory() as d:
|
|
27
|
+
db = os.path.join(d, "test_memory.db")
|
|
28
|
+
yield db
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.fixture
|
|
32
|
+
def history(tmp_db):
|
|
33
|
+
"""Return a fresh history instance bound to the temp DB."""
|
|
34
|
+
return SuperLocalMemoryChatMessageHistory(session_id="test-session", db_path=tmp_db)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
# Tests
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_add_single_human_message(tmp_db):
|
|
43
|
+
"""A single HumanMessage can be added and retrieved."""
|
|
44
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
45
|
+
h.add_messages([HumanMessage(content="Hello, world!")])
|
|
46
|
+
|
|
47
|
+
msgs = h.messages
|
|
48
|
+
assert len(msgs) == 1
|
|
49
|
+
assert isinstance(msgs[0], HumanMessage)
|
|
50
|
+
assert msgs[0].content == "Hello, world!"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_add_single_ai_message(tmp_db):
|
|
54
|
+
"""A single AIMessage can be added and retrieved."""
|
|
55
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
56
|
+
h.add_messages([AIMessage(content="I am an AI.")])
|
|
57
|
+
|
|
58
|
+
msgs = h.messages
|
|
59
|
+
assert len(msgs) == 1
|
|
60
|
+
assert isinstance(msgs[0], AIMessage)
|
|
61
|
+
assert msgs[0].content == "I am an AI."
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_add_multiple_messages(tmp_db):
|
|
65
|
+
"""A batch of three messages is stored and all are retrievable."""
|
|
66
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
67
|
+
h.add_messages([
|
|
68
|
+
HumanMessage(content="Hi"),
|
|
69
|
+
AIMessage(content="Hello"),
|
|
70
|
+
HumanMessage(content="How are you?"),
|
|
71
|
+
])
|
|
72
|
+
|
|
73
|
+
msgs = h.messages
|
|
74
|
+
assert len(msgs) == 3
|
|
75
|
+
assert msgs[0].content == "Hi"
|
|
76
|
+
assert msgs[1].content == "Hello"
|
|
77
|
+
assert msgs[2].content == "How are you?"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_messages_order(tmp_db):
|
|
81
|
+
"""Messages are returned in chronological (insertion) order."""
|
|
82
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
83
|
+
|
|
84
|
+
h.add_messages([HumanMessage(content="first")])
|
|
85
|
+
h.add_messages([AIMessage(content="second")])
|
|
86
|
+
h.add_messages([HumanMessage(content="third")])
|
|
87
|
+
|
|
88
|
+
msgs = h.messages
|
|
89
|
+
assert [m.content for m in msgs] == ["first", "second", "third"]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def test_message_roundtrip(tmp_db):
|
|
93
|
+
"""A HumanMessage with additional_kwargs survives serialization."""
|
|
94
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
95
|
+
|
|
96
|
+
original = HumanMessage(
|
|
97
|
+
content="Test with kwargs",
|
|
98
|
+
additional_kwargs={"custom_key": "custom_value", "number": 42},
|
|
99
|
+
)
|
|
100
|
+
h.add_messages([original])
|
|
101
|
+
|
|
102
|
+
msgs = h.messages
|
|
103
|
+
assert len(msgs) == 1
|
|
104
|
+
assert msgs[0].content == "Test with kwargs"
|
|
105
|
+
assert msgs[0].additional_kwargs.get("custom_key") == "custom_value"
|
|
106
|
+
assert msgs[0].additional_kwargs.get("number") == 42
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def test_system_message(tmp_db):
|
|
110
|
+
"""A SystemMessage round-trips correctly."""
|
|
111
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
112
|
+
h.add_messages([SystemMessage(content="You are a helpful assistant.")])
|
|
113
|
+
|
|
114
|
+
msgs = h.messages
|
|
115
|
+
assert len(msgs) == 1
|
|
116
|
+
assert isinstance(msgs[0], SystemMessage)
|
|
117
|
+
assert msgs[0].content == "You are a helpful assistant."
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_clear(tmp_db):
|
|
121
|
+
"""clear() removes all messages from the session."""
|
|
122
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
|
|
123
|
+
h.add_messages([
|
|
124
|
+
HumanMessage(content="A"),
|
|
125
|
+
AIMessage(content="B"),
|
|
126
|
+
])
|
|
127
|
+
|
|
128
|
+
assert len(h.messages) == 2
|
|
129
|
+
h.clear()
|
|
130
|
+
assert len(h.messages) == 0
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def test_clear_only_affects_session(tmp_db):
|
|
134
|
+
"""Clearing session A does not affect session B."""
|
|
135
|
+
ha = SuperLocalMemoryChatMessageHistory(session_id="session-a", db_path=tmp_db)
|
|
136
|
+
hb = SuperLocalMemoryChatMessageHistory(session_id="session-b", db_path=tmp_db)
|
|
137
|
+
|
|
138
|
+
ha.add_messages([HumanMessage(content="Message in A")])
|
|
139
|
+
hb.add_messages([HumanMessage(content="Message in B")])
|
|
140
|
+
|
|
141
|
+
ha.clear()
|
|
142
|
+
|
|
143
|
+
assert len(ha.messages) == 0
|
|
144
|
+
assert len(hb.messages) == 1
|
|
145
|
+
assert hb.messages[0].content == "Message in B"
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def test_session_isolation(tmp_db):
|
|
149
|
+
"""Two sessions with the same DB path do not see each other's messages."""
|
|
150
|
+
ha = SuperLocalMemoryChatMessageHistory(session_id="alpha", db_path=tmp_db)
|
|
151
|
+
hb = SuperLocalMemoryChatMessageHistory(session_id="beta", db_path=tmp_db)
|
|
152
|
+
|
|
153
|
+
ha.add_messages([HumanMessage(content="Alpha message")])
|
|
154
|
+
hb.add_messages([HumanMessage(content="Beta message")])
|
|
155
|
+
|
|
156
|
+
assert len(ha.messages) == 1
|
|
157
|
+
assert ha.messages[0].content == "Alpha message"
|
|
158
|
+
|
|
159
|
+
assert len(hb.messages) == 1
|
|
160
|
+
assert hb.messages[0].content == "Beta message"
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_empty_session(tmp_db):
|
|
164
|
+
"""A brand-new session returns an empty list."""
|
|
165
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="empty", db_path=tmp_db)
|
|
166
|
+
assert h.messages == []
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def test_persistence_across_instances(tmp_db):
|
|
170
|
+
"""Messages persist when a new Python instance is created with the same session_id."""
|
|
171
|
+
h1 = SuperLocalMemoryChatMessageHistory(session_id="persist", db_path=tmp_db)
|
|
172
|
+
h1.add_messages([HumanMessage(content="Persisted message")])
|
|
173
|
+
|
|
174
|
+
# Create a completely new instance pointing at the same DB + session.
|
|
175
|
+
h2 = SuperLocalMemoryChatMessageHistory(session_id="persist", db_path=tmp_db)
|
|
176
|
+
msgs = h2.messages
|
|
177
|
+
assert len(msgs) == 1
|
|
178
|
+
assert msgs[0].content == "Persisted message"
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def test_unicode_content(tmp_db):
|
|
182
|
+
"""Unicode and emoji content round-trips correctly."""
|
|
183
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="unicode", db_path=tmp_db)
|
|
184
|
+
text = "Bonjour le monde! Hola mundo! Konnichiwa sekai!"
|
|
185
|
+
h.add_messages([HumanMessage(content=text)])
|
|
186
|
+
|
|
187
|
+
msgs = h.messages
|
|
188
|
+
assert len(msgs) == 1
|
|
189
|
+
assert msgs[0].content == text
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def test_long_content(tmp_db):
|
|
193
|
+
"""A 10K character message is stored and retrieved intact."""
|
|
194
|
+
h = SuperLocalMemoryChatMessageHistory(session_id="long", db_path=tmp_db)
|
|
195
|
+
long_text = "A" * 10_000
|
|
196
|
+
h.add_messages([HumanMessage(content=long_text)])
|
|
197
|
+
|
|
198
|
+
msgs = h.messages
|
|
199
|
+
assert len(msgs) == 1
|
|
200
|
+
assert len(msgs[0].content) == 10_000
|
|
201
|
+
assert msgs[0].content == long_text
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def test_special_chars_session_id(tmp_db):
|
|
205
|
+
"""Session IDs with dots, dashes, and underscores work correctly."""
|
|
206
|
+
for sid in ["my.session.123", "my-session-456", "my_session_789", "a.b-c_d"]:
|
|
207
|
+
h = SuperLocalMemoryChatMessageHistory(session_id=sid, db_path=tmp_db)
|
|
208
|
+
h.add_messages([HumanMessage(content=f"msg for {sid}")])
|
|
209
|
+
|
|
210
|
+
msgs = h.messages
|
|
211
|
+
assert len(msgs) == 1, f"Failed for session_id={sid}"
|
|
212
|
+
assert msgs[0].content == f"msg for {sid}"
|
|
213
|
+
|
|
214
|
+
h.clear()
|
|
215
|
+
assert len(h.messages) == 0, f"clear() failed for session_id={sid}"
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
"""SuperLocalMemory V2 - LangChain Integration Security Tests
|
|
5
|
+
|
|
6
|
+
Security tests covering SQL injection, XSS payloads, oversized content,
|
|
7
|
+
and edge-case session identifiers. These mirror OWASP agentic-AI concerns
|
|
8
|
+
relevant to a local-first memory store.
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import tempfile
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
from langchain_core.messages import HumanMessage
|
|
15
|
+
|
|
16
|
+
from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture
|
|
20
|
+
def tmp_db():
|
|
21
|
+
"""Yield a path to a temporary SQLite database that is cleaned up after use."""
|
|
22
|
+
with tempfile.TemporaryDirectory() as d:
|
|
23
|
+
db = os.path.join(d, "test_memory.db")
|
|
24
|
+
yield db
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# SQL injection
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_sql_injection_session_id(tmp_db):
|
|
33
|
+
"""SQL injection in session_id should not work."""
|
|
34
|
+
history = SuperLocalMemoryChatMessageHistory(
|
|
35
|
+
session_id="'; DROP TABLE memories; --", db_path=tmp_db
|
|
36
|
+
)
|
|
37
|
+
history.add_messages([HumanMessage(content="test")])
|
|
38
|
+
assert len(history.messages) == 1 # Should work normally, not crash
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_sql_injection_content(tmp_db):
|
|
42
|
+
"""SQL injection in message content is safely stored and retrieved."""
|
|
43
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
|
|
44
|
+
payload = "'; DROP TABLE memories; --"
|
|
45
|
+
history.add_messages([HumanMessage(content=payload)])
|
|
46
|
+
|
|
47
|
+
msgs = history.messages
|
|
48
|
+
assert len(msgs) == 1
|
|
49
|
+
assert msgs[0].content == payload
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# ---------------------------------------------------------------------------
|
|
53
|
+
# XSS
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_xss_content(tmp_db):
|
|
58
|
+
"""XSS payloads are stored verbatim (no sanitization needed for storage)."""
|
|
59
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
|
|
60
|
+
payload = "<script>alert('xss')</script>"
|
|
61
|
+
history.add_messages([HumanMessage(content=payload)])
|
|
62
|
+
|
|
63
|
+
msgs = history.messages
|
|
64
|
+
assert len(msgs) == 1
|
|
65
|
+
assert "<script>" in msgs[0].content
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ---------------------------------------------------------------------------
|
|
69
|
+
# Size limits
|
|
70
|
+
# ---------------------------------------------------------------------------
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_large_content(tmp_db):
|
|
74
|
+
"""A large message (near the SLM 1 MB limit) is stored and retrieved intact.
|
|
75
|
+
|
|
76
|
+
MemoryStoreV2 enforces MAX_CONTENT_SIZE = 1_000_000 on the *stored*
|
|
77
|
+
string, which is the JSON-serialized message (not the raw text). The
|
|
78
|
+
JSON envelope adds ~150 bytes of overhead, so we use 999_000 chars to
|
|
79
|
+
stay safely under the limit.
|
|
80
|
+
"""
|
|
81
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
|
|
82
|
+
big_msg = "x" * 999_000
|
|
83
|
+
history.add_messages([HumanMessage(content=big_msg)])
|
|
84
|
+
|
|
85
|
+
msgs = history.messages
|
|
86
|
+
assert len(msgs) == 1
|
|
87
|
+
assert len(msgs[0].content) == 999_000
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def test_oversized_content_raises(tmp_db):
|
|
91
|
+
"""Content that exceeds SLM's 1 MB limit after serialization raises ValueError."""
|
|
92
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
|
|
93
|
+
# 1_000_000 chars + JSON overhead will exceed the 1 MB limit.
|
|
94
|
+
big_msg = "x" * 1_000_000
|
|
95
|
+
with pytest.raises(ValueError, match="exceeds maximum size"):
|
|
96
|
+
history.add_messages([HumanMessage(content=big_msg)])
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
# ---------------------------------------------------------------------------
|
|
100
|
+
# Edge-case session IDs
|
|
101
|
+
# ---------------------------------------------------------------------------
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_empty_session_id(tmp_db):
|
|
105
|
+
"""An empty string session_id still functions correctly."""
|
|
106
|
+
history = SuperLocalMemoryChatMessageHistory(session_id="", db_path=tmp_db)
|
|
107
|
+
history.add_messages([HumanMessage(content="test")])
|
|
108
|
+
assert len(history.messages) == 1
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_null_bytes_session_id(tmp_db):
|
|
112
|
+
"""Null bytes in session_id do not cause crashes."""
|
|
113
|
+
history = SuperLocalMemoryChatMessageHistory(
|
|
114
|
+
session_id="test\x00evil", db_path=tmp_db
|
|
115
|
+
)
|
|
116
|
+
history.add_messages([HumanMessage(content="test")])
|
|
117
|
+
assert len(history.messages) == 1
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# LlamaIndex Chat Store — SuperLocalMemory V2
|
|
2
|
+
|
|
3
|
+
A LlamaIndex `BaseChatStore` implementation backed by [SuperLocalMemory V2](https://github.com/varun369/SuperLocalMemoryV2). All chat history stays **100% local** on your machine — zero cloud calls, zero telemetry, zero API keys.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Python 3.9+
|
|
8
|
+
- SuperLocalMemory V2 installed (`~/.claude-memory/` must exist)
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# Install SuperLocalMemory V2 (one-time)
|
|
12
|
+
curl -fsSL https://raw.githubusercontent.com/varun369/SuperLocalMemoryV2/main/install.sh | bash
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install llama-index-storage-chat-store-superlocalmemory
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from llama_index.core.memory import ChatMemoryBuffer
|
|
25
|
+
from llama_index.core.base.llms.types import ChatMessage, MessageRole
|
|
26
|
+
from llama_index.storage.chat_store.superlocalmemory import SuperLocalMemoryChatStore
|
|
27
|
+
|
|
28
|
+
# Create the chat store (uses default SLM database)
|
|
29
|
+
chat_store = SuperLocalMemoryChatStore()
|
|
30
|
+
|
|
31
|
+
# Use with ChatMemoryBuffer for automatic conversation management
|
|
32
|
+
memory = ChatMemoryBuffer.from_defaults(
|
|
33
|
+
chat_store=chat_store,
|
|
34
|
+
chat_store_key="user-123",
|
|
35
|
+
token_limit=3000,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
# Or use directly for manual message management
|
|
39
|
+
chat_store.add_message("session-1", ChatMessage(role=MessageRole.USER, content="Hello!"))
|
|
40
|
+
chat_store.add_message("session-1", ChatMessage(role=MessageRole.ASSISTANT, content="Hi there!"))
|
|
41
|
+
|
|
42
|
+
messages = chat_store.get_messages("session-1")
|
|
43
|
+
print(messages) # [ChatMessage(role=user, content="Hello!"), ChatMessage(role=assistant, content="Hi there!")]
|
|
44
|
+
|
|
45
|
+
# List all session keys
|
|
46
|
+
keys = chat_store.get_keys()
|
|
47
|
+
|
|
48
|
+
# Delete a session
|
|
49
|
+
chat_store.delete_messages("session-1")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
- **100% Local** — All data stored in SQLite at `~/.claude-memory/memory.db`
|
|
55
|
+
- **Zero Cloud** — No API keys, no subscriptions, no data leaves your machine
|
|
56
|
+
- **Shared Memory** — Chat history is accessible from Claude, Cursor, Windsurf, and 16+ other AI tools via SuperLocalMemory
|
|
57
|
+
- **Session Isolation** — Each chat key is cleanly isolated using SLM tags
|
|
58
|
+
- **Persistent** — Survives process restarts (SQLite-backed, not in-memory)
|
|
59
|
+
- **Full BaseChatStore API** — `set_messages`, `get_messages`, `add_message`, `delete_messages`, `delete_message`, `delete_last_message`, `get_keys`
|
|
60
|
+
- **Async Support** — Async methods inherited from BaseChatStore (delegates to sync via `asyncio.to_thread`)
|
|
61
|
+
|
|
62
|
+
## How It Works
|
|
63
|
+
|
|
64
|
+
Each chat message is stored as a separate memory entry in SuperLocalMemory V2:
|
|
65
|
+
- **Content**: JSON-serialized `{role, content, additional_kwargs}`
|
|
66
|
+
- **Tag**: `llamaindex:chat:<session_key>` for session isolation
|
|
67
|
+
- **Project**: `llamaindex` for easy identification
|
|
68
|
+
- **Importance**: 3 (low, since chat messages are transient)
|
|
69
|
+
|
|
70
|
+
## Custom Database Path
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
# Use a custom database file
|
|
74
|
+
chat_store = SuperLocalMemoryChatStore(db_path="/path/to/custom/memory.db")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Links
|
|
78
|
+
|
|
79
|
+
- [SuperLocalMemory V2](https://github.com/varun369/SuperLocalMemoryV2)
|
|
80
|
+
- [LlamaIndex Documentation](https://docs.llamaindex.ai/)
|
|
81
|
+
- [LlamaIndex Chat Stores Guide](https://docs.llamaindex.ai/en/stable/module_guides/storing/chat_stores/)
|
package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
+
from llama_index.storage.chat_store.superlocalmemory.base import (
|
|
5
|
+
SuperLocalMemoryChatStore,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = ["SuperLocalMemoryChatStore"]
|
|
9
|
+
__version__ = "0.1.0"
|