superlocalmemory 4.1.13 → 4.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Session Summary — issue #113 bounded summary.
|
|
6
|
-
|
|
7
|
-
CRITICAL DATA HONESTY NOTE
|
|
8
|
-
---------------------------
|
|
9
|
-
On a real 3,294-fact store, only 127 facts (3.9%) carry a session_id.
|
|
10
|
-
A Session Summary that presents itself as "everything you did this session"
|
|
11
|
-
while silently covering 4% of the facts is overclaiming — the same defect
|
|
12
|
-
removed from brain/truth.py.
|
|
13
|
-
|
|
14
|
-
Coverage is ALWAYS disclosed. If the session has too few facts to summarise
|
|
15
|
-
meaningfully we say so; we never silently return partial data as complete.
|
|
16
|
-
|
|
17
|
-
DETERMINISTIC FALLBACK IS MANDATORY
|
|
18
|
-
-------------------------------------
|
|
19
|
-
Mode A users have no LLM at all. Mode B/C users lose theirs whenever Ollama
|
|
20
|
-
or the network is down. Every call to generate_session_summary() MUST return
|
|
21
|
-
a SummaryResult. It may say the data is insufficient; it may never return
|
|
22
|
-
None or an empty result. The extractive fallback path is always active.
|
|
23
|
-
|
|
24
|
-
HOT PATH EXCLUSION
|
|
25
|
-
-------------------
|
|
26
|
-
This module must NEVER be imported from core/recall_pipeline.py or
|
|
27
|
-
core/store_pipeline.py. Summary generation performs multi-table reads and
|
|
28
|
-
optional LLM calls. It belongs in background maintenance or on explicit
|
|
29
|
-
user request only.
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
from __future__ import annotations
|
|
33
|
-
|
|
34
|
-
import logging
|
|
35
|
-
import sqlite3
|
|
36
|
-
from datetime import date, timezone
|
|
37
|
-
from pathlib import Path
|
|
38
|
-
|
|
39
|
-
from .base import (
|
|
40
|
-
clean_llm_summary,
|
|
41
|
-
format_highlight,
|
|
42
|
-
SUMMARY_SYSTEM_PROMPT,
|
|
43
|
-
COVERAGE_FULL,
|
|
44
|
-
COVERAGE_INSUFFICIENT,
|
|
45
|
-
COVERAGE_NO_SESSION,
|
|
46
|
-
COVERAGE_PARTIAL,
|
|
47
|
-
COVERAGE_UNAVAILABLE,
|
|
48
|
-
GENERATED_BY_EXTRACTIVE,
|
|
49
|
-
GENERATED_BY_LLM_B,
|
|
50
|
-
GENERATED_BY_LLM_C,
|
|
51
|
-
SummaryResult,
|
|
52
|
-
get_mode_str,
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
logger = logging.getLogger("superlocalmemory.summaries.session")
|
|
56
|
-
|
|
57
|
-
# Minimum number of session facts to attempt a meaningful summary.
|
|
58
|
-
# Below this threshold we return coverage=insufficient and a stub.
|
|
59
|
-
_MIN_FACTS = 3
|
|
60
|
-
|
|
61
|
-
# Maximum facts to include in the content body (extractive mode).
|
|
62
|
-
_BODY_FACTS = 7
|
|
63
|
-
|
|
64
|
-
# Maximum character length for a single fact in the body.
|
|
65
|
-
_MAX_FACT_CHARS = 250
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def generate_session_summary(
|
|
69
|
-
db_path: str | Path,
|
|
70
|
-
session_id: str,
|
|
71
|
-
profile_id: str = "default",
|
|
72
|
-
config: object | None = None,
|
|
73
|
-
) -> SummaryResult:
|
|
74
|
-
"""Generate a Session Summary for a specific session.
|
|
75
|
-
|
|
76
|
-
COVERAGE DISCLOSURE: session data is sparse on real stores (~3.9% of
|
|
77
|
-
facts carry a session_id). The returned SummaryResult.coverage is always
|
|
78
|
-
set to an accurate value — never "full" unless the session is truly
|
|
79
|
-
complete.
|
|
80
|
-
|
|
81
|
-
Args:
|
|
82
|
-
db_path: Path to memory.db.
|
|
83
|
-
session_id: The session identifier (atomic_facts.session_id).
|
|
84
|
-
profile_id: Profile scope — never mix profiles.
|
|
85
|
-
config: Optional SLMConfig for LLM mode (B/C). None = Mode A
|
|
86
|
-
(extractive only, always deterministic).
|
|
87
|
-
|
|
88
|
-
Returns:
|
|
89
|
-
SummaryResult with source_fact_ids for every contributing fact.
|
|
90
|
-
Never returns None.
|
|
91
|
-
|
|
92
|
-
Note:
|
|
93
|
-
This function is NOT on the hot path. It belongs in background
|
|
94
|
-
maintenance or on explicit user request, never inside recall or store.
|
|
95
|
-
"""
|
|
96
|
-
db_path = Path(db_path)
|
|
97
|
-
|
|
98
|
-
# ── query ────────────────────────────────────────────────────────────────
|
|
99
|
-
try:
|
|
100
|
-
conn = sqlite3.connect(str(db_path), timeout=5.0)
|
|
101
|
-
conn.row_factory = sqlite3.Row
|
|
102
|
-
conn.execute("PRAGMA query_only=ON")
|
|
103
|
-
try:
|
|
104
|
-
rows = conn.execute(
|
|
105
|
-
"""
|
|
106
|
-
SELECT fact_id, content, created_at, importance, lifecycle
|
|
107
|
-
FROM atomic_facts
|
|
108
|
-
WHERE profile_id = ?
|
|
109
|
-
AND session_id = ?
|
|
110
|
-
AND lifecycle != 'archived'
|
|
111
|
-
ORDER BY importance DESC, created_at ASC
|
|
112
|
-
""",
|
|
113
|
-
(profile_id, session_id),
|
|
114
|
-
).fetchall()
|
|
115
|
-
finally:
|
|
116
|
-
conn.close()
|
|
117
|
-
except Exception as exc:
|
|
118
|
-
logger.warning("session summary query failed for %s: %s", session_id, exc)
|
|
119
|
-
return SummaryResult(
|
|
120
|
-
kind="session",
|
|
121
|
-
profile_id=profile_id,
|
|
122
|
-
content=(
|
|
123
|
-
f"Session summary for '{session_id}' is unavailable: "
|
|
124
|
-
f"data access error."
|
|
125
|
-
),
|
|
126
|
-
source_fact_ids=[],
|
|
127
|
-
coverage=COVERAGE_UNAVAILABLE,
|
|
128
|
-
generated_by=GENERATED_BY_EXTRACTIVE,
|
|
129
|
-
metadata={"session_id": session_id, "error": str(exc)},
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
# ── coverage decision ─────────────────────────────────────────────────────
|
|
133
|
-
if not rows:
|
|
134
|
-
return SummaryResult(
|
|
135
|
-
kind="session",
|
|
136
|
-
profile_id=profile_id,
|
|
137
|
-
content=(
|
|
138
|
-
f"No facts found for session '{session_id}'. "
|
|
139
|
-
f"Note: only a small fraction of facts carry a session_id "
|
|
140
|
-
f"on the current store — coverage is inherently partial."
|
|
141
|
-
),
|
|
142
|
-
source_fact_ids=[],
|
|
143
|
-
coverage=COVERAGE_NO_SESSION,
|
|
144
|
-
generated_by=GENERATED_BY_EXTRACTIVE,
|
|
145
|
-
metadata={"session_id": session_id, "fact_count": 0},
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
facts = [dict(r) for r in rows]
|
|
149
|
-
source_fact_ids = [f["fact_id"] for f in facts]
|
|
150
|
-
fact_count = len(facts)
|
|
151
|
-
|
|
152
|
-
if fact_count < _MIN_FACTS:
|
|
153
|
-
coverage = COVERAGE_INSUFFICIENT
|
|
154
|
-
else:
|
|
155
|
-
# Session summaries are structurally partial: they cover only the facts
|
|
156
|
-
# that happened to carry a session_id. On a real store that is ~3.9%
|
|
157
|
-
# of the corpus. Reporting "full" would be dishonest.
|
|
158
|
-
coverage = COVERAGE_PARTIAL
|
|
159
|
-
|
|
160
|
-
# ── extractive summary (deterministic, always available) ──────────────────
|
|
161
|
-
extractive_content = _build_extractive_content(session_id, facts, fact_count)
|
|
162
|
-
|
|
163
|
-
# ── LLM enrichment (optional) ─────────────────────────────────────────────
|
|
164
|
-
mode = get_mode_str(config)
|
|
165
|
-
if fact_count >= _MIN_FACTS and mode in ("b", "c"):
|
|
166
|
-
llm_content, llm_mode = _try_llm(
|
|
167
|
-
f"Summarise the key activities in session {session_id}",
|
|
168
|
-
facts,
|
|
169
|
-
config,
|
|
170
|
-
mode,
|
|
171
|
-
)
|
|
172
|
-
if llm_content:
|
|
173
|
-
return SummaryResult(
|
|
174
|
-
kind="session",
|
|
175
|
-
profile_id=profile_id,
|
|
176
|
-
content=llm_content,
|
|
177
|
-
source_fact_ids=source_fact_ids,
|
|
178
|
-
coverage=coverage,
|
|
179
|
-
generated_by=llm_mode,
|
|
180
|
-
metadata={"session_id": session_id, "fact_count": fact_count},
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
return SummaryResult(
|
|
184
|
-
kind="session",
|
|
185
|
-
profile_id=profile_id,
|
|
186
|
-
content=extractive_content,
|
|
187
|
-
source_fact_ids=source_fact_ids,
|
|
188
|
-
coverage=coverage,
|
|
189
|
-
generated_by=GENERATED_BY_EXTRACTIVE,
|
|
190
|
-
metadata={"session_id": session_id, "fact_count": fact_count},
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
# ── helpers ──────────────────────────────────────────────────────────────────
|
|
195
|
-
|
|
196
|
-
def _build_extractive_content(
|
|
197
|
-
session_id: str,
|
|
198
|
-
facts: list[dict],
|
|
199
|
-
fact_count: int,
|
|
200
|
-
) -> str:
|
|
201
|
-
"""Build a deterministic extractive summary from session facts.
|
|
202
|
-
|
|
203
|
-
Coverage is disclosed in the header. Top facts by importance are listed.
|
|
204
|
-
This is the fallback path — it must never fail or return an empty string.
|
|
205
|
-
"""
|
|
206
|
-
lines = [
|
|
207
|
-
f"Session: {session_id}",
|
|
208
|
-
f"Facts recorded: {fact_count}",
|
|
209
|
-
f"Coverage: partial (session facts are a subset of the full store)",
|
|
210
|
-
"",
|
|
211
|
-
"Top recorded facts:",
|
|
212
|
-
]
|
|
213
|
-
for f in facts[:_BODY_FACTS]:
|
|
214
|
-
content = f.get("content", "")
|
|
215
|
-
content = format_highlight(content)
|
|
216
|
-
lines.append(f" - {content}")
|
|
217
|
-
if fact_count > _BODY_FACTS:
|
|
218
|
-
lines.append(f" ... and {fact_count - _BODY_FACTS} more facts.")
|
|
219
|
-
return "\n".join(lines)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
def _try_llm(
|
|
223
|
-
prompt: str,
|
|
224
|
-
facts: list[dict],
|
|
225
|
-
config: object | None,
|
|
226
|
-
mode: str,
|
|
227
|
-
) -> tuple[str | None, str]:
|
|
228
|
-
"""Attempt LLM summarisation. Returns (content, generated_by) or (None, extractive)."""
|
|
229
|
-
if mode == "c":
|
|
230
|
-
result = _call_cloud_llm(prompt, facts, config)
|
|
231
|
-
if result:
|
|
232
|
-
return result, GENERATED_BY_LLM_C
|
|
233
|
-
# fall through to Mode B
|
|
234
|
-
if mode in ("b", "c"):
|
|
235
|
-
result = _call_ollama(prompt, facts, config)
|
|
236
|
-
if result:
|
|
237
|
-
return result, GENERATED_BY_LLM_B
|
|
238
|
-
return None, GENERATED_BY_EXTRACTIVE
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
def _call_ollama(
|
|
242
|
-
prompt: str,
|
|
243
|
-
facts: list[dict],
|
|
244
|
-
config: object | None,
|
|
245
|
-
) -> str | None:
|
|
246
|
-
"""Mode B: call Ollama. Returns None on any failure."""
|
|
247
|
-
try:
|
|
248
|
-
import json
|
|
249
|
-
import urllib.request
|
|
250
|
-
|
|
251
|
-
api_base = "http://localhost:11434"
|
|
252
|
-
model = "llama3.2"
|
|
253
|
-
timeout = 30
|
|
254
|
-
if config and hasattr(config, "llm"):
|
|
255
|
-
api_base = getattr(config.llm, "api_base", api_base) or api_base
|
|
256
|
-
model = getattr(config.llm, "model", model) or model
|
|
257
|
-
timeout = (
|
|
258
|
-
getattr(config.llm, "timeout_seconds", None)
|
|
259
|
-
or getattr(config.llm, "timeout", None)
|
|
260
|
-
or timeout
|
|
261
|
-
)
|
|
262
|
-
|
|
263
|
-
fact_texts = "\n".join(f"- {f['content']}" for f in facts[:10])
|
|
264
|
-
full_prompt = f"{prompt}\n\nFacts:\n{fact_texts}\n\nRespond in 2-4 sentences."
|
|
265
|
-
payload = json.dumps({
|
|
266
|
-
"model": model,
|
|
267
|
-
"prompt": full_prompt,
|
|
268
|
-
"system": SUMMARY_SYSTEM_PROMPT,
|
|
269
|
-
"stream": False,
|
|
270
|
-
"options": {"num_predict": 200},
|
|
271
|
-
}).encode()
|
|
272
|
-
req = urllib.request.Request(
|
|
273
|
-
f"{api_base}/api/generate",
|
|
274
|
-
data=payload,
|
|
275
|
-
headers={"Content-Type": "application/json"},
|
|
276
|
-
)
|
|
277
|
-
resp = urllib.request.urlopen(req, timeout=timeout)
|
|
278
|
-
data = json.loads(resp.read().decode())
|
|
279
|
-
text = clean_llm_summary(data.get("response", ""))
|
|
280
|
-
return text if text and len(text) > 20 else None
|
|
281
|
-
except Exception as exc:
|
|
282
|
-
logger.debug("Ollama session summary failed: %s", exc)
|
|
283
|
-
return None
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
def _call_cloud_llm(
|
|
287
|
-
prompt: str,
|
|
288
|
-
facts: list[dict],
|
|
289
|
-
config: object | None,
|
|
290
|
-
) -> str | None:
|
|
291
|
-
"""Mode C: call the configured cloud LLM. Returns None on any failure."""
|
|
292
|
-
if not config or not hasattr(config, "llm"):
|
|
293
|
-
return None
|
|
294
|
-
try:
|
|
295
|
-
from superlocalmemory.llm.backbone import LLMBackbone
|
|
296
|
-
llm = LLMBackbone(config.llm)
|
|
297
|
-
if not llm.is_available():
|
|
298
|
-
return None
|
|
299
|
-
fact_texts = "\n".join(f"- {f['content']}" for f in facts[:10])
|
|
300
|
-
full_prompt = f"{prompt}\n\nFacts:\n{fact_texts}\n\nRespond in 2-4 sentences."
|
|
301
|
-
text = llm.generate(
|
|
302
|
-
prompt=full_prompt,
|
|
303
|
-
system=SUMMARY_SYSTEM_PROMPT,
|
|
304
|
-
max_tokens=200,
|
|
305
|
-
temperature=0.1,
|
|
306
|
-
)
|
|
307
|
-
cleaned = clean_llm_summary(text or "")
|
|
308
|
-
return cleaned if len(cleaned) > 20 else None
|
|
309
|
-
except Exception as exc:
|
|
310
|
-
logger.debug("Cloud LLM session summary failed: %s", exc)
|
|
311
|
-
return None
|
|
File without changes
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3 — Trust Gate (Pre-Operation Checks).
|
|
6
|
-
|
|
7
|
-
Enforces minimum trust thresholds before allowing write/delete operations.
|
|
8
|
-
Read operations always pass but are logged for audit purposes.
|
|
9
|
-
|
|
10
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
import logging
|
|
16
|
-
import os
|
|
17
|
-
from typing import TYPE_CHECKING
|
|
18
|
-
|
|
19
|
-
if TYPE_CHECKING:
|
|
20
|
-
from superlocalmemory.trust.scorer import TrustScorer
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def _env_threshold(name: str, default: float) -> float:
|
|
26
|
-
"""Read a [0,1] threshold from the environment, falling back on parse/range error."""
|
|
27
|
-
try:
|
|
28
|
-
value = float(os.environ.get(name, ""))
|
|
29
|
-
except (TypeError, ValueError):
|
|
30
|
-
return default
|
|
31
|
-
return value if 0.0 <= value <= 1.0 else default
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
# M-02/M-03 (3.7.9): thresholds are operator-tunable so multi-agent deployments
|
|
35
|
-
# can tighten the write gate and opt into a read gate. Defaults are unchanged —
|
|
36
|
-
# the audit's "raise write_threshold to 0.7" would block every new agent (a new
|
|
37
|
-
# agent scores 0.5, Beta(1,1)); loopback callers bypass the gate entirely, so
|
|
38
|
-
# this only affects remote credentialed agents. Read gate is OFF by default.
|
|
39
|
-
_DEFAULT_WRITE_THRESHOLD = _env_threshold("SLM_TRUST_WRITE_THRESHOLD", 0.3)
|
|
40
|
-
_DEFAULT_DELETE_THRESHOLD = _env_threshold("SLM_TRUST_DELETE_THRESHOLD", 0.5)
|
|
41
|
-
_DEFAULT_READ_THRESHOLD = _env_threshold("SLM_TRUST_READ_THRESHOLD", 0.1)
|
|
42
|
-
_READ_GATE_ENABLED = os.environ.get("SLM_TRUST_READ_GATE") == "1"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class TrustError(PermissionError):
|
|
46
|
-
"""Raised when an agent fails a trust check.
|
|
47
|
-
|
|
48
|
-
Attributes:
|
|
49
|
-
agent_id: The agent that failed the check.
|
|
50
|
-
trust_score: The agent's current trust score.
|
|
51
|
-
threshold: The minimum required trust score.
|
|
52
|
-
operation: The operation that was attempted.
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
def __init__(
|
|
56
|
-
self,
|
|
57
|
-
agent_id: str,
|
|
58
|
-
trust_score: float,
|
|
59
|
-
threshold: float,
|
|
60
|
-
operation: str,
|
|
61
|
-
) -> None:
|
|
62
|
-
self.agent_id = agent_id
|
|
63
|
-
self.trust_score = trust_score
|
|
64
|
-
self.threshold = threshold
|
|
65
|
-
self.operation = operation
|
|
66
|
-
super().__init__(
|
|
67
|
-
f"Agent '{agent_id}' trust {trust_score:.3f} below "
|
|
68
|
-
f"{operation} threshold {threshold:.3f}"
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
class TrustGate:
|
|
73
|
-
"""Pre-operation trust checks.
|
|
74
|
-
|
|
75
|
-
Operations are gated by minimum trust thresholds:
|
|
76
|
-
- write: agent must have trust >= write_threshold (default 0.3)
|
|
77
|
-
- delete: agent must have trust >= delete_threshold (default 0.5)
|
|
78
|
-
- read: always passes (logged for audit trail)
|
|
79
|
-
|
|
80
|
-
Raises TrustError if the agent's trust is too low.
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
def __init__(
|
|
84
|
-
self,
|
|
85
|
-
scorer: TrustScorer,
|
|
86
|
-
write_threshold: float = _DEFAULT_WRITE_THRESHOLD,
|
|
87
|
-
delete_threshold: float = _DEFAULT_DELETE_THRESHOLD,
|
|
88
|
-
read_threshold: float = _DEFAULT_READ_THRESHOLD,
|
|
89
|
-
read_gate_enabled: bool = _READ_GATE_ENABLED,
|
|
90
|
-
) -> None:
|
|
91
|
-
if write_threshold < 0 or write_threshold > 1:
|
|
92
|
-
raise ValueError("write_threshold must be in [0, 1]")
|
|
93
|
-
if delete_threshold < 0 or delete_threshold > 1:
|
|
94
|
-
raise ValueError("delete_threshold must be in [0, 1]")
|
|
95
|
-
if read_threshold < 0 or read_threshold > 1:
|
|
96
|
-
raise ValueError("read_threshold must be in [0, 1]")
|
|
97
|
-
|
|
98
|
-
self._scorer = scorer
|
|
99
|
-
self._write_threshold = write_threshold
|
|
100
|
-
self._delete_threshold = delete_threshold
|
|
101
|
-
self._read_threshold = read_threshold
|
|
102
|
-
self._read_gate_enabled = read_gate_enabled
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def write_threshold(self) -> float:
|
|
106
|
-
return self._write_threshold
|
|
107
|
-
|
|
108
|
-
@property
|
|
109
|
-
def delete_threshold(self) -> float:
|
|
110
|
-
return self._delete_threshold
|
|
111
|
-
|
|
112
|
-
def check_write(self, agent_id: str, profile_id: str) -> None:
|
|
113
|
-
"""Check if agent is trusted enough to write.
|
|
114
|
-
|
|
115
|
-
Raises:
|
|
116
|
-
TrustError: If agent trust is below write_threshold.
|
|
117
|
-
"""
|
|
118
|
-
score = self._scorer.get_agent_trust(agent_id, profile_id)
|
|
119
|
-
logger.debug(
|
|
120
|
-
"trust gate write: agent=%s trust=%.3f threshold=%.3f",
|
|
121
|
-
agent_id, score, self._write_threshold,
|
|
122
|
-
)
|
|
123
|
-
if score < self._write_threshold:
|
|
124
|
-
raise TrustError(
|
|
125
|
-
agent_id, score, self._write_threshold, "write"
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
def check_delete(self, agent_id: str, profile_id: str) -> None:
|
|
129
|
-
"""Check if agent is trusted enough to delete.
|
|
130
|
-
|
|
131
|
-
Delete requires higher trust than write because it is destructive.
|
|
132
|
-
|
|
133
|
-
Raises:
|
|
134
|
-
TrustError: If agent trust is below delete_threshold.
|
|
135
|
-
"""
|
|
136
|
-
score = self._scorer.get_agent_trust(agent_id, profile_id)
|
|
137
|
-
logger.debug(
|
|
138
|
-
"trust gate delete: agent=%s trust=%.3f threshold=%.3f",
|
|
139
|
-
agent_id, score, self._delete_threshold,
|
|
140
|
-
)
|
|
141
|
-
if score < self._delete_threshold:
|
|
142
|
-
raise TrustError(
|
|
143
|
-
agent_id, score, self._delete_threshold, "delete"
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
@property
|
|
147
|
-
def read_threshold(self) -> float:
|
|
148
|
-
return self._read_threshold
|
|
149
|
-
|
|
150
|
-
@property
|
|
151
|
-
def read_gate_enabled(self) -> bool:
|
|
152
|
-
return self._read_gate_enabled
|
|
153
|
-
|
|
154
|
-
def check_read(self, agent_id: str, profile_id: str) -> None:
|
|
155
|
-
"""Read check. Passes by default; logged for the audit trail.
|
|
156
|
-
|
|
157
|
-
M-03 (3.7.9): reads are unblocked by default because denying read access
|
|
158
|
-
could break agent functionality. Operators who need to stop a
|
|
159
|
-
compromised agent from exfiltrating the store can set
|
|
160
|
-
``SLM_TRUST_READ_GATE=1`` (optionally with ``SLM_TRUST_READ_THRESHOLD``)
|
|
161
|
-
to enforce a minimum trust for reads too.
|
|
162
|
-
"""
|
|
163
|
-
score = self._scorer.get_agent_trust(agent_id, profile_id)
|
|
164
|
-
logger.debug(
|
|
165
|
-
"trust gate read: agent=%s trust=%.3f gate=%s",
|
|
166
|
-
agent_id, score, self._read_gate_enabled,
|
|
167
|
-
)
|
|
168
|
-
if self._read_gate_enabled and score < self._read_threshold:
|
|
169
|
-
raise TrustError(
|
|
170
|
-
agent_id, score, self._read_threshold, "read"
|
|
171
|
-
)
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3 — Provenance Tracking.
|
|
6
|
-
|
|
7
|
-
Records who/what created each memory and how.
|
|
8
|
-
V1 had provenance as WRITE-ONLY (stored but never read).
|
|
9
|
-
Innovation wires reads into trust scoring and compliance audit.
|
|
10
|
-
|
|
11
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import logging
|
|
17
|
-
from datetime import UTC, datetime
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.storage.models import ProvenanceRecord
|
|
20
|
-
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class ProvenanceTracker:
|
|
25
|
-
"""Track provenance of all stored facts.
|
|
26
|
-
|
|
27
|
-
Every fact gets a provenance record at creation time.
|
|
28
|
-
Provenance feeds into:
|
|
29
|
-
- Trust scoring (sources with high-quality provenance get trust boost)
|
|
30
|
-
- Compliance audit (GDPR right-to-know: who stored what data?)
|
|
31
|
-
- Debugging (which extraction pipeline created this fact?)
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
def __init__(self, db) -> None:
|
|
35
|
-
self._db = db
|
|
36
|
-
|
|
37
|
-
def record(
|
|
38
|
-
self,
|
|
39
|
-
fact_id: str,
|
|
40
|
-
profile_id: str,
|
|
41
|
-
source_type: str,
|
|
42
|
-
source_id: str = "",
|
|
43
|
-
created_by: str = "",
|
|
44
|
-
) -> ProvenanceRecord:
|
|
45
|
-
"""Record provenance for a newly stored fact.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
fact_id: The fact being tracked.
|
|
49
|
-
profile_id: Active profile.
|
|
50
|
-
source_type: "conversation", "import", "consolidation", "migration".
|
|
51
|
-
source_id: Session ID, import batch ID, etc.
|
|
52
|
-
created_by: Agent ID or user identifier.
|
|
53
|
-
"""
|
|
54
|
-
record = ProvenanceRecord(
|
|
55
|
-
profile_id=profile_id,
|
|
56
|
-
fact_id=fact_id,
|
|
57
|
-
source_type=source_type,
|
|
58
|
-
source_id=source_id,
|
|
59
|
-
created_by=created_by,
|
|
60
|
-
timestamp=datetime.now(UTC).isoformat(),
|
|
61
|
-
)
|
|
62
|
-
self._db.execute(
|
|
63
|
-
"INSERT INTO provenance "
|
|
64
|
-
"(provenance_id, profile_id, fact_id, source_type, source_id, "
|
|
65
|
-
"created_by, timestamp) VALUES (?,?,?,?,?,?,?)",
|
|
66
|
-
(record.provenance_id, record.profile_id, record.fact_id,
|
|
67
|
-
record.source_type, record.source_id, record.created_by,
|
|
68
|
-
record.timestamp),
|
|
69
|
-
)
|
|
70
|
-
return record
|
|
71
|
-
|
|
72
|
-
def get_provenance(self, fact_id: str, profile_id: str) -> ProvenanceRecord | None:
|
|
73
|
-
"""Get provenance for a specific fact."""
|
|
74
|
-
rows = self._db.execute(
|
|
75
|
-
"SELECT * FROM provenance WHERE fact_id = ? AND profile_id = ?",
|
|
76
|
-
(fact_id, profile_id),
|
|
77
|
-
)
|
|
78
|
-
if not rows:
|
|
79
|
-
return None
|
|
80
|
-
d = dict(rows[0])
|
|
81
|
-
return ProvenanceRecord(
|
|
82
|
-
provenance_id=d["provenance_id"],
|
|
83
|
-
profile_id=d["profile_id"],
|
|
84
|
-
fact_id=d["fact_id"],
|
|
85
|
-
source_type=d["source_type"],
|
|
86
|
-
source_id=d.get("source_id", ""),
|
|
87
|
-
created_by=d.get("created_by", ""),
|
|
88
|
-
timestamp=d["timestamp"],
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
def get_facts_by_source(
|
|
92
|
-
self, source_type: str, profile_id: str, limit: int = 100
|
|
93
|
-
) -> list[ProvenanceRecord]:
|
|
94
|
-
"""Get all facts from a specific source type."""
|
|
95
|
-
rows = self._db.execute(
|
|
96
|
-
"SELECT * FROM provenance WHERE source_type = ? AND profile_id = ? "
|
|
97
|
-
"ORDER BY timestamp DESC LIMIT ?",
|
|
98
|
-
(source_type, profile_id, limit),
|
|
99
|
-
)
|
|
100
|
-
return [self._row_to_record(r) for r in rows]
|
|
101
|
-
|
|
102
|
-
def get_provenance_for_profile(
|
|
103
|
-
self, profile_id: str, limit: int = 100
|
|
104
|
-
) -> list[ProvenanceRecord]:
|
|
105
|
-
"""Get all provenance records for a profile (compliance audit)."""
|
|
106
|
-
rows = self._db.execute(
|
|
107
|
-
"SELECT * FROM provenance WHERE profile_id = ? "
|
|
108
|
-
"ORDER BY timestamp DESC LIMIT ?",
|
|
109
|
-
(profile_id, limit),
|
|
110
|
-
)
|
|
111
|
-
return [self._row_to_record(r) for r in rows]
|
|
112
|
-
|
|
113
|
-
@staticmethod
|
|
114
|
-
def _row_to_record(row) -> ProvenanceRecord:
|
|
115
|
-
d = dict(row)
|
|
116
|
-
return ProvenanceRecord(
|
|
117
|
-
provenance_id=d["provenance_id"],
|
|
118
|
-
profile_id=d["profile_id"],
|
|
119
|
-
fact_id=d["fact_id"],
|
|
120
|
-
source_type=d["source_type"],
|
|
121
|
-
source_id=d.get("source_id", ""),
|
|
122
|
-
created_by=d.get("created_by", ""),
|
|
123
|
-
timestamp=d["timestamp"],
|
|
124
|
-
)
|