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,533 +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
|
-
"""SuperLocalMemory V3 - Compliance Routes
|
|
5
|
-
- AGPL-3.0-or-later
|
|
6
|
-
|
|
7
|
-
Routes: /api/compliance/status, /api/compliance/audit,
|
|
8
|
-
/api/compliance/retention-policy
|
|
9
|
-
Uses V3 compliance modules: ABACEngine, AuditChain, RetentionEngine.
|
|
10
|
-
"""
|
|
11
|
-
import logging
|
|
12
|
-
from typing import Optional
|
|
13
|
-
|
|
14
|
-
from fastapi import APIRouter, Query, Request
|
|
15
|
-
from fastapi.responses import JSONResponse
|
|
16
|
-
|
|
17
|
-
from superlocalmemory.server.route_mutations import authorize_route_mutation
|
|
18
|
-
from superlocalmemory.storage.memory_write import memory_write
|
|
19
|
-
|
|
20
|
-
from .helpers import DB_PATH, MEMORY_DIR, get_active_profile, get_engine_lazy
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger("superlocalmemory.routes.compliance")
|
|
23
|
-
router = APIRouter()
|
|
24
|
-
|
|
25
|
-
# The engine's audit post-hooks write to <data_root>/audit_chain.db
|
|
26
|
-
# (core/engine_wiring.py). The route MUST read that same file — an earlier
|
|
27
|
-
# "audit.db" path pointed at a file nothing ever wrote, so the Compliance tab
|
|
28
|
-
# always showed zero events.
|
|
29
|
-
AUDIT_DB = MEMORY_DIR / "audit_chain.db"
|
|
30
|
-
|
|
31
|
-
# Feature detection
|
|
32
|
-
COMPLIANCE_AVAILABLE = False
|
|
33
|
-
try:
|
|
34
|
-
from superlocalmemory.compliance.abac import ABACEngine
|
|
35
|
-
from superlocalmemory.compliance.audit import AuditChain
|
|
36
|
-
from superlocalmemory.compliance.gdpr import GDPRCompliance
|
|
37
|
-
from superlocalmemory.compliance.retention import RetentionEngine
|
|
38
|
-
COMPLIANCE_AVAILABLE = True
|
|
39
|
-
except ImportError:
|
|
40
|
-
logger.info("V3 compliance engine not available")
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def _require_manage(request) -> None:
|
|
44
|
-
"""Require MANAGE on the active workspace, where the workspace has roles.
|
|
45
|
-
|
|
46
|
-
A store with no roles configured has nobody to check against, and refusing
|
|
47
|
-
there would break every personal install; the loopback boundary is the
|
|
48
|
-
control in that case.
|
|
49
|
-
"""
|
|
50
|
-
try:
|
|
51
|
-
from superlocalmemory.access.rbac import Permission
|
|
52
|
-
from superlocalmemory.server.rbac_enforce import require_permission
|
|
53
|
-
|
|
54
|
-
require_permission(request, Permission.MANAGE, profile=get_active_profile())
|
|
55
|
-
except ImportError: # pragma: no cover -- roles are always present in-tree
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@router.get("/api/compliance/status")
|
|
60
|
-
async def compliance_status(request: Request):
|
|
61
|
-
"""Get compliance engine status for active profile."""
|
|
62
|
-
# This returns which operations ran and what categories of memory exist.
|
|
63
|
-
# That is operational metadata about someone's store; it had no gate at all.
|
|
64
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
65
|
-
|
|
66
|
-
require_http_mutation_actor(
|
|
67
|
-
request, getattr(request.app.state, "daemon_descriptor", None),
|
|
68
|
-
actor_kind="compliance-read",
|
|
69
|
-
)
|
|
70
|
-
if not COMPLIANCE_AVAILABLE:
|
|
71
|
-
return {"available": False, "message": "Compliance engine not available"}
|
|
72
|
-
|
|
73
|
-
try:
|
|
74
|
-
profile = get_active_profile()
|
|
75
|
-
|
|
76
|
-
# Audit events (hash-chained, from the engine's live audit_chain.db).
|
|
77
|
-
# Scope the count + recent list to the active profile.
|
|
78
|
-
audit_events_count = 0
|
|
79
|
-
recent_audit_events = []
|
|
80
|
-
try:
|
|
81
|
-
audit = AuditChain(str(AUDIT_DB))
|
|
82
|
-
recent_audit_events = audit.query(profile_id=profile, limit=30)
|
|
83
|
-
# get_stats() is global; count this profile's rows for the header.
|
|
84
|
-
audit_events_count = len(audit.query(profile_id=profile, limit=100000))
|
|
85
|
-
except Exception as exc:
|
|
86
|
-
logger.debug("audit chain: %s", exc)
|
|
87
|
-
|
|
88
|
-
# Retention policies (scoped to the active profile).
|
|
89
|
-
# RetentionEngine.__init__ runs DDL (CREATE TABLE IF NOT EXISTS) so even
|
|
90
|
-
# list_rules() is a write at the constructor level — use memory_write().
|
|
91
|
-
retention_policies = []
|
|
92
|
-
try:
|
|
93
|
-
with memory_write(DB_PATH) as conn:
|
|
94
|
-
engine = RetentionEngine(conn)
|
|
95
|
-
retention_policies = engine.list_rules(profile)
|
|
96
|
-
except Exception as exc:
|
|
97
|
-
logger.debug("retention engine: %s", exc)
|
|
98
|
-
|
|
99
|
-
# ABAC policies
|
|
100
|
-
abac_policies_count = 0
|
|
101
|
-
try:
|
|
102
|
-
abac = ABACEngine()
|
|
103
|
-
abac_policies_count = len(abac._policies)
|
|
104
|
-
except Exception:
|
|
105
|
-
pass
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
"available": True,
|
|
109
|
-
"active_profile": profile,
|
|
110
|
-
"audit_events_count": audit_events_count,
|
|
111
|
-
"recent_audit_events": recent_audit_events,
|
|
112
|
-
"retention_policies": retention_policies,
|
|
113
|
-
"abac_policies_count": abac_policies_count,
|
|
114
|
-
}
|
|
115
|
-
except Exception:
|
|
116
|
-
logger.exception("compliance_status error")
|
|
117
|
-
return {"available": False, "error": "Internal server error"}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
@router.get("/api/compliance/audit")
|
|
121
|
-
async def query_audit_trail(
|
|
122
|
-
request: Request,
|
|
123
|
-
limit: int = Query(default=50, ge=1, le=500),
|
|
124
|
-
event_type: Optional[str] = Query(default=None),
|
|
125
|
-
since: Optional[str] = Query(default=None),
|
|
126
|
-
):
|
|
127
|
-
"""Query audit trail events with optional filters."""
|
|
128
|
-
if not COMPLIANCE_AVAILABLE:
|
|
129
|
-
return {"available": False, "error": "Compliance engine not available"}
|
|
130
|
-
# The audit trail reveals operations, actors, and fact_ids. This GET is not
|
|
131
|
-
# covered by the mutation middleware; the same-origin dashboard reads it via
|
|
132
|
-
# a plain GET (no token header), so gate on the loopback-trusted mutation
|
|
133
|
-
# boundary — local owner allowed, remote uncredentialed caller fails closed.
|
|
134
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
135
|
-
require_http_mutation_actor(request, getattr(request.app.state, "daemon_descriptor", None),
|
|
136
|
-
actor_kind="audit-read")
|
|
137
|
-
try:
|
|
138
|
-
profile = get_active_profile()
|
|
139
|
-
audit = AuditChain(str(AUDIT_DB))
|
|
140
|
-
events = audit.query(
|
|
141
|
-
profile_id=profile, operation=event_type, start_date=since,
|
|
142
|
-
limit=limit,
|
|
143
|
-
)
|
|
144
|
-
chain_ok = True
|
|
145
|
-
try:
|
|
146
|
-
chain_ok = audit.verify_integrity()
|
|
147
|
-
except Exception:
|
|
148
|
-
pass
|
|
149
|
-
return {
|
|
150
|
-
"available": True, "events": events, "total": len(events),
|
|
151
|
-
"chain_verified": chain_ok, "active_profile": profile,
|
|
152
|
-
"filters": {"event_type": event_type, "since": since, "limit": limit},
|
|
153
|
-
}
|
|
154
|
-
except Exception:
|
|
155
|
-
logger.exception("query_audit_trail error")
|
|
156
|
-
return {"available": False, "error": "Internal server error"}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def _erasure_succeeded(result: dict) -> bool:
|
|
160
|
-
"""One place that decides, so the surfaces cannot disagree.
|
|
161
|
-
|
|
162
|
-
The erasure reports two things, because they are two questions: whether the
|
|
163
|
-
data is gone, and whether that can be shown afterwards. This route used to
|
|
164
|
-
inline its own list of failure markers and the CLI used a different one, so
|
|
165
|
-
the API could say failure while the command line printed COMPLETE for the
|
|
166
|
-
same erasure.
|
|
167
|
-
|
|
168
|
-
Anything that leaves either question unanswered is a failure here. A caller
|
|
169
|
-
that wants the finer distinction reads ``erasure_complete`` and
|
|
170
|
-
``erasure_provable`` from the body, which are both in it.
|
|
171
|
-
"""
|
|
172
|
-
markers = (
|
|
173
|
-
"vector_store_failures",
|
|
174
|
-
"audit_completion_failed",
|
|
175
|
-
"audit_request_failed",
|
|
176
|
-
"receipt_persist_failed",
|
|
177
|
-
"table_delete_failures",
|
|
178
|
-
"code_graph_failed",
|
|
179
|
-
"fact_expansion_fts_failed",
|
|
180
|
-
"working_sets_failed",
|
|
181
|
-
"residue_recount_failed",
|
|
182
|
-
"backup_scan_failed",
|
|
183
|
-
)
|
|
184
|
-
if any(result.get(marker) for marker in markers):
|
|
185
|
-
return False
|
|
186
|
-
# Present on the profile path; absent on the entity path, where its absence
|
|
187
|
-
# must not be read as a failure.
|
|
188
|
-
for verdict in ("erasure_complete", "erasure_provable"):
|
|
189
|
-
if verdict in result and not result.get(verdict):
|
|
190
|
-
return False
|
|
191
|
-
return True
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
@router.post("/api/compliance/retention-policy")
|
|
195
|
-
async def create_retention_policy(request: Request, data: dict):
|
|
196
|
-
"""Create a compliance retention policy.
|
|
197
|
-
|
|
198
|
-
Body: {
|
|
199
|
-
name: str,
|
|
200
|
-
retention_days: int,
|
|
201
|
-
category: str (maps to framework),
|
|
202
|
-
action: "archive" | "tombstone" | "notify",
|
|
203
|
-
applies_to: dict (optional)
|
|
204
|
-
}
|
|
205
|
-
"""
|
|
206
|
-
# A retention rule decides what is kept and for how long, so changing one
|
|
207
|
-
# is a persistent configuration change on someone else's data. It is gated
|
|
208
|
-
# on the same loopback-trusted boundary the audit read uses, and on MANAGE
|
|
209
|
-
# in a workspace that has roles -- it had neither.
|
|
210
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
211
|
-
|
|
212
|
-
require_http_mutation_actor(
|
|
213
|
-
request, getattr(request.app.state, "daemon_descriptor", None),
|
|
214
|
-
actor_kind="retention-policy",
|
|
215
|
-
)
|
|
216
|
-
_require_manage(request)
|
|
217
|
-
if not COMPLIANCE_AVAILABLE:
|
|
218
|
-
return {"success": False, "error": "Compliance engine not available"}
|
|
219
|
-
|
|
220
|
-
name = data.get('name')
|
|
221
|
-
retention_days = data.get('retention_days')
|
|
222
|
-
framework = data.get('category', 'custom')
|
|
223
|
-
action = data.get('action')
|
|
224
|
-
applies_to = data.get('applies_to', {})
|
|
225
|
-
|
|
226
|
-
if not name or not isinstance(name, str):
|
|
227
|
-
return {"success": False, "error": "name is required (string)"}
|
|
228
|
-
if not isinstance(retention_days, int) or retention_days < 1:
|
|
229
|
-
return {"success": False, "error": "retention_days must be a positive integer"}
|
|
230
|
-
|
|
231
|
-
valid_actions = ("archive", "tombstone", "notify")
|
|
232
|
-
if action not in valid_actions:
|
|
233
|
-
return {"success": False, "error": f"action must be one of: {valid_actions}"}
|
|
234
|
-
|
|
235
|
-
try:
|
|
236
|
-
profile = get_active_profile()
|
|
237
|
-
with memory_write(DB_PATH) as conn:
|
|
238
|
-
engine = RetentionEngine(conn)
|
|
239
|
-
rule_id = engine.create_rule(
|
|
240
|
-
name=name, framework=framework,
|
|
241
|
-
retention_days=retention_days, action=action,
|
|
242
|
-
applies_to=applies_to, profile_id=profile,
|
|
243
|
-
)
|
|
244
|
-
|
|
245
|
-
return {
|
|
246
|
-
"success": True, "rule_id": rule_id,
|
|
247
|
-
"active_profile": profile,
|
|
248
|
-
"message": f"Retention policy '{name}' created ({retention_days}d, {action})",
|
|
249
|
-
}
|
|
250
|
-
except Exception:
|
|
251
|
-
logger.exception("create_retention_policy error")
|
|
252
|
-
return {"success": False, "error": "Internal server error"}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
@router.delete("/api/compliance/retention-policy")
|
|
256
|
-
async def delete_retention_policy(request: Request, name: str = Query(...)):
|
|
257
|
-
"""Delete a retention policy by name for the active profile."""
|
|
258
|
-
# A retention rule decides what is kept and for how long, so changing one
|
|
259
|
-
# is a persistent configuration change on someone else's data. It is gated
|
|
260
|
-
# on the same loopback-trusted boundary the audit read uses, and on MANAGE
|
|
261
|
-
# in a workspace that has roles -- it had neither.
|
|
262
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
263
|
-
|
|
264
|
-
require_http_mutation_actor(
|
|
265
|
-
request, getattr(request.app.state, "daemon_descriptor", None),
|
|
266
|
-
actor_kind="retention-policy",
|
|
267
|
-
)
|
|
268
|
-
_require_manage(request)
|
|
269
|
-
if not COMPLIANCE_AVAILABLE:
|
|
270
|
-
return {"success": False, "error": "Compliance engine not available"}
|
|
271
|
-
try:
|
|
272
|
-
profile = get_active_profile()
|
|
273
|
-
with memory_write(DB_PATH) as conn:
|
|
274
|
-
engine = RetentionEngine(conn)
|
|
275
|
-
removed = engine.delete_rule(profile, name)
|
|
276
|
-
if not removed:
|
|
277
|
-
return {"success": False, "error": f"Policy '{name}' not found"}
|
|
278
|
-
return {"success": True, "active_profile": profile,
|
|
279
|
-
"message": f"Retention policy '{name}' deleted"}
|
|
280
|
-
except Exception:
|
|
281
|
-
logger.exception("delete_retention_policy error")
|
|
282
|
-
return {"success": False, "error": "Internal server error"}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
@router.post("/api/compliance/retention/enforce")
|
|
286
|
-
async def enforce_retention(request: Request):
|
|
287
|
-
"""Run all retention policies for the active profile now.
|
|
288
|
-
|
|
289
|
-
Moves expired facts to their rule's terminal lifecycle zone (archive/
|
|
290
|
-
tombstone) or counts them (notify). Soft-state only — never a raw delete.
|
|
291
|
-
"""
|
|
292
|
-
# A retention rule decides what is kept and for how long, so changing one
|
|
293
|
-
# is a persistent configuration change on someone else's data. It is gated
|
|
294
|
-
# on the same loopback-trusted boundary the audit read uses, and on MANAGE
|
|
295
|
-
# in a workspace that has roles -- it had neither.
|
|
296
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
297
|
-
|
|
298
|
-
require_http_mutation_actor(
|
|
299
|
-
request, getattr(request.app.state, "daemon_descriptor", None),
|
|
300
|
-
actor_kind="retention-policy",
|
|
301
|
-
)
|
|
302
|
-
_require_manage(request)
|
|
303
|
-
if not COMPLIANCE_AVAILABLE:
|
|
304
|
-
return {"success": False, "error": "Compliance engine not available"}
|
|
305
|
-
try:
|
|
306
|
-
profile = get_active_profile()
|
|
307
|
-
with memory_write(DB_PATH) as conn:
|
|
308
|
-
engine = RetentionEngine(conn)
|
|
309
|
-
result = engine.enforce(profile)
|
|
310
|
-
return {"success": True, **result}
|
|
311
|
-
except Exception:
|
|
312
|
-
logger.exception("enforce_retention error")
|
|
313
|
-
return {"success": False, "error": "Internal server error"}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
# ── GDPR Art. 15/20 — Right to Access / Portability ─────────────────────────
|
|
317
|
-
|
|
318
|
-
@router.get("/api/compliance/gdpr/export")
|
|
319
|
-
async def gdpr_export(request: Request):
|
|
320
|
-
"""Export ALL data for the active profile (GDPR Art. 20 portability).
|
|
321
|
-
|
|
322
|
-
Comprehensive 14-table export (memories, facts, entities, edges, trust,
|
|
323
|
-
feedback, behavioral patterns, provenance, audit, …) as a downloadable
|
|
324
|
-
JSON attachment. Read-only.
|
|
325
|
-
"""
|
|
326
|
-
if not COMPLIANCE_AVAILABLE:
|
|
327
|
-
return {"available": False, "error": "Compliance engine not available"}
|
|
328
|
-
# A full-workspace data dump is an administrative action. Triggered by a
|
|
329
|
-
# top-level navigation (a.href) that cannot carry a credential header, so
|
|
330
|
-
# gate on the loopback-trusted mutation boundary (local owner allowed,
|
|
331
|
-
# remote uncredentialed fails closed) AND require MANAGE — in company mode
|
|
332
|
-
# a session cookie flows on navigation, so a non-admin user is still denied;
|
|
333
|
-
# the machine owner keeps MANAGE.
|
|
334
|
-
from superlocalmemory.server.rbac_enforce import require_manage
|
|
335
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
336
|
-
require_http_mutation_actor(request, getattr(request.app.state, "daemon_descriptor", None),
|
|
337
|
-
actor_kind="gdpr-export")
|
|
338
|
-
require_manage(request)
|
|
339
|
-
try:
|
|
340
|
-
engine = get_engine_lazy(request.app.state)
|
|
341
|
-
if engine is None:
|
|
342
|
-
return {"available": False, "error": "Engine not initialized"}
|
|
343
|
-
profile = get_active_profile()
|
|
344
|
-
data = GDPRCompliance(engine._db).export_profile_data(profile)
|
|
345
|
-
filename = f"slm-export-{profile}.json"
|
|
346
|
-
return JSONResponse(
|
|
347
|
-
content=data,
|
|
348
|
-
headers={"Content-Disposition": f'attachment; filename="{filename}"'},
|
|
349
|
-
)
|
|
350
|
-
except Exception:
|
|
351
|
-
logger.exception("gdpr_export error")
|
|
352
|
-
return {"available": False, "error": "Internal server error"}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
# ── GDPR Art. 17 — Right to Erasure ─────────────────────────────────────────
|
|
356
|
-
|
|
357
|
-
@router.post("/api/compliance/gdpr/erase")
|
|
358
|
-
async def gdpr_erase(request: Request, data: dict = {}):
|
|
359
|
-
"""Permanently erase ALL data for the active profile (GDPR Art. 17).
|
|
360
|
-
|
|
361
|
-
IRREVERSIBLE. Requires an explicit ``confirm`` field in the body that
|
|
362
|
-
exactly matches the active profile name — this is the guard against an
|
|
363
|
-
accidental one-click wipe. The 'default' profile can never be erased
|
|
364
|
-
(enforced in GDPRCompliance.forget_profile). Mutation-authorized.
|
|
365
|
-
"""
|
|
366
|
-
if not COMPLIANCE_AVAILABLE:
|
|
367
|
-
return {"success": False, "error": "Compliance engine not available"}
|
|
368
|
-
try:
|
|
369
|
-
engine = get_engine_lazy(request.app.state)
|
|
370
|
-
if engine is None:
|
|
371
|
-
return {"success": False, "error": "Engine not initialized"}
|
|
372
|
-
profile = get_active_profile()
|
|
373
|
-
confirm = (data or {}).get("confirm", "")
|
|
374
|
-
if confirm != profile:
|
|
375
|
-
return {
|
|
376
|
-
"success": False,
|
|
377
|
-
"error": (
|
|
378
|
-
"Confirmation required: send {\"confirm\": \"" + profile +
|
|
379
|
-
"\"} to erase this profile. This is irreversible."
|
|
380
|
-
),
|
|
381
|
-
}
|
|
382
|
-
if profile == "default":
|
|
383
|
-
return {"success": False,
|
|
384
|
-
"error": "The 'default' profile cannot be erased."}
|
|
385
|
-
# Irreversible erasure is admin-only (beyond mutation auth).
|
|
386
|
-
from superlocalmemory.server.rbac_enforce import require_manage
|
|
387
|
-
require_manage(request, profile=profile)
|
|
388
|
-
authorization = authorize_route_mutation(
|
|
389
|
-
request,
|
|
390
|
-
operation="delete",
|
|
391
|
-
source_agent_id="http-gdpr-erase",
|
|
392
|
-
profile_id=profile,
|
|
393
|
-
)
|
|
394
|
-
result = GDPRCompliance(engine._db, engine=engine).forget_profile(profile)
|
|
395
|
-
authorization.complete()
|
|
396
|
-
result = result or {}
|
|
397
|
-
success = _erasure_succeeded(result)
|
|
398
|
-
return {"success": success, "active_profile": profile, **result}
|
|
399
|
-
except Exception:
|
|
400
|
-
logger.exception("gdpr_erase error")
|
|
401
|
-
return {"success": False, "error": "Internal server error"}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
# ── GDPR Art. 17 — Entity-level Erasure ──────────────────────────────────────
|
|
405
|
-
|
|
406
|
-
@router.post("/api/compliance/gdpr/erase-entity")
|
|
407
|
-
async def gdpr_erase_entity(request: Request, data: dict = {}):
|
|
408
|
-
"""Erase all facts mentioning a named entity for the active profile.
|
|
409
|
-
|
|
410
|
-
IRREVERSIBLE. Body must contain an ``entity_name`` and a ``confirm``
|
|
411
|
-
field that exactly matches ``entity_name`` — same confirm-guard pattern
|
|
412
|
-
as profile erasure. Mutation-authorized; requires MANAGE permission.
|
|
413
|
-
"""
|
|
414
|
-
if not COMPLIANCE_AVAILABLE:
|
|
415
|
-
return {"success": False, "error": "Compliance engine not available"}
|
|
416
|
-
try:
|
|
417
|
-
engine = get_engine_lazy(request.app.state)
|
|
418
|
-
if engine is None:
|
|
419
|
-
return {"success": False, "error": "Engine not initialized"}
|
|
420
|
-
profile = get_active_profile()
|
|
421
|
-
entity_name = ((data or {}).get("entity_name") or "").strip()
|
|
422
|
-
confirm = (data or {}).get("confirm", "")
|
|
423
|
-
if not entity_name:
|
|
424
|
-
return {"success": False, "error": "entity_name is required"}
|
|
425
|
-
if confirm != entity_name:
|
|
426
|
-
return {
|
|
427
|
-
"success": False,
|
|
428
|
-
"error": (
|
|
429
|
-
"Confirmation required: send {\"confirm\": \"" + entity_name +
|
|
430
|
-
"\"} to erase this entity. This is irreversible."
|
|
431
|
-
),
|
|
432
|
-
}
|
|
433
|
-
from superlocalmemory.server.rbac_enforce import require_manage
|
|
434
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
435
|
-
require_http_mutation_actor(
|
|
436
|
-
request,
|
|
437
|
-
getattr(request.app.state, "daemon_descriptor", None),
|
|
438
|
-
actor_kind="gdpr-erase-entity",
|
|
439
|
-
)
|
|
440
|
-
require_manage(request, profile=profile)
|
|
441
|
-
authorization = authorize_route_mutation(
|
|
442
|
-
request,
|
|
443
|
-
operation="delete",
|
|
444
|
-
source_agent_id="http-gdpr-erase-entity",
|
|
445
|
-
profile_id=profile,
|
|
446
|
-
)
|
|
447
|
-
result = GDPRCompliance(engine._db, engine=engine).forget_entity(entity_name, profile)
|
|
448
|
-
authorization.complete()
|
|
449
|
-
result = result or {}
|
|
450
|
-
success = _erasure_succeeded(result)
|
|
451
|
-
return {
|
|
452
|
-
"success": success, "active_profile": profile,
|
|
453
|
-
"entity_name": entity_name, **result,
|
|
454
|
-
}
|
|
455
|
-
except Exception:
|
|
456
|
-
logger.exception("gdpr_erase_entity error")
|
|
457
|
-
return {"success": False, "error": "Internal server error"}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
# ── Erasure Receipts — list + cryptographic verify ───────────────────────────
|
|
461
|
-
|
|
462
|
-
@router.get("/api/compliance/receipts")
|
|
463
|
-
async def list_erasure_receipts(
|
|
464
|
-
request: Request,
|
|
465
|
-
limit: int = Query(default=50, ge=1, le=200),
|
|
466
|
-
):
|
|
467
|
-
"""List recent erasure receipts for the active profile.
|
|
468
|
-
|
|
469
|
-
Returns summary rows from ``erasure_receipts`` (migration M035):
|
|
470
|
-
erasure_id, subject_type, subject_id, state, all_erased, fact_count,
|
|
471
|
-
requested_at, completed_at. Read-only; loopback-gated.
|
|
472
|
-
"""
|
|
473
|
-
if not COMPLIANCE_AVAILABLE:
|
|
474
|
-
return {"available": False, "error": "Compliance engine not available"}
|
|
475
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
476
|
-
require_http_mutation_actor(
|
|
477
|
-
request,
|
|
478
|
-
getattr(request.app.state, "daemon_descriptor", None),
|
|
479
|
-
actor_kind="erasure-receipts-read",
|
|
480
|
-
)
|
|
481
|
-
try:
|
|
482
|
-
engine = get_engine_lazy(request.app.state)
|
|
483
|
-
if engine is None:
|
|
484
|
-
return {"available": False, "error": "Engine not initialized"}
|
|
485
|
-
profile = get_active_profile()
|
|
486
|
-
try:
|
|
487
|
-
rows = engine._db.execute(
|
|
488
|
-
"SELECT erasure_id, subject_type, subject_id, state, all_erased, "
|
|
489
|
-
"fact_count, requested_at, completed_at "
|
|
490
|
-
"FROM erasure_receipts WHERE profile_id = ? "
|
|
491
|
-
"ORDER BY requested_at DESC LIMIT ?",
|
|
492
|
-
(profile, limit),
|
|
493
|
-
)
|
|
494
|
-
receipts = [dict(r) for r in rows]
|
|
495
|
-
except Exception:
|
|
496
|
-
receipts = []
|
|
497
|
-
return {
|
|
498
|
-
"available": True, "active_profile": profile,
|
|
499
|
-
"receipts": receipts, "total": len(receipts),
|
|
500
|
-
}
|
|
501
|
-
except Exception:
|
|
502
|
-
logger.exception("list_erasure_receipts error")
|
|
503
|
-
return {"available": False, "error": "Internal server error"}
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
@router.get("/api/compliance/receipts/{erasure_id}/verify")
|
|
507
|
-
async def verify_erasure_receipt(request: Request, erasure_id: str):
|
|
508
|
-
"""Cryptographically verify an erasure receipt's audit hash.
|
|
509
|
-
|
|
510
|
-
Returns ``{verified: bool}`` — True means the stored hash matches a
|
|
511
|
-
recompute from the receipt fields (tamper-evident). Read-only;
|
|
512
|
-
loopback-gated.
|
|
513
|
-
"""
|
|
514
|
-
if not COMPLIANCE_AVAILABLE:
|
|
515
|
-
return {"available": False, "error": "Compliance engine not available"}
|
|
516
|
-
from superlocalmemory.server.write_identity import require_http_mutation_actor
|
|
517
|
-
require_http_mutation_actor(
|
|
518
|
-
request,
|
|
519
|
-
getattr(request.app.state, "daemon_descriptor", None),
|
|
520
|
-
actor_kind="erasure-receipt-verify",
|
|
521
|
-
)
|
|
522
|
-
try:
|
|
523
|
-
engine = get_engine_lazy(request.app.state)
|
|
524
|
-
if engine is None:
|
|
525
|
-
return {"available": False, "error": "Engine not initialized"}
|
|
526
|
-
profile = get_active_profile()
|
|
527
|
-
from superlocalmemory.core.transactions.erasure import verify_receipt
|
|
528
|
-
with engine._db.raw_connection() as conn:
|
|
529
|
-
verified = verify_receipt(conn, erasure_id, profile_id=profile)
|
|
530
|
-
return {"available": True, "erasure_id": erasure_id, "verified": verified}
|
|
531
|
-
except Exception:
|
|
532
|
-
logger.exception("verify_erasure_receipt error")
|
|
533
|
-
return {"available": False, "error": "Internal server error"}
|