superlocalmemory 4.1.13 → 4.1.15
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 +103 -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,194 +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 — per-profile isolation (I-6 / C2)
|
|
4
|
-
|
|
5
|
-
"""M023 — profile_id on all mesh coordination tables (memory.db, deferred).
|
|
6
|
-
|
|
7
|
-
The mesh broker is a per-agent coordination bus (peers, notification messages,
|
|
8
|
-
shared key/value state, file locks, event log). Every mesh table was GLOBAL —
|
|
9
|
-
no ``profile_id`` — so in a multi-tenant deployment (profiles = individual /
|
|
10
|
-
team / company tenants) tenant A could see tenant B's peers, receive B's
|
|
11
|
-
broadcast messages, read/overwrite B's shared state by key collision, and be
|
|
12
|
-
blocked by B's file locks. That is a concrete cross-tenant isolation leak.
|
|
13
|
-
|
|
14
|
-
This migration makes the mesh namespace per-profile:
|
|
15
|
-
|
|
16
|
-
* mesh_peers, mesh_messages, mesh_events — additive ``profile_id`` column +
|
|
17
|
-
profile-leading indexes (no primary-key change).
|
|
18
|
-
* mesh_state — rebuilt with PRIMARY KEY(profile_id, key) so the same key can
|
|
19
|
-
exist independently per tenant.
|
|
20
|
-
* mesh_locks — rebuilt with PRIMARY KEY(profile_id, file_path) so one tenant's
|
|
21
|
-
lock on a path never blocks another tenant.
|
|
22
|
-
|
|
23
|
-
mesh_reads is intentionally left unchanged: it is (message_id, peer_id), both of
|
|
24
|
-
which are already profile-scoped by their parent rows, so a cross-profile read
|
|
25
|
-
row is unreachable.
|
|
26
|
-
|
|
27
|
-
Existing rows backfill to the 'default' profile (the default active profile).
|
|
28
|
-
Idempotent and tolerant of missing tables; deferred because the mesh tables are
|
|
29
|
-
created at engine init (apply_v343_schema), after ``apply_all`` runs — same
|
|
30
|
-
reason as M021.
|
|
31
|
-
|
|
32
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
from __future__ import annotations
|
|
36
|
-
|
|
37
|
-
import sqlite3
|
|
38
|
-
|
|
39
|
-
NAME = "M023_mesh_profile_isolation"
|
|
40
|
-
DB_TARGET = "memory"
|
|
41
|
-
|
|
42
|
-
# Documentation + drift hash. apply() below is the authoritative executor.
|
|
43
|
-
DDL = (
|
|
44
|
-
"ALTER TABLE mesh_peers ADD COLUMN profile_id TEXT NOT NULL DEFAULT 'default';"
|
|
45
|
-
"ALTER TABLE mesh_messages ADD COLUMN profile_id TEXT NOT NULL DEFAULT 'default';"
|
|
46
|
-
"ALTER TABLE mesh_events ADD COLUMN profile_id TEXT NOT NULL DEFAULT 'default';"
|
|
47
|
-
"-- rebuild mesh_state PK(profile_id, key); mesh_locks PK(profile_id, file_path)"
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
_NEW_STATE = """
|
|
51
|
-
CREATE TABLE mesh_state (
|
|
52
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
53
|
-
key TEXT NOT NULL,
|
|
54
|
-
value TEXT NOT NULL,
|
|
55
|
-
set_by TEXT NOT NULL,
|
|
56
|
-
updated_at TEXT NOT NULL,
|
|
57
|
-
PRIMARY KEY (profile_id, key)
|
|
58
|
-
)
|
|
59
|
-
"""
|
|
60
|
-
|
|
61
|
-
_NEW_LOCKS = """
|
|
62
|
-
CREATE TABLE mesh_locks (
|
|
63
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
64
|
-
file_path TEXT NOT NULL,
|
|
65
|
-
locked_by TEXT NOT NULL,
|
|
66
|
-
locked_at TEXT NOT NULL,
|
|
67
|
-
expires_at TEXT NOT NULL DEFAULT '9999-12-31T23:59:59Z',
|
|
68
|
-
PRIMARY KEY (profile_id, file_path)
|
|
69
|
-
)
|
|
70
|
-
"""
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def _cols(conn: sqlite3.Connection, table: str) -> set[str]:
|
|
74
|
-
return {r[1] for r in conn.execute(f"PRAGMA table_info({table})").fetchall()}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def _table_exists(conn: sqlite3.Connection, table: str) -> bool:
|
|
78
|
-
return conn.execute(
|
|
79
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,)
|
|
80
|
-
).fetchone() is not None
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def _add_profile_column(conn: sqlite3.Connection, table: str) -> None:
|
|
84
|
-
"""Additive profile_id on a table whose primary key does not change."""
|
|
85
|
-
if not _table_exists(conn, table):
|
|
86
|
-
return
|
|
87
|
-
if "profile_id" not in _cols(conn, table):
|
|
88
|
-
conn.execute(
|
|
89
|
-
f"ALTER TABLE {table} "
|
|
90
|
-
"ADD COLUMN profile_id TEXT NOT NULL DEFAULT 'default'"
|
|
91
|
-
)
|
|
92
|
-
# New column defaults 'default' for every legacy row; no extra UPDATE
|
|
93
|
-
# needed. (NOT NULL DEFAULT is applied to existing rows by SQLite.)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
def _atomic_rebuild(conn: sqlite3.Connection, table: str, create_sql: str,
|
|
97
|
-
insert_sql: str) -> None:
|
|
98
|
-
"""RENAME→CREATE→copy→DROP as ONE transaction.
|
|
99
|
-
|
|
100
|
-
Uses conn.execute (NOT executescript, which force-commits mid-rebuild and
|
|
101
|
-
could leave a zombie *_old table with the only copy of the data if a later
|
|
102
|
-
step fails). BEGIN IMMEDIATE + explicit COMMIT/ROLLBACK guarantees the
|
|
103
|
-
rebuild is all-or-nothing even under the runner's autocommit connection.
|
|
104
|
-
"""
|
|
105
|
-
if not _table_exists(conn, table):
|
|
106
|
-
return
|
|
107
|
-
if "profile_id" in _cols(conn, table):
|
|
108
|
-
return
|
|
109
|
-
old = f"_{table}_old"
|
|
110
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
111
|
-
try:
|
|
112
|
-
conn.execute(f"ALTER TABLE {table} RENAME TO {old}")
|
|
113
|
-
conn.execute(create_sql.strip().rstrip(";"))
|
|
114
|
-
conn.execute(insert_sql.replace("__OLD__", old))
|
|
115
|
-
conn.execute(f"DROP TABLE {old}")
|
|
116
|
-
conn.execute("COMMIT")
|
|
117
|
-
except Exception:
|
|
118
|
-
conn.execute("ROLLBACK")
|
|
119
|
-
raise
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def _rebuild_state(conn: sqlite3.Connection) -> None:
|
|
123
|
-
_atomic_rebuild(
|
|
124
|
-
conn, "mesh_state", _NEW_STATE,
|
|
125
|
-
"INSERT INTO mesh_state (profile_id, key, value, set_by, updated_at) "
|
|
126
|
-
"SELECT 'default', key, value, set_by, updated_at FROM __OLD__",
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def _rebuild_locks(conn: sqlite3.Connection) -> None:
|
|
131
|
-
_atomic_rebuild(
|
|
132
|
-
conn, "mesh_locks", _NEW_LOCKS,
|
|
133
|
-
"INSERT INTO mesh_locks "
|
|
134
|
-
"(profile_id, file_path, locked_by, locked_at, expires_at) "
|
|
135
|
-
"SELECT 'default', file_path, locked_by, locked_at, expires_at FROM __OLD__",
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def _indexes(conn: sqlite3.Connection) -> None:
|
|
140
|
-
"""Profile-leading indexes. Created here (not in schema_v343) so an upgrade
|
|
141
|
-
never runs CREATE INDEX on a column that does not exist yet."""
|
|
142
|
-
if _table_exists(conn, "mesh_peers") and "profile_id" in _cols(conn, "mesh_peers"):
|
|
143
|
-
peer_cols = _cols(conn, "mesh_peers")
|
|
144
|
-
if "session_id" in peer_cols:
|
|
145
|
-
conn.execute(
|
|
146
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_peers_profile "
|
|
147
|
-
"ON mesh_peers(profile_id, session_id)"
|
|
148
|
-
)
|
|
149
|
-
if "status" in peer_cols:
|
|
150
|
-
conn.execute(
|
|
151
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_peers_profile_status "
|
|
152
|
-
"ON mesh_peers(profile_id, status)"
|
|
153
|
-
)
|
|
154
|
-
if _table_exists(conn, "mesh_messages") and "profile_id" in _cols(conn, "mesh_messages"):
|
|
155
|
-
msg_cols = _cols(conn, "mesh_messages")
|
|
156
|
-
conn.execute(
|
|
157
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_messages_profile_to "
|
|
158
|
-
"ON mesh_messages(profile_id, to_peer, read)"
|
|
159
|
-
)
|
|
160
|
-
# target_type / project_path are v3.4.6 additions. In the normal upgrade
|
|
161
|
-
# path they exist (schema_v343 applies its ALTERs before deferred
|
|
162
|
-
# migrations run), but guard anyway so M023 is robust on any DB.
|
|
163
|
-
if {"target_type", "project_path"} <= msg_cols:
|
|
164
|
-
conn.execute(
|
|
165
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_messages_profile_target "
|
|
166
|
-
"ON mesh_messages(profile_id, target_type, project_path)"
|
|
167
|
-
)
|
|
168
|
-
if _table_exists(conn, "mesh_events") and "profile_id" in _cols(conn, "mesh_events"):
|
|
169
|
-
conn.execute(
|
|
170
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_events_profile "
|
|
171
|
-
"ON mesh_events(profile_id, id)"
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
176
|
-
"""Profile-scope every mesh table. Idempotent; no-op on a fresh/migrated DB.
|
|
177
|
-
|
|
178
|
-
Existing rows backfill to the 'default' profile.
|
|
179
|
-
"""
|
|
180
|
-
_add_profile_column(conn, "mesh_peers")
|
|
181
|
-
_add_profile_column(conn, "mesh_messages")
|
|
182
|
-
_add_profile_column(conn, "mesh_events")
|
|
183
|
-
_rebuild_state(conn)
|
|
184
|
-
_rebuild_locks(conn)
|
|
185
|
-
_indexes(conn)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
189
|
-
"""Applied once every mesh table carries profile_id (or is absent)."""
|
|
190
|
-
for table in ("mesh_peers", "mesh_messages", "mesh_events",
|
|
191
|
-
"mesh_state", "mesh_locks"):
|
|
192
|
-
if _table_exists(conn, table) and "profile_id" not in _cols(conn, table):
|
|
193
|
-
return False
|
|
194
|
-
return True
|
|
@@ -1,87 +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 — RBAC / teams (C3)
|
|
4
|
-
|
|
5
|
-
"""M024 — user identity + role-based access control tables (memory.db).
|
|
6
|
-
|
|
7
|
-
SLM's tenancy boundary is the profile (individual / team / company). Until now
|
|
8
|
-
the daemon had no *user* identity — access was machine-level (install token /
|
|
9
|
-
daemon capability). For team and company deployments an org needs real users,
|
|
10
|
-
each with a role on a profile, managed from the dashboard.
|
|
11
|
-
|
|
12
|
-
Adopts the Cognee reference model (Tenant -> User -> Role):
|
|
13
|
-
* rbac_users — a person/agent identity with a hashed password.
|
|
14
|
-
* rbac_memberships — (profile_id, user_id) -> role, the tenant/role grant.
|
|
15
|
-
* rbac_sessions — dashboard login sessions (hashed bearer token + expiry).
|
|
16
|
-
|
|
17
|
-
RBAC is additive: with zero users the daemon stays single-operator (the machine
|
|
18
|
-
operator over loopback is the implicit owner). Once users + memberships exist,
|
|
19
|
-
logged-in users are enforced against their role. Brand-new independent tables,
|
|
20
|
-
so this is a normal (pre-engine-init) migration with an idempotent apply().
|
|
21
|
-
|
|
22
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
from __future__ import annotations
|
|
26
|
-
|
|
27
|
-
import sqlite3
|
|
28
|
-
|
|
29
|
-
NAME = "M024_rbac_users_roles"
|
|
30
|
-
DB_TARGET = "memory"
|
|
31
|
-
|
|
32
|
-
DDL = """
|
|
33
|
-
CREATE TABLE IF NOT EXISTS rbac_users (
|
|
34
|
-
user_id TEXT PRIMARY KEY,
|
|
35
|
-
username TEXT NOT NULL UNIQUE,
|
|
36
|
-
display_name TEXT DEFAULT '',
|
|
37
|
-
password_hash TEXT NOT NULL,
|
|
38
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
39
|
-
created_at TEXT NOT NULL,
|
|
40
|
-
created_by TEXT DEFAULT 'owner'
|
|
41
|
-
);
|
|
42
|
-
CREATE TABLE IF NOT EXISTS rbac_memberships (
|
|
43
|
-
profile_id TEXT NOT NULL,
|
|
44
|
-
user_id TEXT NOT NULL,
|
|
45
|
-
role TEXT NOT NULL,
|
|
46
|
-
added_at TEXT NOT NULL,
|
|
47
|
-
added_by TEXT DEFAULT 'owner',
|
|
48
|
-
PRIMARY KEY (profile_id, user_id)
|
|
49
|
-
);
|
|
50
|
-
CREATE TABLE IF NOT EXISTS rbac_sessions (
|
|
51
|
-
token_hash TEXT PRIMARY KEY,
|
|
52
|
-
user_id TEXT NOT NULL,
|
|
53
|
-
created_at TEXT NOT NULL,
|
|
54
|
-
expires_at TEXT NOT NULL,
|
|
55
|
-
last_seen TEXT NOT NULL
|
|
56
|
-
);
|
|
57
|
-
CREATE TABLE IF NOT EXISTS rbac_settings (
|
|
58
|
-
key TEXT PRIMARY KEY,
|
|
59
|
-
value TEXT NOT NULL
|
|
60
|
-
);
|
|
61
|
-
CREATE INDEX IF NOT EXISTS idx_rbac_memberships_user
|
|
62
|
-
ON rbac_memberships(user_id);
|
|
63
|
-
CREATE INDEX IF NOT EXISTS idx_rbac_sessions_user
|
|
64
|
-
ON rbac_sessions(user_id);
|
|
65
|
-
CREATE INDEX IF NOT EXISTS idx_rbac_sessions_expiry
|
|
66
|
-
ON rbac_sessions(expires_at);
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _table_exists(conn: sqlite3.Connection, table: str) -> bool:
|
|
71
|
-
return conn.execute(
|
|
72
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,)
|
|
73
|
-
).fetchone() is not None
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
77
|
-
"""Create the RBAC tables. Idempotent (CREATE TABLE IF NOT EXISTS)."""
|
|
78
|
-
conn.executescript(DDL)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
82
|
-
"""Applied once all RBAC tables exist."""
|
|
83
|
-
return all(
|
|
84
|
-
_table_exists(conn, t)
|
|
85
|
-
for t in ("rbac_users", "rbac_memberships", "rbac_sessions",
|
|
86
|
-
"rbac_settings")
|
|
87
|
-
)
|
|
@@ -1,90 +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 — performance indexes
|
|
4
|
-
|
|
5
|
-
"""M025 — hot-path indexes confirmed missing by EXPLAIN QUERY PLAN.
|
|
6
|
-
|
|
7
|
-
* atomic_facts(profile_id, content) — the store_fact dedup check runs on every
|
|
8
|
-
ingest; without this it scans all profile facts for a lifecycle match.
|
|
9
|
-
* mesh_events(created_at) — the 7-day cleanup range-scanned the whole table.
|
|
10
|
-
* mesh_peers(status, last_heartbeat) — stale-peer cleanup full-scanned.
|
|
11
|
-
* mesh_peers(profile_id, last_heartbeat) — list_peers sorted in a temp b-tree.
|
|
12
|
-
|
|
13
|
-
All additive CREATE INDEX IF NOT EXISTS — idempotent, no data change. Deferred
|
|
14
|
-
so the target tables (mesh_* via schema_v343, atomic_facts via engine init)
|
|
15
|
-
exist first.
|
|
16
|
-
|
|
17
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import sqlite3
|
|
23
|
-
|
|
24
|
-
NAME = "M025_perf_indexes"
|
|
25
|
-
DB_TARGET = "memory"
|
|
26
|
-
|
|
27
|
-
DDL = (
|
|
28
|
-
"CREATE INDEX IF NOT EXISTS idx_facts_content_dedup "
|
|
29
|
-
"ON atomic_facts(profile_id, content);"
|
|
30
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_events_created_at ON mesh_events(created_at);"
|
|
31
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_peers_status_heartbeat "
|
|
32
|
-
"ON mesh_peers(status, last_heartbeat);"
|
|
33
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_peers_profile_heartbeat "
|
|
34
|
-
"ON mesh_peers(profile_id, last_heartbeat);"
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def _table_exists(conn: sqlite3.Connection, table: str) -> bool:
|
|
39
|
-
return conn.execute(
|
|
40
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,)
|
|
41
|
-
).fetchone() is not None
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def _cols(conn: sqlite3.Connection, table: str) -> set[str]:
|
|
45
|
-
return {r[1] for r in conn.execute(f"PRAGMA table_info({table})").fetchall()}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
49
|
-
"""Create the perf indexes, each guarded so a non-standard schema cannot
|
|
50
|
-
abort the migration (and leave verify() falsely reporting done)."""
|
|
51
|
-
if _table_exists(conn, "atomic_facts") and {"profile_id", "content"} <= _cols(conn, "atomic_facts"):
|
|
52
|
-
conn.execute(
|
|
53
|
-
"CREATE INDEX IF NOT EXISTS idx_facts_content_dedup "
|
|
54
|
-
"ON atomic_facts(profile_id, content)"
|
|
55
|
-
)
|
|
56
|
-
if _table_exists(conn, "mesh_events") and "created_at" in _cols(conn, "mesh_events"):
|
|
57
|
-
conn.execute(
|
|
58
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_events_created_at "
|
|
59
|
-
"ON mesh_events(created_at)"
|
|
60
|
-
)
|
|
61
|
-
if _table_exists(conn, "mesh_peers"):
|
|
62
|
-
pc = _cols(conn, "mesh_peers")
|
|
63
|
-
if {"status", "last_heartbeat"} <= pc:
|
|
64
|
-
conn.execute(
|
|
65
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_peers_status_heartbeat "
|
|
66
|
-
"ON mesh_peers(status, last_heartbeat)"
|
|
67
|
-
)
|
|
68
|
-
if {"profile_id", "last_heartbeat"} <= pc:
|
|
69
|
-
conn.execute(
|
|
70
|
-
"CREATE INDEX IF NOT EXISTS idx_mesh_peers_profile_heartbeat "
|
|
71
|
-
"ON mesh_peers(profile_id, last_heartbeat)"
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
76
|
-
"""Applied once the two always-creatable indexes exist (mesh_peers/events
|
|
77
|
-
are always present via schema_v343; atomic_facts always via engine init)."""
|
|
78
|
-
names = {
|
|
79
|
-
r[0] for r in conn.execute(
|
|
80
|
-
"SELECT name FROM sqlite_master WHERE type='index'"
|
|
81
|
-
).fetchall()
|
|
82
|
-
}
|
|
83
|
-
required = {"idx_facts_content_dedup", "idx_mesh_events_created_at"}
|
|
84
|
-
# Only require indexes whose tables exist (fresh vs partial installs).
|
|
85
|
-
ok = True
|
|
86
|
-
if _table_exists(conn, "atomic_facts"):
|
|
87
|
-
ok = ok and "idx_facts_content_dedup" in names
|
|
88
|
-
if _table_exists(conn, "mesh_events"):
|
|
89
|
-
ok = ok and "idx_mesh_events_created_at" in names
|
|
90
|
-
return ok
|
|
@@ -1,136 +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 — RBAC hardening (SEC-H-01, audit-02)
|
|
4
|
-
|
|
5
|
-
"""M026 — add FK on rbac_memberships → profiles ON DELETE CASCADE (memory.db).
|
|
6
|
-
|
|
7
|
-
SEC-H-01: ``rbac_memberships`` (created by M024) had no foreign key to
|
|
8
|
-
``profiles``. Deleting a profile therefore left its role grants behind; a
|
|
9
|
-
profile later recreated with the same ``profile_id`` silently re-inherited
|
|
10
|
-
them — a privilege-persistence bug.
|
|
11
|
-
|
|
12
|
-
The runtime path (``delete_profile_from_db``) already purges memberships
|
|
13
|
-
explicitly. This migration is the *defense-in-depth* half: a real FK with
|
|
14
|
-
``ON DELETE CASCADE`` so that ANY path deleting a ``profiles`` row — not just
|
|
15
|
-
that one helper — cannot leave orphaned grants.
|
|
16
|
-
|
|
17
|
-
SQLite cannot add a constraint in place, so the table is rebuilt (the
|
|
18
|
-
recommended safe-alter dance): rename → create canonical table with the FK →
|
|
19
|
-
copy rows → drop old → recreate the user index. Wrapped in BEGIN IMMEDIATE /
|
|
20
|
-
COMMIT for atomicity; the runner connects with ``foreign_keys = OFF`` so the
|
|
21
|
-
rename/copy/drop never trips a constraint action mid-rebuild.
|
|
22
|
-
|
|
23
|
-
Idempotent: skips when the FK is already present (fresh installs still get the
|
|
24
|
-
FK because this always rebuilds M024's FK-less table on first run). Tolerant of
|
|
25
|
-
a missing table (nothing to migrate).
|
|
26
|
-
|
|
27
|
-
Deferred because the FK target ``profiles`` is created at engine init
|
|
28
|
-
(``storage.schema``), after ``apply_all`` runs — same ordering constraint as
|
|
29
|
-
M021 / M023.
|
|
30
|
-
|
|
31
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
from __future__ import annotations
|
|
35
|
-
|
|
36
|
-
import sqlite3
|
|
37
|
-
|
|
38
|
-
NAME = "M026_rbac_memberships_fk"
|
|
39
|
-
DB_TARGET = "memory"
|
|
40
|
-
|
|
41
|
-
# Documentation + drift-hash fingerprint. apply() below is the authoritative
|
|
42
|
-
# executor (a static DDL string cannot express the conditional rebuild).
|
|
43
|
-
DDL = (
|
|
44
|
-
"-- rebuild rbac_memberships with "
|
|
45
|
-
"FOREIGN KEY (profile_id) REFERENCES profiles(profile_id) ON DELETE CASCADE"
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
# Canonical rebuilt table. Column set is byte-identical to M024's, plus the FK.
|
|
49
|
-
# The index is created separately AFTER the old table is dropped: RENAME keeps
|
|
50
|
-
# the old index's name, so an inline/early CREATE INDEX would collide.
|
|
51
|
-
_NEW_TABLE = """
|
|
52
|
-
CREATE TABLE rbac_memberships (
|
|
53
|
-
profile_id TEXT NOT NULL,
|
|
54
|
-
user_id TEXT NOT NULL,
|
|
55
|
-
role TEXT NOT NULL,
|
|
56
|
-
added_at TEXT NOT NULL,
|
|
57
|
-
added_by TEXT DEFAULT 'owner',
|
|
58
|
-
PRIMARY KEY (profile_id, user_id),
|
|
59
|
-
FOREIGN KEY (profile_id) REFERENCES profiles(profile_id) ON DELETE CASCADE
|
|
60
|
-
)
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def _table_exists(conn: sqlite3.Connection, table: str) -> bool:
|
|
65
|
-
return conn.execute(
|
|
66
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,)
|
|
67
|
-
).fetchone() is not None
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _cols(conn: sqlite3.Connection, table: str) -> set[str]:
|
|
71
|
-
return {r[1] for r in conn.execute(f"PRAGMA table_info({table})").fetchall()}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _has_profiles_fk(conn: sqlite3.Connection, table: str) -> bool:
|
|
75
|
-
"""True when ``table`` already declares a foreign key onto ``profiles``."""
|
|
76
|
-
try:
|
|
77
|
-
rows = conn.execute(f"PRAGMA foreign_key_list({table})").fetchall()
|
|
78
|
-
except sqlite3.OperationalError: # pragma: no cover — table absent
|
|
79
|
-
return False
|
|
80
|
-
# PRAGMA foreign_key_list row layout: (id, seq, table, from, to, ...).
|
|
81
|
-
return any(r[2] == "profiles" for r in rows)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
85
|
-
"""Rebuild rbac_memberships with the profiles FK.
|
|
86
|
-
|
|
87
|
-
No-op when the table is absent (nothing to migrate) or the FK already
|
|
88
|
-
exists (idempotent re-run). Existing grants are preserved verbatim.
|
|
89
|
-
"""
|
|
90
|
-
if not _table_exists(conn, "rbac_memberships"):
|
|
91
|
-
return
|
|
92
|
-
if _has_profiles_fk(conn, "rbac_memberships"):
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
has_added_by = "added_by" in _cols(conn, "rbac_memberships")
|
|
96
|
-
|
|
97
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
98
|
-
try:
|
|
99
|
-
conn.execute("ALTER TABLE rbac_memberships RENAME TO _rbac_memberships_old")
|
|
100
|
-
# NB: single statement via execute(), not executescript() — the latter
|
|
101
|
-
# force-commits the pending transaction, breaking our BEGIN/COMMIT.
|
|
102
|
-
conn.execute(_NEW_TABLE)
|
|
103
|
-
if has_added_by:
|
|
104
|
-
conn.execute(
|
|
105
|
-
"INSERT INTO rbac_memberships "
|
|
106
|
-
"(profile_id, user_id, role, added_at, added_by) "
|
|
107
|
-
"SELECT profile_id, user_id, role, added_at, added_by "
|
|
108
|
-
"FROM _rbac_memberships_old"
|
|
109
|
-
)
|
|
110
|
-
else: # exotic/older install missing the column — default it
|
|
111
|
-
conn.execute(
|
|
112
|
-
"INSERT INTO rbac_memberships "
|
|
113
|
-
"(profile_id, user_id, role, added_at) "
|
|
114
|
-
"SELECT profile_id, user_id, role, added_at "
|
|
115
|
-
"FROM _rbac_memberships_old"
|
|
116
|
-
)
|
|
117
|
-
# Dropping the old table also drops its index, freeing the name.
|
|
118
|
-
conn.execute("DROP TABLE _rbac_memberships_old")
|
|
119
|
-
conn.execute(
|
|
120
|
-
"CREATE INDEX IF NOT EXISTS idx_rbac_memberships_user "
|
|
121
|
-
"ON rbac_memberships(user_id)"
|
|
122
|
-
)
|
|
123
|
-
conn.execute("COMMIT")
|
|
124
|
-
except sqlite3.Error:
|
|
125
|
-
try:
|
|
126
|
-
conn.execute("ROLLBACK")
|
|
127
|
-
except sqlite3.Error: # pragma: no cover — best-effort
|
|
128
|
-
pass
|
|
129
|
-
raise
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
133
|
-
"""Applied once rbac_memberships carries the profiles FK (or is absent)."""
|
|
134
|
-
if not _table_exists(conn, "rbac_memberships"):
|
|
135
|
-
return True # nothing to migrate; fresh install rebuilds it on apply
|
|
136
|
-
return _has_profiles_fk(conn, "rbac_memberships")
|
|
@@ -1,163 +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 — isolation correctness (H-01, cycle-3 audit)
|
|
4
|
-
|
|
5
|
-
"""M027 — add profile_id to transferable_patterns + rebuild UNIQUE constraint (learning.db).
|
|
6
|
-
|
|
7
|
-
H-01: ``transferable_patterns`` had no ``profile_id`` column; every profile's
|
|
8
|
-
consolidation wrote to the same (pattern_type, key) row. The last writer won,
|
|
9
|
-
so any profile's ``get_preferences()`` call returned patterns contaminated by
|
|
10
|
-
other profiles' consolidation runs.
|
|
11
|
-
|
|
12
|
-
Fix:
|
|
13
|
-
1. Add ``profile_id TEXT NOT NULL DEFAULT 'default'`` to the table.
|
|
14
|
-
2. Change the UNIQUE constraint from ``(pattern_type, key)`` to
|
|
15
|
-
``(profile_id, pattern_type, key)`` so each profile owns its own rows.
|
|
16
|
-
3. Backfill existing rows to ``profile_id = 'default'`` (the only valid value
|
|
17
|
-
before this migration — they are legacy/unattributed patterns).
|
|
18
|
-
|
|
19
|
-
SQLite cannot ALTER a UNIQUE constraint in place; the table must be rebuilt
|
|
20
|
-
(rename → create canonical form → copy → drop old). Wrapped in
|
|
21
|
-
``BEGIN IMMEDIATE / COMMIT`` for atomicity.
|
|
22
|
-
|
|
23
|
-
Idempotent:
|
|
24
|
-
* If ``profile_id`` already exists with the correct UNIQUE constraint
|
|
25
|
-
(fresh install after the code change), ``apply()`` is a no-op.
|
|
26
|
-
* If the table is absent entirely (CrossProjectAggregator was never run
|
|
27
|
-
against learning.db), ``apply()`` is a no-op — the new _SCHEMA in
|
|
28
|
-
cross_project.py will create it in its canonical form on first use.
|
|
29
|
-
|
|
30
|
-
DB target: ``learning`` — CrossProjectAggregator is under the learning/
|
|
31
|
-
package and is expected to share the learning database.
|
|
32
|
-
|
|
33
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
from __future__ import annotations
|
|
37
|
-
|
|
38
|
-
import sqlite3
|
|
39
|
-
|
|
40
|
-
NAME = "M027_transferable_patterns_profile"
|
|
41
|
-
DB_TARGET = "learning"
|
|
42
|
-
|
|
43
|
-
DDL = (
|
|
44
|
-
"-- rebuild transferable_patterns with "
|
|
45
|
-
"profile_id TEXT NOT NULL DEFAULT 'default' "
|
|
46
|
-
"and UNIQUE(profile_id, pattern_type, key)"
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
_NEW_TABLE = """
|
|
50
|
-
CREATE TABLE transferable_patterns (
|
|
51
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
53
|
-
pattern_type TEXT NOT NULL DEFAULT 'preference',
|
|
54
|
-
key TEXT NOT NULL,
|
|
55
|
-
value TEXT NOT NULL,
|
|
56
|
-
confidence REAL DEFAULT 0.0,
|
|
57
|
-
evidence_count INTEGER DEFAULT 0,
|
|
58
|
-
profiles_seen INTEGER DEFAULT 1,
|
|
59
|
-
decay_factor REAL DEFAULT 1.0,
|
|
60
|
-
contradictions TEXT DEFAULT '[]',
|
|
61
|
-
first_seen TEXT,
|
|
62
|
-
last_seen TEXT,
|
|
63
|
-
UNIQUE(profile_id, pattern_type, key)
|
|
64
|
-
)
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def _table_exists(conn: sqlite3.Connection, table: str) -> bool:
|
|
69
|
-
return conn.execute(
|
|
70
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,)
|
|
71
|
-
).fetchone() is not None
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _cols(conn: sqlite3.Connection, table: str) -> set[str]:
|
|
75
|
-
return {r[1] for r in conn.execute(f"PRAGMA table_info({table})").fetchall()}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def _unique_index_covers_profile(conn: sqlite3.Connection) -> bool:
|
|
79
|
-
"""True when transferable_patterns already has the UNIQUE(profile_id, …) constraint."""
|
|
80
|
-
indexes = conn.execute(
|
|
81
|
-
"SELECT name, sql FROM sqlite_master "
|
|
82
|
-
"WHERE type='index' AND tbl_name='transferable_patterns'"
|
|
83
|
-
).fetchall()
|
|
84
|
-
for idx in indexes:
|
|
85
|
-
sql = (idx[1] or "").lower()
|
|
86
|
-
if "profile_id" in sql and "pattern_type" in sql and "key" in sql:
|
|
87
|
-
return True
|
|
88
|
-
# SQLite stores the UNIQUE constraint on the CREATE TABLE statement as well.
|
|
89
|
-
tbl_sql = conn.execute(
|
|
90
|
-
"SELECT sql FROM sqlite_master "
|
|
91
|
-
"WHERE type='table' AND name='transferable_patterns'"
|
|
92
|
-
).fetchone()
|
|
93
|
-
if tbl_sql:
|
|
94
|
-
sql = (tbl_sql[0] or "").lower()
|
|
95
|
-
if "unique(profile_id" in sql or "unique (profile_id" in sql:
|
|
96
|
-
return True
|
|
97
|
-
return False
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
101
|
-
"""Rebuild transferable_patterns with profile_id column and correct UNIQUE constraint.
|
|
102
|
-
|
|
103
|
-
No-op when the table is absent or already in canonical form.
|
|
104
|
-
Existing data is preserved; legacy rows get profile_id = 'default'.
|
|
105
|
-
"""
|
|
106
|
-
if not _table_exists(conn, "transferable_patterns"):
|
|
107
|
-
return # Table was never created against this DB — fresh install handles it.
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
"profile_id" in _cols(conn, "transferable_patterns")
|
|
111
|
-
and _unique_index_covers_profile(conn)
|
|
112
|
-
):
|
|
113
|
-
return # Already in canonical form.
|
|
114
|
-
|
|
115
|
-
has_profile_col = "profile_id" in _cols(conn, "transferable_patterns")
|
|
116
|
-
|
|
117
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
118
|
-
try:
|
|
119
|
-
conn.execute(
|
|
120
|
-
"ALTER TABLE transferable_patterns RENAME TO _tp_old"
|
|
121
|
-
)
|
|
122
|
-
conn.execute(_NEW_TABLE)
|
|
123
|
-
|
|
124
|
-
if has_profile_col:
|
|
125
|
-
# Column exists but UNIQUE constraint is wrong — copy as-is.
|
|
126
|
-
conn.execute(
|
|
127
|
-
"INSERT INTO transferable_patterns "
|
|
128
|
-
"(profile_id, pattern_type, key, value, confidence, evidence_count, "
|
|
129
|
-
" profiles_seen, decay_factor, contradictions, first_seen, last_seen) "
|
|
130
|
-
"SELECT profile_id, pattern_type, key, value, confidence, evidence_count, "
|
|
131
|
-
" profiles_seen, decay_factor, contradictions, first_seen, last_seen "
|
|
132
|
-
"FROM _tp_old"
|
|
133
|
-
)
|
|
134
|
-
else:
|
|
135
|
-
# No profile_id yet — backfill legacy rows to 'default'.
|
|
136
|
-
conn.execute(
|
|
137
|
-
"INSERT INTO transferable_patterns "
|
|
138
|
-
"(profile_id, pattern_type, key, value, confidence, evidence_count, "
|
|
139
|
-
" profiles_seen, decay_factor, contradictions, first_seen, last_seen) "
|
|
140
|
-
"SELECT 'default', pattern_type, key, value, confidence, evidence_count, "
|
|
141
|
-
" profiles_seen, decay_factor, contradictions, first_seen, last_seen "
|
|
142
|
-
"FROM _tp_old"
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
conn.execute("DROP TABLE _tp_old")
|
|
146
|
-
conn.execute("COMMIT")
|
|
147
|
-
except sqlite3.Error:
|
|
148
|
-
try:
|
|
149
|
-
conn.execute("ROLLBACK")
|
|
150
|
-
except sqlite3.Error:
|
|
151
|
-
pass
|
|
152
|
-
raise
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
156
|
-
"""True when transferable_patterns has profile_id with the correct UNIQUE,
|
|
157
|
-
or when the table is absent (fresh install will create it correctly).
|
|
158
|
-
"""
|
|
159
|
-
if not _table_exists(conn, "transferable_patterns"):
|
|
160
|
-
return True # absent — first run of _ensure_schema creates canonical form
|
|
161
|
-
if "profile_id" not in _cols(conn, "transferable_patterns"):
|
|
162
|
-
return False
|
|
163
|
-
return _unique_index_covers_profile(conn)
|