superlocalmemory 3.8.2__tar.gz → 3.8.4__tar.gz
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.
- {superlocalmemory-3.8.2/src/superlocalmemory.egg-info → superlocalmemory-3.8.4}/PKG-INFO +3 -3
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/README.md +2 -2
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/rules/AGENTS.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-cache/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-compress/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-graph/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-recall/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-remember/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-session/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/plugin-src/skills/slm-status/SKILL.md +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/pyproject.toml +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/__init__.py +1 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/access/rbac.py +68 -76
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/commands.py +19 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/ingest_cmd.py +11 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/main.py +30 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/pending_store.py +39 -14
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/config.py +58 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/consolidation_engine.py +79 -73
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine.py +92 -11
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/fact_consolidator.py +148 -30
- superlocalmemory-3.8.4/src/superlocalmemory/core/graph_pruner.py +818 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ingestion_command.py +160 -31
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/maintenance_scheduler.py +25 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_pipeline.py +3 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/registry.py +5 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/remote_mode.py +3 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/scale_engine.py +41 -18
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/store_pipeline.py +18 -4
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/entity_resolver.py +18 -11
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/_outcome_common.py +9 -2
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/adapter_base.py +58 -44
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/ide_connector.py +26 -8
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/portable_kit.py +105 -9
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/prewarm_auth.py +21 -2
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/auth_middleware.py +3 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/cloud_backup.py +26 -27
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/event_bus.py +250 -88
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/consolidation_cycle.py +33 -16
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/entity_compiler.py +148 -132
- superlocalmemory-3.8.4/src/superlocalmemory/learning/memory_merge.py +175 -0
- superlocalmemory-3.8.4/src/superlocalmemory/learning/reward_archive.py +218 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/reward_boost.py +40 -30
- superlocalmemory-3.8.4/src/superlocalmemory/mcp/http_transport.py +386 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/spreading_activation.py +20 -12
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/vector_store.py +84 -69
- superlocalmemory-3.8.4/src/superlocalmemory/server/loopback.py +91 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/origin.py +9 -4
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/backup.py +6 -2
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/behavioral.py +6 -12
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/compliance.py +20 -23
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/config_api.py +83 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/helpers.py +24 -13
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/memories.py +139 -91
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/mesh.py +7 -2
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/profiles.py +20 -21
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/rbac.py +0 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/tiers.py +42 -30
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/v3_api.py +67 -77
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/unified_daemon.py +246 -39
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/write_identity.py +22 -4
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/database.py +75 -8
- superlocalmemory-3.8.4/src/superlocalmemory/storage/deferred_writes.py +153 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/embedding_migrator.py +19 -0
- superlocalmemory-3.8.4/src/superlocalmemory/storage/memory_write.py +119 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migration_runner.py +7 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +113 -78
- superlocalmemory-3.8.4/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +80 -0
- superlocalmemory-3.8.4/src/superlocalmemory/storage/write_lock.py +88 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/core.js +6 -1
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4/src/superlocalmemory.egg-info}/PKG-INFO +3 -3
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/SOURCES.txt +10 -2
- superlocalmemory-3.8.4/tests/test_audit_hardening_384.py +435 -0
- superlocalmemory-3.8.4/tests/test_graph_pruning_config.py +475 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_isolation_cycle3.py +8 -2
- superlocalmemory-3.8.4/tests/test_m031_startup_automigration.py +497 -0
- superlocalmemory-3.8.4/tests/test_write_lock_hardening.py +189 -0
- superlocalmemory-3.8.2/AUTHORS.md +0 -16
- superlocalmemory-3.8.2/src/superlocalmemory/core/graph_pruner.py +0 -421
- superlocalmemory-3.8.2/src/superlocalmemory/learning/memory_merge.py +0 -160
- superlocalmemory-3.8.2/src/superlocalmemory/learning/reward_archive.py +0 -210
- superlocalmemory-3.8.2/src/superlocalmemory/mcp/http_transport.py +0 -54
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/LICENSE +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/NOTICE +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/setup.cfg +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/access/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/mathematical_dna.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/signer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/attribution/watermark.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/_lazy_init.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/cache_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/compress_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/context_commands.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/daemon.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/db_migrate.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/diagnostics_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/escape_hatch.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/evidence_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/help_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/json_output.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/loop_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/mesh_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/migrate_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/optimize_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/optimize_constants.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/post_install.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/proxy_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/scale_engine_cmd.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/service_installer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/setup_wizard.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/version_banner.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/cli/wizard_v3426_options.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/blast_radius.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/changes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/communities.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/config.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/database.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/extractors/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/extractors/python.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/extractors/typescript.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/flows.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/git_hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/graph_engine.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/graph_store.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/incremental.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/models.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/parser.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/resolver.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/search.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/service.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/code_graph/watcher.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/abac.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/audit.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/eu_ai_act.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/gdpr.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/lifecycle.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/retention.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/compliance/scheduler.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/backend_orchestrator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/block_hygiene.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/clock_monitor.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/community_summary.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/component_healer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/component_registry.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/context_cache.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/db_pool.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/derivation_lineage.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/embedding_worker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/embeddings.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_capabilities.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_ingestion.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_lock.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/engine_wiring.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/entity_community.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/error_catalog.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/error_envelope.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/evidence_bundle.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/file_lock.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/graph_analyzer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/health_monitor.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ingest_gate.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/injection.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/key_expander.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/lifecycle_state.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/loop_watchdog.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/maintenance.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/modes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/mutations.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ollama_embedder.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/pii.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/platform_utils.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/priority_queue.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/profiles.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/progressive_abstraction.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/pruning_engine.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/queue_consumer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/queue_dispatcher.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/ram_lock.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/rate_limit.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_gate.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_queue.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/recall_worker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/reranker_worker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/safe_fs.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/score_contract.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/security_primitives.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/shadow_router.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/slm_disabled.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/slmignore.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/summarizer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/tier_manager.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/topic_signature.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/core/worker_pool.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/eap_scheduler.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/auto_linker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/consolidator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/context_generator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/emotional.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/entity_reflexion.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/entropy_gate.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/fact_extractor.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/foresight.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/graph_builder.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/observation_builder.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/scene_builder.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/signal_inference.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/temporal_parser.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/temporal_validator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/encoding/type_router.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evaluation/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evaluation/calibration.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/blind_verifier.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/budget.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/evolution_store.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/llm_dispatch.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/model_selection.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/mutation_generator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/skill_evolver.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/triggers.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/evolution/types.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/graph/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/graph/cozo_backend.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/antigravity_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_capture.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_invoker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_parameterize.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_recall.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/auto_recall_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/before_web_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/claude_code_hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/codex_assets.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/codex_hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/context_payload.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/copilot_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/cross_platform_connector.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/cursor_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/hook_daemon.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/hook_handlers.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/memory_protocol.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/rules_engine.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/session_registry.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/sync_loop.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/topic_shift_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/user_prompt_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/backup.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/cache_manager.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/daemon_identity.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/data_root.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/heartbeat_monitor.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/local_diagnostics.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/pid_manager.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/process_reaper.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/rate_limiter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/infra/webhook_dispatcher.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/adapter_manager.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/base_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/calendar_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/credentials.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/gmail_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/parsers.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ingestion/transcript_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/adaptive.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/arm_catalog.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/assertion_miner.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/bandit.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/bandit_cache.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/behavioral.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/bootstrap.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/consolidation_worker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/cross_project.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/database.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/dedup_hnsw.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/engagement.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ensemble.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/fact_outcome_joins.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/features.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/feedback.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/forgetting_scheduler.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/hnsw_dedup.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/labeler.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/legacy_migration.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/model_cache.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/model_rollback.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/outcome_queue.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/outcomes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/pattern_miner.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/pattern_miner_constants.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/project_context.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/quantization_scheduler.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker_common.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/ranker_retrain_online.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/reward.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/reward_proxy.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/shadow_test.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/signal_worker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/signals.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/skill_performance_miner.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/source_quality.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/trigram_index.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/learning/workflows.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/llm/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/llm/backbone.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/budget.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/engine.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/ledger.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/models.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/loops/rules.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/ebbinghaus.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/fisher.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/fisher_quantized.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/hopfield.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/langevin.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/polar_quant.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/qjl.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/sheaf.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/math/turbo_quant.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/_daemon_proxy.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/_pool_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/_stdin_guard.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/agent_context.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/cli_fallback.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/profiles.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/resources.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/server.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/shared.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_active.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_code_graph.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_context.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_core.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_evolution.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_learning.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_loops.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_mesh.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_optimize.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_v28.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_v3.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mcp/tools_v33.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mesh/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mesh/broker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/mesh/remote_sync.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/migrations/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/NOTICE +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/adapters/wrap.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/boundary_store.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/centroid_store.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/context_key.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/exact.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/invalidation.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/key_builder.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/manager.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/semantic.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/cache/stampede.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/align.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/ccr.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/compress/router.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/defaults.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/schema.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/config/store.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/counters.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/estimator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/exporters.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/metrics/persistence.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/_helpers.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/capture.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/server.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/storage/db.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/optimize/storage/schema.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/pattern_extractor.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/pii_filter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/prompt_injector.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/agentic.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/ann_index.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/bm25_channel.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/bridge_discovery.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/channel_registry.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/engine.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/entity_channel.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/forgetting_filter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/fusion.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/hopfield_channel.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/profile_channel.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/reranker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/scope_policy.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/semantic_channel.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/strategy.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/temporal_channel.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/temporal_frame.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/retrieval/time_window.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/api.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/bandit_loops.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/config_file.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/middleware/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/middleware/security_headers.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/profile_runtime.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/rbac_enforce.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/recall_health.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/recall_serializer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/route_mutations.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/abstraction.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/adapters.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/agents.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/brain.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/chat.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/data_io.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/entity.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/events.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/evolution.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/ingest.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/insights.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/learning.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/learning_telemetry.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/lifecycle.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/optimize.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/prewarm.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/ratelimit.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/stats.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/timeline.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/token.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/routes/ws.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/security_middleware.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/server/ui.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/access_control.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/access_log.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/logical_edges.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migration_v33.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/migrations.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/models.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/quantized_store.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_code_graph.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v32.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v3410.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v3411.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v343.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v345.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/schema_v347.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/sqlite_vectors.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/storage/v2_migrator.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/gate.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/provenance.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/scorer.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/trust/signals.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/assets/slm-icon.svg +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/brain.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/design-system.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/neural-glass.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/css/od-bridge.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/favicon.svg +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/index.html +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/agents.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/auto-settings.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/brain.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/clusters.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/compliance.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/dashboard.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/event-delegation.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/events.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/fact-detail.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/feedback.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/graph-event-bus.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/graph-filters.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/graph-ui.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ide-status.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/init.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/knowledge-graph.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/lifecycle.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/math-health.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/memories.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/memory-chat.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/memory-timeline.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/modal.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-entities.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-health.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-ingestion.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-mesh.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-shell.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/ng-skills.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-agents.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-auth-gate.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-backup.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-brain.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-components.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-entities.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-graph.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-health.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-mcp.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-memories.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-mesh.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-operations.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-optimize.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-settings.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-shell.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-skills.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/od-team.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/optimize.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/profiles.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/quick-actions.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/recall-lab.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/search.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/settings.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/timeline.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/js/trust-dashboard.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/ui/vendor/sigma.min.js +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/vector/__init__.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory/vector/lancedb_backend.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/dependency_links.txt +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/entry_points.txt +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/requires.txt +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/src/superlocalmemory.egg-info/top_level.txt +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_auto_hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_before_web_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_behavioral_full.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_claude_hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_cli_core.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_cli_json.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_cli_v33.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_compliance_full.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_config_system.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_dashboard_preserve_embedding.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_engine_hooks.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_event_bus.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_features.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_final_locomo_mini.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_graph_integrity.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_hook_handlers.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_ide_connector.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_infra.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_injection.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_learning_advanced.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_learning_collectors.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_llm_provider.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_mcp_server.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_migration.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_mode_switch_preservation.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_post_install.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_ranker.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_resource_lifecycle.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_topic_shift_hook.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_trust_full.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_v3_api.py +0 -0
- {superlocalmemory-3.8.2 → superlocalmemory-3.8.4}/tests/test_version_consistency.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superlocalmemory
|
|
3
|
-
Version: 3.8.
|
|
3
|
+
Version: 3.8.4
|
|
4
4
|
Summary: Local-first agent memory with auditable hybrid retrieval
|
|
5
5
|
Author-email: Varun Pratap Bhardwaj <admin@superlocalmemory.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -106,10 +106,10 @@ Dynamic: license-file
|
|
|
106
106
|
</picture>
|
|
107
107
|
</p>
|
|
108
108
|
|
|
109
|
-
<h1 align="center">SuperLocalMemory V3.8.
|
|
109
|
+
<h1 align="center">SuperLocalMemory V3.8.4</h1>
|
|
110
110
|
<p align="center"><strong>Enterprise-grade, local-first memory for AI agents and teams.</strong><br/>
|
|
111
111
|
<em>A persistent, auditable long-term brain for your agents that runs on your own infrastructure — with multi-workspace isolation, role-based access, and GDPR + EU AI Act governance controls built in.</em></p>
|
|
112
|
-
<p align="center"><code>v3.8.
|
|
112
|
+
<p align="center"><code>v3.8.4</code> — one control plane: auditable retrieval · multi-scope memory (personal / shared / global) · Cache · Compress · trusted-peer Mesh · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
|
|
113
113
|
Proxy: <code>slm wrap claude</code> · MCP: add <code>slm_compress</code> to your config · Skill: zero-config</p>
|
|
114
114
|
<p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
|
|
115
115
|
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
</picture>
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
|
-
<h1 align="center">SuperLocalMemory V3.8.
|
|
8
|
+
<h1 align="center">SuperLocalMemory V3.8.4</h1>
|
|
9
9
|
<p align="center"><strong>Enterprise-grade, local-first memory for AI agents and teams.</strong><br/>
|
|
10
10
|
<em>A persistent, auditable long-term brain for your agents that runs on your own infrastructure — with multi-workspace isolation, role-based access, and GDPR + EU AI Act governance controls built in.</em></p>
|
|
11
|
-
<p align="center"><code>v3.8.
|
|
11
|
+
<p align="center"><code>v3.8.4</code> — one control plane: auditable retrieval · multi-scope memory (personal / shared / global) · Cache · Compress · trusted-peer Mesh · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
|
|
12
12
|
Proxy: <code>slm wrap claude</code> · MCP: add <code>slm_compress</code> to your config · Skill: zero-config</p>
|
|
13
13
|
<p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
|
|
14
14
|
|
|
@@ -128,4 +128,4 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
|
|
|
128
128
|
- **slm-optimize-advisor** — context compression and KV cache
|
|
129
129
|
- **slm-governance-advisor** — scope/role compliance, retention policies, GDPR
|
|
130
130
|
|
|
131
|
-
SuperLocalMemory v3.8.
|
|
131
|
+
SuperLocalMemory v3.8.4 · Qualixar · AGPL-3.0-or-later
|
|
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
|
|
|
32
32
|
os.environ["OMP_NUM_THREADS"] = "2"
|
|
33
33
|
# ---------------------------------------------------------------------------
|
|
34
34
|
|
|
35
|
-
__version__ = "3.8.
|
|
35
|
+
__version__ = "3.8.4"
|
|
36
36
|
|
|
37
37
|
_REQUIRED_VERSIONS = {
|
|
38
38
|
"sentence_transformers": "5.3.0",
|
|
@@ -32,6 +32,7 @@ from __future__ import annotations
|
|
|
32
32
|
import hashlib
|
|
33
33
|
import hmac
|
|
34
34
|
import logging
|
|
35
|
+
import os
|
|
35
36
|
import secrets
|
|
36
37
|
import sqlite3
|
|
37
38
|
import uuid
|
|
@@ -39,9 +40,14 @@ from datetime import datetime, timedelta, timezone
|
|
|
39
40
|
from enum import Enum
|
|
40
41
|
from pathlib import Path
|
|
41
42
|
|
|
43
|
+
from superlocalmemory.storage.memory_write import memory_write
|
|
44
|
+
|
|
42
45
|
logger = logging.getLogger("superlocalmemory.access.rbac")
|
|
43
46
|
|
|
44
|
-
|
|
47
|
+
# Match the daemon's default (SLM_DB_BUSY_TIMEOUT_MS, default 10 000 ms).
|
|
48
|
+
# Reads use this via _conn(); writes go through memory_write() which reads the
|
|
49
|
+
# same env var internally, so in-process writers never see SQLITE_BUSY.
|
|
50
|
+
_BUSY_TIMEOUT_MS: int = max(0, int(os.environ.get("SLM_DB_BUSY_TIMEOUT_MS", "10000")))
|
|
45
51
|
_SESSION_TTL_HOURS = 12
|
|
46
52
|
|
|
47
53
|
# scrypt cost parameters (OWASP-recommended interactive-login range).
|
|
@@ -155,16 +161,15 @@ class RbacEngine:
|
|
|
155
161
|
raise RbacError("Username is required.")
|
|
156
162
|
pw_hash = _hash_password(password)
|
|
157
163
|
user_id = _uid()
|
|
158
|
-
|
|
159
|
-
|
|
164
|
+
# memory_write: process write lock + busy_timeout.
|
|
165
|
+
with memory_write(self._db_path) as conn:
|
|
160
166
|
# The UNIQUE(username) constraint is the source of truth; the SELECT
|
|
161
167
|
# is a fast path. Two concurrent creates can both pass the SELECT, so
|
|
162
168
|
# the loser's INSERT hits the constraint — convert that to RbacError
|
|
163
169
|
# (409) instead of leaking a raw IntegrityError as a 500.
|
|
164
|
-
|
|
170
|
+
if conn.execute(
|
|
165
171
|
"SELECT 1 FROM rbac_users WHERE username=?", (username,)
|
|
166
|
-
).fetchone()
|
|
167
|
-
if exists:
|
|
172
|
+
).fetchone():
|
|
168
173
|
raise RbacError(f"User '{username}' already exists.")
|
|
169
174
|
try:
|
|
170
175
|
conn.execute(
|
|
@@ -174,19 +179,15 @@ class RbacEngine:
|
|
|
174
179
|
(user_id, username, display_name or username, pw_hash,
|
|
175
180
|
_now(), created_by),
|
|
176
181
|
)
|
|
177
|
-
conn.commit()
|
|
178
182
|
except sqlite3.IntegrityError:
|
|
179
183
|
raise RbacError(f"User '{username}' already exists.")
|
|
180
|
-
finally:
|
|
181
|
-
conn.close()
|
|
182
184
|
logger.info("RBAC: created user '%s' (%s)", username, user_id)
|
|
183
185
|
return {"user_id": user_id, "username": username,
|
|
184
186
|
"display_name": display_name or username, "status": "active"}
|
|
185
187
|
|
|
186
188
|
def set_password(self, user_id: str, password: str) -> None:
|
|
187
189
|
pw_hash = _hash_password(password)
|
|
188
|
-
|
|
189
|
-
try:
|
|
190
|
+
with memory_write(self._db_path) as conn:
|
|
190
191
|
cur = conn.execute(
|
|
191
192
|
"UPDATE rbac_users SET password_hash=? WHERE user_id=?",
|
|
192
193
|
(pw_hash, user_id),
|
|
@@ -195,15 +196,11 @@ class RbacEngine:
|
|
|
195
196
|
raise RbacError("User not found.")
|
|
196
197
|
# A password change invalidates every existing session.
|
|
197
198
|
conn.execute("DELETE FROM rbac_sessions WHERE user_id=?", (user_id,))
|
|
198
|
-
conn.commit()
|
|
199
|
-
finally:
|
|
200
|
-
conn.close()
|
|
201
199
|
|
|
202
200
|
def set_status(self, user_id: str, status: str) -> None:
|
|
203
201
|
if status not in ("active", "disabled"):
|
|
204
202
|
raise RbacError("status must be 'active' or 'disabled'.")
|
|
205
|
-
|
|
206
|
-
try:
|
|
203
|
+
with memory_write(self._db_path) as conn:
|
|
207
204
|
cur = conn.execute(
|
|
208
205
|
"UPDATE rbac_users SET status=? WHERE user_id=?", (status, user_id)
|
|
209
206
|
)
|
|
@@ -211,21 +208,14 @@ class RbacEngine:
|
|
|
211
208
|
raise RbacError("User not found.")
|
|
212
209
|
if status == "disabled":
|
|
213
210
|
conn.execute("DELETE FROM rbac_sessions WHERE user_id=?", (user_id,))
|
|
214
|
-
conn.commit()
|
|
215
|
-
finally:
|
|
216
|
-
conn.close()
|
|
217
211
|
|
|
218
212
|
def delete_user(self, user_id: str) -> None:
|
|
219
|
-
|
|
220
|
-
try:
|
|
213
|
+
with memory_write(self._db_path) as conn:
|
|
221
214
|
conn.execute("DELETE FROM rbac_sessions WHERE user_id=?", (user_id,))
|
|
222
215
|
conn.execute("DELETE FROM rbac_memberships WHERE user_id=?", (user_id,))
|
|
223
216
|
cur = conn.execute("DELETE FROM rbac_users WHERE user_id=?", (user_id,))
|
|
224
217
|
if cur.rowcount == 0:
|
|
225
218
|
raise RbacError("User not found.")
|
|
226
|
-
conn.commit()
|
|
227
|
-
finally:
|
|
228
|
-
conn.close()
|
|
229
219
|
|
|
230
220
|
def get_user(self, user_id: str) -> dict | None:
|
|
231
221
|
conn = self._conn()
|
|
@@ -277,25 +267,35 @@ class RbacEngine:
|
|
|
277
267
|
raw = secrets.token_urlsafe(32)
|
|
278
268
|
now = datetime.now(timezone.utc)
|
|
279
269
|
expires = (now + timedelta(hours=ttl_hours)).isoformat()
|
|
280
|
-
|
|
281
|
-
try:
|
|
270
|
+
with memory_write(self._db_path) as conn:
|
|
282
271
|
conn.execute(
|
|
283
272
|
"INSERT INTO rbac_sessions (token_hash, user_id, created_at, "
|
|
284
273
|
"expires_at, last_seen) VALUES (?, ?, ?, ?, ?)",
|
|
285
274
|
(_hash_token(raw), user_id, now.isoformat(), expires, now.isoformat()),
|
|
286
275
|
)
|
|
287
|
-
conn.commit()
|
|
288
|
-
finally:
|
|
289
|
-
conn.close()
|
|
290
276
|
return raw
|
|
291
277
|
|
|
292
278
|
def resolve_session(self, raw_token: str) -> dict | None:
|
|
293
279
|
"""Return the active user for a session token, or None if invalid /
|
|
294
|
-
expired / disabled. Updates last_seen. Constant-time by hash lookup.
|
|
280
|
+
expired / disabled. Updates last_seen. Constant-time by hash lookup.
|
|
281
|
+
|
|
282
|
+
Concurrency design
|
|
283
|
+
------------------
|
|
284
|
+
Phase 1 (read): WAL allows concurrent readers without blocking the
|
|
285
|
+
writer — ``_conn()`` with ``busy_timeout`` only. The write lock is
|
|
286
|
+
NOT taken here so a burst of concurrent requests doesn't serialise
|
|
287
|
+
through the single writer on every call.
|
|
288
|
+
|
|
289
|
+
Phase 2 (conditional write): only if the session is expired/stale.
|
|
290
|
+
``memory_write()`` is opened AFTER the read connection is closed
|
|
291
|
+
(lock-ordering invariant: get_write_lock is outermost).
|
|
292
|
+
"""
|
|
295
293
|
if not raw_token:
|
|
296
294
|
return None
|
|
297
295
|
token_hash = _hash_token(raw_token)
|
|
298
296
|
now = datetime.now(timezone.utc)
|
|
297
|
+
|
|
298
|
+
# -- Phase 1: read-only lookup ----------------------------------------
|
|
299
299
|
conn = self._conn()
|
|
300
300
|
try:
|
|
301
301
|
row = conn.execute(
|
|
@@ -310,48 +310,52 @@ class RbacEngine:
|
|
|
310
310
|
expired = datetime.fromisoformat(row["expires_at"]) <= now
|
|
311
311
|
except ValueError:
|
|
312
312
|
expired = True
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
313
|
+
row_status = row["status"]
|
|
314
|
+
row_last_seen = row["last_seen"]
|
|
315
|
+
user_dict = {
|
|
316
|
+
"user_id": row["user_id"],
|
|
317
|
+
"username": row["username"],
|
|
318
|
+
"display_name": row["display_name"],
|
|
319
|
+
}
|
|
320
|
+
finally:
|
|
321
|
+
conn.close()
|
|
322
|
+
|
|
323
|
+
# -- Phase 2: write if needed (read conn closed above) ----------------
|
|
324
|
+
if expired or row_status != "active":
|
|
325
|
+
with memory_write(self._db_path) as wconn:
|
|
326
|
+
wconn.execute(
|
|
327
|
+
"DELETE FROM rbac_sessions WHERE token_hash=?", (token_hash,)
|
|
328
|
+
)
|
|
329
|
+
return None
|
|
330
|
+
|
|
331
|
+
# Debounce last_seen: only write when stale (>60 s), so a burst of
|
|
332
|
+
# authenticated requests does not serialise through the writer every call.
|
|
333
|
+
stale = True
|
|
334
|
+
try:
|
|
335
|
+
stale = (now - datetime.fromisoformat(row_last_seen)).total_seconds() > 60
|
|
336
|
+
except (ValueError, TypeError, KeyError):
|
|
320
337
|
stale = True
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
stale = True
|
|
325
|
-
if stale:
|
|
326
|
-
conn.execute(
|
|
338
|
+
if stale:
|
|
339
|
+
with memory_write(self._db_path) as wconn:
|
|
340
|
+
wconn.execute(
|
|
327
341
|
"UPDATE rbac_sessions SET last_seen=? WHERE token_hash=?",
|
|
328
342
|
(now.isoformat(), token_hash),
|
|
329
343
|
)
|
|
330
|
-
|
|
331
|
-
return {"user_id": row["user_id"], "username": row["username"],
|
|
332
|
-
"display_name": row["display_name"]}
|
|
333
|
-
finally:
|
|
334
|
-
conn.close()
|
|
344
|
+
return user_dict
|
|
335
345
|
|
|
336
346
|
def revoke_session(self, raw_token: str) -> None:
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
finally:
|
|
343
|
-
conn.close()
|
|
347
|
+
with memory_write(self._db_path) as conn:
|
|
348
|
+
conn.execute(
|
|
349
|
+
"DELETE FROM rbac_sessions WHERE token_hash=?",
|
|
350
|
+
(_hash_token(raw_token),),
|
|
351
|
+
)
|
|
344
352
|
|
|
345
353
|
def purge_expired_sessions(self) -> int:
|
|
346
|
-
|
|
347
|
-
try:
|
|
354
|
+
with memory_write(self._db_path) as conn:
|
|
348
355
|
cur = conn.execute(
|
|
349
356
|
"DELETE FROM rbac_sessions WHERE expires_at <= ?", (_now(),)
|
|
350
357
|
)
|
|
351
|
-
|
|
352
|
-
return cur.rowcount or 0
|
|
353
|
-
finally:
|
|
354
|
-
conn.close()
|
|
358
|
+
return cur.rowcount or 0
|
|
355
359
|
|
|
356
360
|
# -- memberships ------------------------------------------------------
|
|
357
361
|
|
|
@@ -361,8 +365,7 @@ class RbacEngine:
|
|
|
361
365
|
role_enum = Role(role)
|
|
362
366
|
except ValueError:
|
|
363
367
|
raise RbacError(f"Invalid role '{role}'. Use admin/member/viewer.")
|
|
364
|
-
|
|
365
|
-
try:
|
|
368
|
+
with memory_write(self._db_path) as conn:
|
|
366
369
|
if not conn.execute(
|
|
367
370
|
"SELECT 1 FROM rbac_users WHERE user_id=?", (user_id,)
|
|
368
371
|
).fetchone():
|
|
@@ -374,21 +377,14 @@ class RbacEngine:
|
|
|
374
377
|
"added_at=excluded.added_at, added_by=excluded.added_by",
|
|
375
378
|
(profile_id, user_id, role_enum.value, _now(), added_by),
|
|
376
379
|
)
|
|
377
|
-
conn.commit()
|
|
378
|
-
finally:
|
|
379
|
-
conn.close()
|
|
380
380
|
return {"profile_id": profile_id, "user_id": user_id, "role": role_enum.value}
|
|
381
381
|
|
|
382
382
|
def remove_membership(self, profile_id: str, user_id: str) -> None:
|
|
383
|
-
|
|
384
|
-
try:
|
|
383
|
+
with memory_write(self._db_path) as conn:
|
|
385
384
|
conn.execute(
|
|
386
385
|
"DELETE FROM rbac_memberships WHERE profile_id=? AND user_id=?",
|
|
387
386
|
(profile_id, user_id),
|
|
388
387
|
)
|
|
389
|
-
conn.commit()
|
|
390
|
-
finally:
|
|
391
|
-
conn.close()
|
|
392
388
|
|
|
393
389
|
def get_role(self, user_id: str, profile_id: str) -> Role | None:
|
|
394
390
|
conn = self._conn()
|
|
@@ -442,16 +438,12 @@ class RbacEngine:
|
|
|
442
438
|
conn.close()
|
|
443
439
|
|
|
444
440
|
def set_policy(self, key: str, value: str) -> None:
|
|
445
|
-
|
|
446
|
-
try:
|
|
441
|
+
with memory_write(self._db_path) as conn:
|
|
447
442
|
conn.execute(
|
|
448
443
|
"INSERT INTO rbac_settings (key, value) VALUES (?, ?) "
|
|
449
444
|
"ON CONFLICT(key) DO UPDATE SET value=excluded.value",
|
|
450
445
|
(key, value),
|
|
451
446
|
)
|
|
452
|
-
conn.commit()
|
|
453
|
-
finally:
|
|
454
|
-
conn.close()
|
|
455
447
|
|
|
456
448
|
def require_login(self) -> bool:
|
|
457
449
|
"""Company mode: mutations require a valid user session (no owner
|
|
@@ -1135,6 +1135,9 @@ def cmd_connect(args: Namespace) -> None:
|
|
|
1135
1135
|
if ide_arg in IDE_MATRIX:
|
|
1136
1136
|
here = getattr(args, "here", False)
|
|
1137
1137
|
profile = getattr(args, "profile", None)
|
|
1138
|
+
transport = getattr(args, "transport", "stdio")
|
|
1139
|
+
daemon_port = getattr(args, "daemon_port", 8765)
|
|
1140
|
+
verify = getattr(args, "verify", False)
|
|
1138
1141
|
project = None
|
|
1139
1142
|
if here:
|
|
1140
1143
|
import pathlib
|
|
@@ -1148,8 +1151,24 @@ def cmd_connect(args: Namespace) -> None:
|
|
|
1148
1151
|
profile=profile,
|
|
1149
1152
|
agents_md_source=_agents_md_source_factory(),
|
|
1150
1153
|
dry_run=getattr(args, "dry_run", False),
|
|
1154
|
+
transport=transport,
|
|
1155
|
+
daemon_port=daemon_port,
|
|
1151
1156
|
)
|
|
1152
1157
|
|
|
1158
|
+
# --verify: probe daemon health after writing
|
|
1159
|
+
if verify and transport in ("http", "http-mcp-remote") and not result.get("error"):
|
|
1160
|
+
from superlocalmemory.hooks.portable_kit import _check_daemon_health
|
|
1161
|
+
reachable = _check_daemon_health(daemon_port)
|
|
1162
|
+
if reachable:
|
|
1163
|
+
print(f"[verify] Daemon reachable at http://127.0.0.1:{daemon_port}/api/v3/health")
|
|
1164
|
+
else:
|
|
1165
|
+
print(
|
|
1166
|
+
f"[verify] Warning: daemon NOT reachable at "
|
|
1167
|
+
f"http://127.0.0.1:{daemon_port}/api/v3/health. "
|
|
1168
|
+
f"Run `slm serve start` to start it.",
|
|
1169
|
+
file=sys.stderr,
|
|
1170
|
+
)
|
|
1171
|
+
|
|
1153
1172
|
if not result.get("error") and not getattr(args, "dry_run", False):
|
|
1154
1173
|
from superlocalmemory.infra.local_diagnostics import record_operation
|
|
1155
1174
|
|
|
@@ -281,15 +281,25 @@ def _write_tool_events(events: list[dict]) -> int:
|
|
|
281
281
|
|
|
282
282
|
v3.4.10: Preserves input_summary, output_summary, and project_path
|
|
283
283
|
from enriched sources (ECC observations, enriched hook).
|
|
284
|
+
|
|
285
|
+
Concurrency note
|
|
286
|
+
----------------
|
|
287
|
+
``slm ingest`` is a SEPARATE OS process — the daemon's threading.RLock
|
|
288
|
+
write-lock cannot help here. PRAGMA busy_timeout is the only cross-process
|
|
289
|
+
lever: it makes SQLite WAIT for the single writer (daemon / hook) to finish
|
|
290
|
+
instead of immediately raising SQLITE_BUSY. The ``timeout`` kwarg to
|
|
291
|
+
sqlite3.connect is the Python-level retry budget (same duration).
|
|
284
292
|
"""
|
|
285
293
|
db_path = Path(MEMORY_DB)
|
|
286
294
|
if not db_path.exists():
|
|
287
295
|
return 0
|
|
288
296
|
|
|
289
|
-
|
|
297
|
+
_busy_ms = 10_000
|
|
298
|
+
conn = sqlite3.connect(str(db_path), timeout=_busy_ms / 1000.0)
|
|
290
299
|
count = 0
|
|
291
300
|
|
|
292
301
|
try:
|
|
302
|
+
conn.execute(f"PRAGMA busy_timeout={_busy_ms}")
|
|
293
303
|
for ev in events:
|
|
294
304
|
try:
|
|
295
305
|
conn.execute(
|
|
@@ -252,6 +252,36 @@ def main() -> None:
|
|
|
252
252
|
"--dry-run", action="store_true", dest="dry_run", default=False,
|
|
253
253
|
help="Show what would be written without making changes",
|
|
254
254
|
)
|
|
255
|
+
# Workstream C — transport flexibility (3.8.4)
|
|
256
|
+
connect_p.add_argument(
|
|
257
|
+
"--transport",
|
|
258
|
+
choices=["stdio", "http", "http-mcp-remote"],
|
|
259
|
+
default="stdio",
|
|
260
|
+
dest="transport",
|
|
261
|
+
help=(
|
|
262
|
+
"MCP transport to write into the IDE config. "
|
|
263
|
+
"stdio (default, zero regression) | "
|
|
264
|
+
"http (native Streamable-HTTP, requires SLM daemon) | "
|
|
265
|
+
"http-mcp-remote (stdio bridge via mcp-remote for stdio-only clients)"
|
|
266
|
+
),
|
|
267
|
+
)
|
|
268
|
+
connect_p.add_argument(
|
|
269
|
+
"--port",
|
|
270
|
+
type=int,
|
|
271
|
+
default=8765,
|
|
272
|
+
dest="daemon_port",
|
|
273
|
+
help="SLM daemon port for http/http-mcp-remote transport (default: 8765)",
|
|
274
|
+
)
|
|
275
|
+
connect_p.add_argument(
|
|
276
|
+
"--verify",
|
|
277
|
+
action="store_true",
|
|
278
|
+
default=False,
|
|
279
|
+
dest="verify",
|
|
280
|
+
help=(
|
|
281
|
+
"After writing the config, probe the daemon health endpoint to confirm "
|
|
282
|
+
"the transport is reachable (only meaningful for --transport http)"
|
|
283
|
+
),
|
|
284
|
+
)
|
|
255
285
|
|
|
256
286
|
migrate_p = sub.add_parser("migrate", help="Migrate data from V2 to V3 schema")
|
|
257
287
|
migrate_p.add_argument(
|
|
@@ -40,6 +40,13 @@ _MAX_RETRIES = 3
|
|
|
40
40
|
_STUCK_DAYS = 7
|
|
41
41
|
_MAX_RETRY_DELAY_SECONDS = 3600
|
|
42
42
|
|
|
43
|
+
# Fix F: hard cap on pending.db retries. After this many failed attempts the
|
|
44
|
+
# item transitions to status='dead_letter' (next_retry_at=NULL) so it is
|
|
45
|
+
# permanently excluded from the work queue. Value chosen to survive transient
|
|
46
|
+
# engine unavailability (12h at 30-min drain intervals) while still providing
|
|
47
|
+
# a definitive signal for genuinely poisoned content.
|
|
48
|
+
_MAX_RETRY_COUNT: int = 20
|
|
49
|
+
|
|
43
50
|
_SCHEMA = """
|
|
44
51
|
CREATE TABLE IF NOT EXISTS pending_memories (
|
|
45
52
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -180,9 +187,17 @@ def mark_done(row_id: int, base_dir: Path | None = None) -> None:
|
|
|
180
187
|
def mark_failed(row_id: int, error: str, base_dir: Path | None = None) -> None:
|
|
181
188
|
"""Mark a pending memory as failed with error message.
|
|
182
189
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
190
|
+
Fix F: when the retry counter reaches _MAX_RETRY_COUNT the item transitions
|
|
191
|
+
to ``status='dead_letter'`` with ``next_retry_at=NULL``. Dead-lettered
|
|
192
|
+
items are excluded from the work queue (``get_pending`` filters
|
|
193
|
+
``status='pending'``) and are not resurrected by the startup
|
|
194
|
+
``UPDATE…WHERE status='failed'`` sweep (which targets only 'failed', not
|
|
195
|
+
'dead_letter'). This gives operators a stable, inspectable record of
|
|
196
|
+
genuinely poisoned content instead of an infinite retry loop.
|
|
197
|
+
|
|
198
|
+
Below the cap, failures stay pending with bounded exponential backoff;
|
|
199
|
+
M018 idempotency makes repeated replay safe once the canonical operation
|
|
200
|
+
has been created.
|
|
186
201
|
"""
|
|
187
202
|
conn = _get_db(base_dir)
|
|
188
203
|
try:
|
|
@@ -193,17 +208,27 @@ def mark_failed(row_id: int, error: str, base_dir: Path | None = None) -> None:
|
|
|
193
208
|
if row is None:
|
|
194
209
|
return
|
|
195
210
|
next_count = int(row[0] or 0) + 1
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
211
|
+
if next_count >= _MAX_RETRY_COUNT:
|
|
212
|
+
# Fix F: permanently exclude from work queue — dead-letter.
|
|
213
|
+
conn.execute(
|
|
214
|
+
"UPDATE pending_memories SET error = ?, "
|
|
215
|
+
"retry_count = retry_count + 1, "
|
|
216
|
+
"status = 'dead_letter', next_retry_at = NULL "
|
|
217
|
+
"WHERE id = ?",
|
|
218
|
+
(error, row_id),
|
|
219
|
+
)
|
|
220
|
+
else:
|
|
221
|
+
delay = 0 if next_count == 1 else min(
|
|
222
|
+
2 ** min(next_count - 1, 12),
|
|
223
|
+
_MAX_RETRY_DELAY_SECONDS,
|
|
224
|
+
)
|
|
225
|
+
conn.execute(
|
|
226
|
+
"UPDATE pending_memories SET error = ?, "
|
|
227
|
+
"retry_count = retry_count + 1, "
|
|
228
|
+
"status = 'pending', next_retry_at = ? "
|
|
229
|
+
"WHERE id = ?",
|
|
230
|
+
(error, time.time() + delay, row_id),
|
|
231
|
+
)
|
|
207
232
|
conn.commit()
|
|
208
233
|
finally:
|
|
209
234
|
conn.close()
|
|
@@ -960,6 +960,29 @@ class HealthConfig:
|
|
|
960
960
|
enable_structured_logging: bool = True
|
|
961
961
|
|
|
962
962
|
|
|
963
|
+
# ---------------------------------------------------------------------------
|
|
964
|
+
# Graph Pruning Config (Workstream G — #84)
|
|
965
|
+
# ---------------------------------------------------------------------------
|
|
966
|
+
|
|
967
|
+
@dataclass
|
|
968
|
+
class GraphPruningConfig:
|
|
969
|
+
"""Graph thinning parameters. Exposed via dashboard + CLI.
|
|
970
|
+
|
|
971
|
+
Defaults reproduce the previous hard-coded behaviour so existing
|
|
972
|
+
deployments see zero behavioural change after upgrade.
|
|
973
|
+
"""
|
|
974
|
+
|
|
975
|
+
#: Maximum in- or out-degree per node. Maps to the legacy module-level
|
|
976
|
+
#: ``_MAX_DEGREE_PER_NODE = 100`` in graph_pruner.py.
|
|
977
|
+
max_degree_per_node: int = 100
|
|
978
|
+
#: Discard edges with weight strictly below this floor.
|
|
979
|
+
#: 0.0 = no floor (current behaviour, always-safe default).
|
|
980
|
+
min_edge_weight: float = 0.0
|
|
981
|
+
#: Master kill-switch for all graph pruning. ``False`` skips the entire
|
|
982
|
+
#: prune step (useful for debugging graph bloat).
|
|
983
|
+
enabled: bool = True
|
|
984
|
+
|
|
985
|
+
|
|
963
986
|
# ---------------------------------------------------------------------------
|
|
964
987
|
# Master Config
|
|
965
988
|
# ---------------------------------------------------------------------------
|
|
@@ -1010,6 +1033,8 @@ class SLMConfig:
|
|
|
1010
1033
|
scale_engine_state: str = "local_core" # local_core | prepared | verified | promoted
|
|
1011
1034
|
evolution: EvolutionConfig = field(default_factory=EvolutionConfig)
|
|
1012
1035
|
health: HealthConfig = field(default_factory=HealthConfig)
|
|
1036
|
+
# v3.8.4-G: Graph thinning parameters (#84)
|
|
1037
|
+
graph_pruning: GraphPruningConfig = field(default_factory=GraphPruningConfig)
|
|
1013
1038
|
|
|
1014
1039
|
# v3.4.3: Daemon configuration
|
|
1015
1040
|
daemon_idle_timeout: int = 0 # 0 = 24/7 (no auto-kill). >0 = seconds before auto-kill.
|
|
@@ -1174,6 +1199,31 @@ class SLMConfig:
|
|
|
1174
1199
|
if k in HealthConfig.__dataclass_fields__
|
|
1175
1200
|
})
|
|
1176
1201
|
|
|
1202
|
+
# v3.8.4-G: Graph pruning config (#84) — additive, no migration needed.
|
|
1203
|
+
# Old configs without this section silently fall back to GraphPruningConfig()
|
|
1204
|
+
# defaults, which reproduce the existing _MAX_DEGREE_PER_NODE=100 behaviour.
|
|
1205
|
+
gp_raw = data.get("graph_pruning", {})
|
|
1206
|
+
if gp_raw:
|
|
1207
|
+
try:
|
|
1208
|
+
gp_kwargs = {
|
|
1209
|
+
k: v for k, v in gp_raw.items()
|
|
1210
|
+
if k in GraphPruningConfig.__dataclass_fields__
|
|
1211
|
+
}
|
|
1212
|
+
gp = GraphPruningConfig(**gp_kwargs)
|
|
1213
|
+
# Validate and clamp out-of-range values
|
|
1214
|
+
max_deg = gp.max_degree_per_node if gp.max_degree_per_node >= 1 else 100
|
|
1215
|
+
min_w = max(0.0, min(1.0, gp.min_edge_weight))
|
|
1216
|
+
config.graph_pruning = GraphPruningConfig(
|
|
1217
|
+
max_degree_per_node=max_deg,
|
|
1218
|
+
min_edge_weight=min_w,
|
|
1219
|
+
enabled=gp.enabled,
|
|
1220
|
+
)
|
|
1221
|
+
except (ValueError, TypeError) as exc:
|
|
1222
|
+
logger.warning(
|
|
1223
|
+
"graph_pruning config invalid (%s) — using defaults", exc
|
|
1224
|
+
)
|
|
1225
|
+
config.graph_pruning = GraphPruningConfig()
|
|
1226
|
+
|
|
1177
1227
|
# V3.4.65: Injection config (additive — defaults if missing from JSON)
|
|
1178
1228
|
inj = data.get("injection", {}) or {}
|
|
1179
1229
|
config.injection = InjectionConfig(
|
|
@@ -1329,6 +1379,14 @@ class SLMConfig:
|
|
|
1329
1379
|
# Multi-scope memory: behaviour defaults
|
|
1330
1380
|
data["scope"] = self.scope.as_dict()
|
|
1331
1381
|
|
|
1382
|
+
# v3.8.4-G: Persist graph pruning config (#84).
|
|
1383
|
+
# Always written — additive key, never overwrites unrelated sections.
|
|
1384
|
+
data["graph_pruning"] = {
|
|
1385
|
+
"max_degree_per_node": self.graph_pruning.max_degree_per_node,
|
|
1386
|
+
"min_edge_weight": self.graph_pruning.min_edge_weight,
|
|
1387
|
+
"enabled": self.graph_pruning.enabled,
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1332
1390
|
# Preserve existing V3.3 config sections that aren't in for_mode()
|
|
1333
1391
|
for key in ("forgetting", "quantization", "sagq", "embedding_signature", "auto_invoke"):
|
|
1334
1392
|
if key in existing:
|