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,688 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later
|
|
3
|
-
|
|
4
|
-
"""Canonical authorized fact delete and update operations."""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
import sqlite3
|
|
10
|
-
import uuid
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger("superlocalmemory.audit")
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _context(
|
|
18
|
-
engine: Any,
|
|
19
|
-
operation: str,
|
|
20
|
-
fact_id: str,
|
|
21
|
-
*,
|
|
22
|
-
trusted_actor_id: str,
|
|
23
|
-
source_agent_id: str,
|
|
24
|
-
content_preview: str = "",
|
|
25
|
-
) -> tuple[str, dict[str, str]]:
|
|
26
|
-
if not trusted_actor_id:
|
|
27
|
-
raise ValueError("trusted actor identity is required")
|
|
28
|
-
profile_id = engine.profile_id
|
|
29
|
-
context = {
|
|
30
|
-
"operation": operation,
|
|
31
|
-
"agent_id": trusted_actor_id,
|
|
32
|
-
"source_agent_id": source_agent_id,
|
|
33
|
-
"profile_id": profile_id,
|
|
34
|
-
"fact_id": fact_id,
|
|
35
|
-
}
|
|
36
|
-
if content_preview:
|
|
37
|
-
context["content_preview"] = content_preview[:100]
|
|
38
|
-
engine._hooks.run_pre(operation, context)
|
|
39
|
-
return profile_id, context
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _invalidate_context_cache_for_fact(
|
|
43
|
-
engine: Any,
|
|
44
|
-
fact_id: str,
|
|
45
|
-
) -> None:
|
|
46
|
-
"""Best-effort removal of context cache entries referencing fact_id.
|
|
47
|
-
|
|
48
|
-
Opens the cache SQLite file directly (no ContextCache instance needed).
|
|
49
|
-
Tries the two standard cache locations relative to the database directory:
|
|
50
|
-
a ``context-cache`` subdirectory (isolation convention used in tests) and
|
|
51
|
-
the database directory itself (production default). Fail-open: any error
|
|
52
|
-
is silently discarded.
|
|
53
|
-
"""
|
|
54
|
-
try:
|
|
55
|
-
db_parent = Path(engine._db.db_path).parent
|
|
56
|
-
except AttributeError:
|
|
57
|
-
return
|
|
58
|
-
pattern = f'%"{fact_id}"%'
|
|
59
|
-
candidates = [
|
|
60
|
-
db_parent / "context-cache" / "active_brain_cache.db",
|
|
61
|
-
db_parent / "active_brain_cache.db",
|
|
62
|
-
]
|
|
63
|
-
for cache_path in candidates:
|
|
64
|
-
if not cache_path.exists():
|
|
65
|
-
continue
|
|
66
|
-
try:
|
|
67
|
-
conn = sqlite3.connect(str(cache_path), timeout=2.0)
|
|
68
|
-
try:
|
|
69
|
-
conn.execute(
|
|
70
|
-
"DELETE FROM context_entries WHERE fact_ids LIKE ?",
|
|
71
|
-
(pattern,),
|
|
72
|
-
)
|
|
73
|
-
conn.commit()
|
|
74
|
-
finally:
|
|
75
|
-
conn.close()
|
|
76
|
-
except Exception:
|
|
77
|
-
pass
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def purge_profile_context_cache(engine: Any, profile_id: str) -> None:
|
|
81
|
-
"""Best-effort full-profile cache purge after a truth lifecycle change.
|
|
82
|
-
|
|
83
|
-
Apply and rollback can flip which of two immutable facts is current. A
|
|
84
|
-
fact-ID substring delete is therefore insufficient: any cached prose for
|
|
85
|
-
the profile could contain the old current truth. Read-side admission
|
|
86
|
-
remains the authoritative backstop if this post-commit cleanup is busy.
|
|
87
|
-
"""
|
|
88
|
-
try:
|
|
89
|
-
db_parent = Path(engine._db.db_path).parent
|
|
90
|
-
except AttributeError:
|
|
91
|
-
return
|
|
92
|
-
try:
|
|
93
|
-
from superlocalmemory.core.context_cache import purge_profile_from_cache_db
|
|
94
|
-
|
|
95
|
-
for cache_path in (
|
|
96
|
-
db_parent / "context-cache" / "active_brain_cache.db",
|
|
97
|
-
db_parent / "active_brain_cache.db",
|
|
98
|
-
):
|
|
99
|
-
purge_profile_from_cache_db(cache_path, profile_id)
|
|
100
|
-
except Exception:
|
|
101
|
-
logger.warning("Profile context cache purge failed after correction transition")
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def _sync_vector_ann(
|
|
105
|
-
retrieval: Any,
|
|
106
|
-
fact_id: str,
|
|
107
|
-
profile_id: str,
|
|
108
|
-
embedding: list[float] | None,
|
|
109
|
-
*,
|
|
110
|
-
operation: str,
|
|
111
|
-
) -> None:
|
|
112
|
-
"""Replace or remove a fact's entry in the vector store and ANN index.
|
|
113
|
-
|
|
114
|
-
``operation`` is either ``"update"`` or ``"delete"``. For updates,
|
|
115
|
-
``embedding`` must be provided; the semantic representations are replaced
|
|
116
|
-
in place so a correction is reflected by every semantic query. Fail-open:
|
|
117
|
-
errors are logged and ignored so a projection hiccup never blocks the
|
|
118
|
-
authoritative write.
|
|
119
|
-
"""
|
|
120
|
-
vector_store = getattr(retrieval, "_vector_store", None)
|
|
121
|
-
ann_index = getattr(retrieval, "_ann_index", None)
|
|
122
|
-
if operation == "update" and embedding:
|
|
123
|
-
if vector_store is not None:
|
|
124
|
-
try:
|
|
125
|
-
# upsert replaces the stored vector for an existing fact_id.
|
|
126
|
-
vector_store.upsert(fact_id, profile_id, embedding)
|
|
127
|
-
except Exception as exc:
|
|
128
|
-
logger.warning("vector_store upsert failed for %s: %s", fact_id[:16], exc)
|
|
129
|
-
if ann_index is not None:
|
|
130
|
-
try:
|
|
131
|
-
# add() is upsert-semantic: it overwrites an existing entry.
|
|
132
|
-
ann_index.add(fact_id, embedding)
|
|
133
|
-
except Exception as exc:
|
|
134
|
-
logger.warning("ann_index add failed for %s: %s", fact_id[:16], exc)
|
|
135
|
-
elif operation == "delete":
|
|
136
|
-
if vector_store is not None:
|
|
137
|
-
try:
|
|
138
|
-
vector_store.delete(fact_id)
|
|
139
|
-
except Exception as exc:
|
|
140
|
-
logger.warning("vector_store.delete failed for %s: %s", fact_id[:16], exc)
|
|
141
|
-
if ann_index is not None:
|
|
142
|
-
try:
|
|
143
|
-
ann_index.remove(fact_id)
|
|
144
|
-
except Exception as exc:
|
|
145
|
-
logger.warning("ann_index.remove failed for %s: %s", fact_id[:16], exc)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def _converge_update_projections(
|
|
149
|
-
engine: Any,
|
|
150
|
-
fact_id: str,
|
|
151
|
-
content: str,
|
|
152
|
-
profile_id: str,
|
|
153
|
-
embedding: list[float] | None,
|
|
154
|
-
) -> None:
|
|
155
|
-
"""Fan out a fact correction to every derived projection.
|
|
156
|
-
|
|
157
|
-
Projection obligations on correction:
|
|
158
|
-
- temporal_events.description — updated to new content
|
|
159
|
-
- fact_context.contextual_description — cleared of stale tokens (row kept)
|
|
160
|
-
- fact_expansion_fts.alt_keys — cleared of stale tokens (row kept)
|
|
161
|
-
- context cache — entry deleted so stale content is never served
|
|
162
|
-
- BM25 live channel — replaced (one entry, no duplicate)
|
|
163
|
-
- vector store + ANN index — update called
|
|
164
|
-
"""
|
|
165
|
-
db = engine._db
|
|
166
|
-
|
|
167
|
-
# Temporal events: description must match new content
|
|
168
|
-
db.update_temporal_event_description(fact_id, content)
|
|
169
|
-
|
|
170
|
-
# Fact context: keep row alive but clear stale description/keywords
|
|
171
|
-
db.store_fact_context(fact_id, profile_id, "", "")
|
|
172
|
-
|
|
173
|
-
# Expansion FTS: keep row alive but replace with empty alt_keys
|
|
174
|
-
db.reset_fact_expansion(fact_id, "")
|
|
175
|
-
|
|
176
|
-
# Context cache: delete stale entries so the hot path returns nothing stale
|
|
177
|
-
_invalidate_context_cache_for_fact(engine, fact_id)
|
|
178
|
-
|
|
179
|
-
# BM25 live channel: replace (remove then add) to guarantee exactly one entry
|
|
180
|
-
retrieval = getattr(engine, "_retrieval_engine", None)
|
|
181
|
-
bm25 = getattr(retrieval, "_bm25", None) if retrieval else None
|
|
182
|
-
if bm25 is not None and hasattr(bm25, "update_fact"):
|
|
183
|
-
bm25.update_fact(fact_id, content, profile_id)
|
|
184
|
-
elif bm25 is not None:
|
|
185
|
-
# Fallback: add without dedup (legacy path)
|
|
186
|
-
bm25.add(fact_id, content, profile_id)
|
|
187
|
-
|
|
188
|
-
# Vector store + ANN index
|
|
189
|
-
if retrieval is not None:
|
|
190
|
-
_sync_vector_ann(retrieval, fact_id, profile_id, embedding, operation="update")
|
|
191
|
-
|
|
192
|
-
try:
|
|
193
|
-
from superlocalmemory.core.backend_orchestrator import get_orchestrator
|
|
194
|
-
orchestrator = get_orchestrator()
|
|
195
|
-
if orchestrator is not None:
|
|
196
|
-
orchestrator.sync_changed_fact(fact_id)
|
|
197
|
-
except Exception:
|
|
198
|
-
logger.warning("Derived projection update sync failed for %s", fact_id[:16])
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
def _project_correction_successor(
|
|
202
|
-
engine: Any,
|
|
203
|
-
fact_id: str,
|
|
204
|
-
content: str,
|
|
205
|
-
profile_id: str,
|
|
206
|
-
embedding: list[float] | None,
|
|
207
|
-
) -> None:
|
|
208
|
-
"""Project a new successor without touching predecessor projections."""
|
|
209
|
-
retrieval = getattr(engine, "_retrieval_engine", None)
|
|
210
|
-
bm25 = getattr(retrieval, "_bm25", None) if retrieval else None
|
|
211
|
-
if bm25 is not None:
|
|
212
|
-
try:
|
|
213
|
-
bm25.add(fact_id, content, profile_id)
|
|
214
|
-
except Exception as exc:
|
|
215
|
-
logger.warning("BM25 successor projection failed for %s: %s", fact_id[:16], exc)
|
|
216
|
-
if retrieval is not None:
|
|
217
|
-
_sync_vector_ann(retrieval, fact_id, profile_id, embedding, operation="update")
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
def _correction_ledger_available(engine: Any) -> bool:
|
|
221
|
-
try:
|
|
222
|
-
rows = engine._db.execute(
|
|
223
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='correction_cases'"
|
|
224
|
-
)
|
|
225
|
-
return bool(rows)
|
|
226
|
-
except Exception:
|
|
227
|
-
return False
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
def _propose_correction_case(
|
|
231
|
-
engine: Any,
|
|
232
|
-
*,
|
|
233
|
-
profile_id: str,
|
|
234
|
-
scope: str,
|
|
235
|
-
predecessor_fact_id: str,
|
|
236
|
-
successor_fact_id: str,
|
|
237
|
-
trusted_actor_id: str,
|
|
238
|
-
idempotency_key: str,
|
|
239
|
-
) -> dict[str, Any]:
|
|
240
|
-
"""Record a review-required M042 proposal after successor persistence.
|
|
241
|
-
|
|
242
|
-
The ledger deliberately lives on a separate short transaction from the
|
|
243
|
-
canonical writer. A retry with the same deterministic identifiers is
|
|
244
|
-
idempotent; the predecessor remains untouched if the ledger is unavailable.
|
|
245
|
-
"""
|
|
246
|
-
from superlocalmemory.storage.correction_cases import (
|
|
247
|
-
CorrectionActor,
|
|
248
|
-
CorrectionCaseStore,
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
actor = CorrectionActor(
|
|
252
|
-
actor_id=trusted_actor_id,
|
|
253
|
-
actor_kind="host_authenticated",
|
|
254
|
-
trust_tier="trusted",
|
|
255
|
-
)
|
|
256
|
-
case_id = uuid.uuid5(
|
|
257
|
-
uuid.NAMESPACE_URL,
|
|
258
|
-
f"slm-correction:{profile_id}:{predecessor_fact_id}:{successor_fact_id}",
|
|
259
|
-
).hex
|
|
260
|
-
store = CorrectionCaseStore(
|
|
261
|
-
engine._db.db_path,
|
|
262
|
-
is_profile_active=lambda candidate: candidate == profile_id,
|
|
263
|
-
is_actor_trusted=lambda candidate: candidate == actor,
|
|
264
|
-
)
|
|
265
|
-
case = store.propose(
|
|
266
|
-
case_id=case_id,
|
|
267
|
-
profile_id=profile_id,
|
|
268
|
-
scope=scope,
|
|
269
|
-
predecessor_fact_id=predecessor_fact_id,
|
|
270
|
-
successor_fact_id=successor_fact_id,
|
|
271
|
-
reason_code="direct_content_correction",
|
|
272
|
-
actor=actor,
|
|
273
|
-
idempotency_key=idempotency_key,
|
|
274
|
-
)
|
|
275
|
-
return {"case_id": case.case_id, "status": case.status, "version": case.version}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
def _purge_delete_projections(
|
|
279
|
-
engine: Any,
|
|
280
|
-
fact_id: str,
|
|
281
|
-
profile_id: str,
|
|
282
|
-
*,
|
|
283
|
-
memory_id: str | None = None,
|
|
284
|
-
) -> None:
|
|
285
|
-
"""Purge every derived representation of a fact before the canonical row is gone.
|
|
286
|
-
|
|
287
|
-
Projection obligations on deletion:
|
|
288
|
-
- memories (raw memory record that sourced this fact)
|
|
289
|
-
- bm25_tokens (persisted tokens in the DB table)
|
|
290
|
-
- fact_expansion_fts (BM25 alt-key expansion entry)
|
|
291
|
-
- graph_edges (any edge where fact_id is source or target)
|
|
292
|
-
- memory_scenes (fact_id removed from JSON arrays; empty scenes deleted)
|
|
293
|
-
- fact_context (contextual description entry)
|
|
294
|
-
- context cache (entries referencing this fact_id)
|
|
295
|
-
- BM25 live channel (evicted from in-memory corpus)
|
|
296
|
-
- vector store + ANN index (delete / remove called)
|
|
297
|
-
"""
|
|
298
|
-
db = engine._db
|
|
299
|
-
|
|
300
|
-
if memory_id:
|
|
301
|
-
try:
|
|
302
|
-
siblings = db.execute(
|
|
303
|
-
"SELECT 1 FROM atomic_facts "
|
|
304
|
-
"WHERE memory_id = ? AND profile_id = ? LIMIT 1",
|
|
305
|
-
(memory_id, profile_id),
|
|
306
|
-
)
|
|
307
|
-
if not siblings:
|
|
308
|
-
db.execute(
|
|
309
|
-
"DELETE FROM memories WHERE memory_id = ? AND profile_id = ?",
|
|
310
|
-
(memory_id, profile_id),
|
|
311
|
-
)
|
|
312
|
-
except Exception:
|
|
313
|
-
logger.debug("memory delete by id skipped for %s", fact_id[:16])
|
|
314
|
-
else:
|
|
315
|
-
db.delete_memory_for_fact(fact_id, profile_id)
|
|
316
|
-
|
|
317
|
-
# Persistent BM25 tokens
|
|
318
|
-
db.delete_bm25_tokens_for_fact(fact_id)
|
|
319
|
-
|
|
320
|
-
# FTS expansion entry
|
|
321
|
-
db.upsert_fact_expansion(fact_id, "")
|
|
322
|
-
|
|
323
|
-
# Knowledge graph edges
|
|
324
|
-
db.delete_graph_edges_for_fact(fact_id)
|
|
325
|
-
|
|
326
|
-
# Memory scenes — remove fact_id from JSON arrays
|
|
327
|
-
db.remove_fact_from_scenes(fact_id, profile_id)
|
|
328
|
-
|
|
329
|
-
# Fact context description
|
|
330
|
-
db.delete_fact_context(fact_id)
|
|
331
|
-
|
|
332
|
-
# Context cache
|
|
333
|
-
_invalidate_context_cache_for_fact(engine, fact_id)
|
|
334
|
-
|
|
335
|
-
# BM25 live channel (in-memory eviction)
|
|
336
|
-
retrieval = getattr(engine, "_retrieval_engine", None)
|
|
337
|
-
bm25 = getattr(retrieval, "_bm25", None) if retrieval else None
|
|
338
|
-
if bm25 is not None and hasattr(bm25, "remove_fact"):
|
|
339
|
-
bm25.remove_fact(fact_id)
|
|
340
|
-
|
|
341
|
-
# Vector store + ANN index
|
|
342
|
-
if retrieval is not None:
|
|
343
|
-
_sync_vector_ann(retrieval, fact_id, profile_id, None, operation="delete")
|
|
344
|
-
|
|
345
|
-
try:
|
|
346
|
-
from superlocalmemory.core.backend_orchestrator import get_orchestrator
|
|
347
|
-
orchestrator = get_orchestrator()
|
|
348
|
-
if orchestrator is not None:
|
|
349
|
-
orchestrator.sync_deleted_fact(fact_id)
|
|
350
|
-
except Exception:
|
|
351
|
-
logger.warning("Derived projection deletion sync failed for %s", fact_id[:16])
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def _canonical_present(engine: Any, fact_id: str, profile_id: str) -> bool:
|
|
355
|
-
return bool(engine._db.execute(
|
|
356
|
-
"SELECT 1 FROM atomic_facts WHERE fact_id = ? AND profile_id = ? LIMIT 1",
|
|
357
|
-
(fact_id, profile_id),
|
|
358
|
-
))
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
def _memory_present(engine: Any, memory_id: str, profile_id: str) -> bool:
|
|
362
|
-
return bool(engine._db.execute(
|
|
363
|
-
"SELECT 1 FROM memories WHERE memory_id = ? AND profile_id = ? LIMIT 1",
|
|
364
|
-
(memory_id, profile_id),
|
|
365
|
-
))
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
def _memory_has_facts(engine: Any, memory_id: str, profile_id: str) -> bool:
|
|
369
|
-
return bool(engine._db.execute(
|
|
370
|
-
"SELECT 1 FROM atomic_facts WHERE memory_id = ? AND profile_id = ? LIMIT 1",
|
|
371
|
-
(memory_id, profile_id),
|
|
372
|
-
))
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
def _finalize_erasure(
|
|
376
|
-
engine: Any,
|
|
377
|
-
service: Any,
|
|
378
|
-
op_ctx: Any,
|
|
379
|
-
fact_id: str,
|
|
380
|
-
profile_id: str,
|
|
381
|
-
memory_id: str | None,
|
|
382
|
-
erasure_id: str,
|
|
383
|
-
requested_at: float,
|
|
384
|
-
*,
|
|
385
|
-
requested_by: str,
|
|
386
|
-
tombstoned: bool,
|
|
387
|
-
) -> dict[str, Any]:
|
|
388
|
-
try:
|
|
389
|
-
from superlocalmemory.core.transactions import ErasureProofRecord
|
|
390
|
-
from superlocalmemory.core.transactions.erasure import tombstone_memory_id
|
|
391
|
-
|
|
392
|
-
canonical_absent = not _canonical_present(engine, fact_id, profile_id)
|
|
393
|
-
extra = [ErasureProofRecord(
|
|
394
|
-
owner="canonical", erased=canonical_absent, checksum="",
|
|
395
|
-
residue=() if canonical_absent else (fact_id,),
|
|
396
|
-
)]
|
|
397
|
-
if memory_id:
|
|
398
|
-
memory_ok = (
|
|
399
|
-
not _memory_present(engine, memory_id, profile_id)
|
|
400
|
-
or _memory_has_facts(engine, memory_id, profile_id)
|
|
401
|
-
)
|
|
402
|
-
extra.append(ErasureProofRecord(
|
|
403
|
-
owner="memory", erased=memory_ok, checksum="",
|
|
404
|
-
residue=() if memory_ok else (memory_id,),
|
|
405
|
-
))
|
|
406
|
-
stored_mid = tombstone_memory_id(engine._db, profile_id, fact_id)
|
|
407
|
-
if stored_mid and stored_mid != memory_id:
|
|
408
|
-
stored_mid_ok = (
|
|
409
|
-
not _memory_present(engine, stored_mid, profile_id)
|
|
410
|
-
or _memory_has_facts(engine, stored_mid, profile_id)
|
|
411
|
-
)
|
|
412
|
-
if not stored_mid_ok:
|
|
413
|
-
extra.append(ErasureProofRecord(
|
|
414
|
-
owner="memory_provenance", erased=False, checksum="",
|
|
415
|
-
residue=(stored_mid,),
|
|
416
|
-
))
|
|
417
|
-
receipt = service.finalize(
|
|
418
|
-
engine._db, op_ctx,
|
|
419
|
-
subject_type="fact", subject_id=fact_id,
|
|
420
|
-
requested_by=requested_by, requested_at=requested_at,
|
|
421
|
-
extra_proofs=extra,
|
|
422
|
-
)
|
|
423
|
-
verified = receipt.all_erased and receipt.persisted and tombstoned
|
|
424
|
-
if not verified:
|
|
425
|
-
logger.error(
|
|
426
|
-
"Erasure not verified for %s: state=%s persisted=%s "
|
|
427
|
-
"tombstoned=%s residue=%s",
|
|
428
|
-
fact_id[:16], receipt.state, receipt.persisted, tombstoned,
|
|
429
|
-
[p.owner for p in receipt.proofs if not p.erased],
|
|
430
|
-
)
|
|
431
|
-
return {
|
|
432
|
-
"erasure_id": erasure_id,
|
|
433
|
-
"erasure_verified": verified,
|
|
434
|
-
"erasure_state": receipt.state,
|
|
435
|
-
}
|
|
436
|
-
except Exception as exc:
|
|
437
|
-
logger.error("Erasure finalize failed for %s: %s", fact_id[:16], exc)
|
|
438
|
-
return {
|
|
439
|
-
"erasure_id": erasure_id,
|
|
440
|
-
"erasure_verified": False,
|
|
441
|
-
"erasure_state": "FAILED",
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
def delete_fact_authorized(
|
|
446
|
-
engine: Any,
|
|
447
|
-
fact_id: str,
|
|
448
|
-
*,
|
|
449
|
-
trusted_actor_id: str,
|
|
450
|
-
source_agent_id: str,
|
|
451
|
-
canonical_runtime: Any | None = None,
|
|
452
|
-
idempotency_key: str | None = None,
|
|
453
|
-
) -> dict[str, Any]:
|
|
454
|
-
"""Authorize, delete one profile-owned fact, then emit post hooks."""
|
|
455
|
-
import time as _time
|
|
456
|
-
import uuid
|
|
457
|
-
|
|
458
|
-
from superlocalmemory.core.transactions import OperationContext
|
|
459
|
-
from superlocalmemory.core.transactions.concrete_owners import (
|
|
460
|
-
build_erasure_service,
|
|
461
|
-
)
|
|
462
|
-
from superlocalmemory.core.transactions.erasure import (
|
|
463
|
-
is_tombstoned,
|
|
464
|
-
tombstone_memory_id,
|
|
465
|
-
)
|
|
466
|
-
from superlocalmemory.storage.erasure_fence import clear_erasing, mark_erasing
|
|
467
|
-
|
|
468
|
-
profile_id, context = _context(
|
|
469
|
-
engine,
|
|
470
|
-
"delete",
|
|
471
|
-
fact_id,
|
|
472
|
-
trusted_actor_id=trusted_actor_id,
|
|
473
|
-
source_agent_id=source_agent_id,
|
|
474
|
-
)
|
|
475
|
-
|
|
476
|
-
rows = engine._db.execute(
|
|
477
|
-
"SELECT content, memory_id FROM atomic_facts "
|
|
478
|
-
"WHERE fact_id = ? AND profile_id = ? LIMIT 1",
|
|
479
|
-
(fact_id, profile_id),
|
|
480
|
-
)
|
|
481
|
-
exists = bool(rows)
|
|
482
|
-
content_preview = dict(rows[0]).get("content", "")[:80] if exists else ""
|
|
483
|
-
memory_id = dict(rows[0]).get("memory_id") if exists else None
|
|
484
|
-
|
|
485
|
-
erasure_id = uuid.uuid4().hex
|
|
486
|
-
requested_at = _time.time()
|
|
487
|
-
op_ctx = OperationContext(
|
|
488
|
-
operation_id=erasure_id, profile_id=profile_id,
|
|
489
|
-
subject_id=fact_id, fact_ids=(fact_id,),
|
|
490
|
-
)
|
|
491
|
-
service = build_erasure_service(engine)
|
|
492
|
-
|
|
493
|
-
# A tombstoned fact whose canonical row is already gone is a partially
|
|
494
|
-
# completed prior erasure (e.g. a transient raw-memory delete failure left
|
|
495
|
-
# the source memory behind). Resume cleanup from the stored memory_id
|
|
496
|
-
# instead of reporting the fact "not found".
|
|
497
|
-
resuming = False
|
|
498
|
-
if not exists:
|
|
499
|
-
with engine._db.raw_connection() as _conn:
|
|
500
|
-
resuming = is_tombstoned(_conn, profile_id, fact_id)
|
|
501
|
-
if not resuming:
|
|
502
|
-
return {"ok": False, "error": f"Memory {fact_id} not found"}
|
|
503
|
-
memory_id = tombstone_memory_id(engine._db, profile_id, fact_id)
|
|
504
|
-
|
|
505
|
-
remove_result = None
|
|
506
|
-
if exists:
|
|
507
|
-
try:
|
|
508
|
-
remove_result = service.remove(engine._db, op_ctx, memory_id=memory_id)
|
|
509
|
-
except Exception as exc:
|
|
510
|
-
logger.error("Erasure remove failed for %s: %s", fact_id[:16], exc)
|
|
511
|
-
if (
|
|
512
|
-
remove_result is None
|
|
513
|
-
or not remove_result.spine_ok
|
|
514
|
-
or not remove_result.tombstoned
|
|
515
|
-
):
|
|
516
|
-
erasure = _finalize_erasure(
|
|
517
|
-
engine, service, op_ctx, fact_id, profile_id, memory_id,
|
|
518
|
-
erasure_id, requested_at, requested_by=trusted_actor_id,
|
|
519
|
-
tombstoned=bool(remove_result and remove_result.tombstoned),
|
|
520
|
-
)
|
|
521
|
-
logger.error(
|
|
522
|
-
"Erasure blocked (residue or unverified tombstone) for %s — "
|
|
523
|
-
"canonical retained",
|
|
524
|
-
fact_id[:16],
|
|
525
|
-
)
|
|
526
|
-
return {
|
|
527
|
-
"ok": False,
|
|
528
|
-
"error": "erasure incomplete: projection residue",
|
|
529
|
-
"retryable": True,
|
|
530
|
-
**erasure,
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
# Fence the fact for the purge window so a concurrent materializer cannot
|
|
534
|
-
# re-write its projections after the durable tombstone is committed. The
|
|
535
|
-
# tombstone remains the cross-process signal; this is the in-process guard.
|
|
536
|
-
mark_erasing(profile_id, fact_id)
|
|
537
|
-
try:
|
|
538
|
-
if exists:
|
|
539
|
-
if canonical_runtime is not None:
|
|
540
|
-
result = dict(canonical_runtime.delete_fact(
|
|
541
|
-
profile_id, fact_id, idempotency_key=idempotency_key,
|
|
542
|
-
))
|
|
543
|
-
if not result.get("ok"):
|
|
544
|
-
return {"ok": False, "error": f"Memory {fact_id} not found"}
|
|
545
|
-
if not content_preview:
|
|
546
|
-
content_preview = str(result.get("content_preview", ""))
|
|
547
|
-
else:
|
|
548
|
-
engine._db.delete_fact(fact_id, profile_id=profile_id)
|
|
549
|
-
|
|
550
|
-
# Purge projections for a fresh delete and re-run (idempotently) for a
|
|
551
|
-
# resumed cleanup so an orphaned source memory is reclaimed on retry.
|
|
552
|
-
_purge_delete_projections(engine, fact_id, profile_id, memory_id=memory_id)
|
|
553
|
-
|
|
554
|
-
if exists:
|
|
555
|
-
tombstoned = bool(remove_result and remove_result.tombstoned)
|
|
556
|
-
else:
|
|
557
|
-
with engine._db.raw_connection() as _conn:
|
|
558
|
-
tombstoned = is_tombstoned(_conn, profile_id, fact_id)
|
|
559
|
-
|
|
560
|
-
erasure = _finalize_erasure(
|
|
561
|
-
engine, service, op_ctx, fact_id, profile_id, memory_id, erasure_id,
|
|
562
|
-
requested_at, requested_by=trusted_actor_id, tombstoned=tombstoned,
|
|
563
|
-
)
|
|
564
|
-
|
|
565
|
-
engine._hooks.run_post("delete", context)
|
|
566
|
-
logger.info(
|
|
567
|
-
"DELETE fact_id=%s actor=%s source_agent=%s content=%s",
|
|
568
|
-
fact_id[:16], trusted_actor_id, source_agent_id, content_preview,
|
|
569
|
-
)
|
|
570
|
-
erasure_verified = bool(erasure.get("erasure_verified", False))
|
|
571
|
-
if not erasure_verified:
|
|
572
|
-
logger.error(
|
|
573
|
-
"Erasure unverified for %s — returning retryable failure",
|
|
574
|
-
fact_id[:16],
|
|
575
|
-
)
|
|
576
|
-
return {
|
|
577
|
-
"ok": False,
|
|
578
|
-
"retryable": True,
|
|
579
|
-
"deleted": fact_id,
|
|
580
|
-
"content_preview": content_preview,
|
|
581
|
-
**erasure,
|
|
582
|
-
}
|
|
583
|
-
return {
|
|
584
|
-
"ok": True,
|
|
585
|
-
"deleted": fact_id,
|
|
586
|
-
"content_preview": content_preview,
|
|
587
|
-
**erasure,
|
|
588
|
-
}
|
|
589
|
-
finally:
|
|
590
|
-
clear_erasing(profile_id, fact_id)
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
def update_fact_authorized(
|
|
594
|
-
engine: Any,
|
|
595
|
-
fact_id: str,
|
|
596
|
-
content: str,
|
|
597
|
-
*,
|
|
598
|
-
trusted_actor_id: str,
|
|
599
|
-
source_agent_id: str,
|
|
600
|
-
canonical_runtime: Any | None = None,
|
|
601
|
-
idempotency_key: str | None = None,
|
|
602
|
-
) -> dict[str, Any]:
|
|
603
|
-
"""Create a review-required correction successor without rewriting history."""
|
|
604
|
-
if not content or not content.strip():
|
|
605
|
-
return {"ok": False, "error": "content cannot be empty"}
|
|
606
|
-
content = content.strip()
|
|
607
|
-
profile_id, context = _context(
|
|
608
|
-
engine,
|
|
609
|
-
"update",
|
|
610
|
-
fact_id,
|
|
611
|
-
trusted_actor_id=trusted_actor_id,
|
|
612
|
-
source_agent_id=source_agent_id,
|
|
613
|
-
content_preview=content,
|
|
614
|
-
)
|
|
615
|
-
rows = engine._db.execute(
|
|
616
|
-
"SELECT content FROM atomic_facts "
|
|
617
|
-
"WHERE fact_id = ? AND profile_id = ? LIMIT 1",
|
|
618
|
-
(fact_id, profile_id),
|
|
619
|
-
)
|
|
620
|
-
if not rows:
|
|
621
|
-
return {"ok": False, "error": f"Memory {fact_id} not found"}
|
|
622
|
-
source = engine._db.get_fact(fact_id)
|
|
623
|
-
if source is None:
|
|
624
|
-
return {"ok": False, "error": f"Memory {fact_id} not found"}
|
|
625
|
-
if source.content == content:
|
|
626
|
-
return {"ok": True, "fact_id": fact_id, "content": content, "unchanged": True}
|
|
627
|
-
if not _correction_ledger_available(engine):
|
|
628
|
-
return {"ok": False, "error": "review-gated correction ledger is unavailable"}
|
|
629
|
-
|
|
630
|
-
request_key = idempotency_key or uuid.uuid4().hex
|
|
631
|
-
successor_fact_id = uuid.uuid5(
|
|
632
|
-
uuid.NAMESPACE_URL,
|
|
633
|
-
f"slm-correction-successor:{profile_id}:{fact_id}:{request_key}",
|
|
634
|
-
).hex[:16]
|
|
635
|
-
embedding: list[float] | None = None
|
|
636
|
-
fisher_mean: list[float] | None = None
|
|
637
|
-
fisher_variance: list[float] | None = None
|
|
638
|
-
if engine._embedder:
|
|
639
|
-
try:
|
|
640
|
-
embedding = engine._embedder.embed(content)
|
|
641
|
-
if embedding:
|
|
642
|
-
fisher_mean, fisher_variance = (
|
|
643
|
-
engine._embedder.compute_fisher_params(embedding)
|
|
644
|
-
)
|
|
645
|
-
except Exception as exc:
|
|
646
|
-
logger.warning("Correction successor embedding refresh failed: %s", exc)
|
|
647
|
-
if canonical_runtime is None:
|
|
648
|
-
return {
|
|
649
|
-
"ok": False,
|
|
650
|
-
"retryable": True,
|
|
651
|
-
"error": "canonical correction writer is temporarily unavailable",
|
|
652
|
-
}
|
|
653
|
-
result = dict(canonical_runtime.create_correction_successor(
|
|
654
|
-
profile_id,
|
|
655
|
-
fact_id,
|
|
656
|
-
successor_fact_id,
|
|
657
|
-
content,
|
|
658
|
-
embedding=embedding,
|
|
659
|
-
fisher_mean=fisher_mean,
|
|
660
|
-
fisher_variance=fisher_variance,
|
|
661
|
-
trusted_actor_id=trusted_actor_id,
|
|
662
|
-
idempotency_key=request_key,
|
|
663
|
-
))
|
|
664
|
-
if not result.get("ok"):
|
|
665
|
-
return {"ok": False, "error": f"Memory {fact_id} not found"}
|
|
666
|
-
successor_fact_id = str(result["successor_fact_id"])
|
|
667
|
-
|
|
668
|
-
engine._hooks.run_post("update", context)
|
|
669
|
-
logger.info(
|
|
670
|
-
"CORRECTION_PROPOSED predecessor=%s successor=%s actor=%s source_agent=%s",
|
|
671
|
-
fact_id[:16], successor_fact_id[:16], trusted_actor_id, source_agent_id,
|
|
672
|
-
)
|
|
673
|
-
return {
|
|
674
|
-
"ok": True,
|
|
675
|
-
"fact_id": successor_fact_id,
|
|
676
|
-
"content": content,
|
|
677
|
-
"predecessor_fact_id": fact_id,
|
|
678
|
-
"successor_fact_id": successor_fact_id,
|
|
679
|
-
"correction_case": {
|
|
680
|
-
"case_id": result["case_id"],
|
|
681
|
-
"status": result["status"],
|
|
682
|
-
"version": result["version"],
|
|
683
|
-
},
|
|
684
|
-
"review_required": True,
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
__all__ = ["delete_fact_authorized", "purge_profile_context_cache", "update_fact_authorized"]
|