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,1108 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3 — Database Schema.
|
|
6
|
-
|
|
7
|
-
SQL DDL for the entire memory system. Zero dead tables: every table
|
|
8
|
-
has both a writer and a reader. Profile-scoped by design.
|
|
9
|
-
|
|
10
|
-
Design principles:
|
|
11
|
-
- 17 tables, each justified by a write path AND a read path
|
|
12
|
-
- profile_id on every row — instant profile switching
|
|
13
|
-
- FTS5 virtual table on atomic_facts for full-text search
|
|
14
|
-
- Foreign keys with CASCADE deletes — no orphans
|
|
15
|
-
- WAL journal mode for concurrent reads
|
|
16
|
-
- Indexes on all hot query paths (entity lookup, temporal range,
|
|
17
|
-
fact_type filter, profile scoping)
|
|
18
|
-
|
|
19
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
from __future__ import annotations
|
|
23
|
-
|
|
24
|
-
import logging
|
|
25
|
-
import sqlite3
|
|
26
|
-
from typing import Final
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger(__name__)
|
|
29
|
-
|
|
30
|
-
# ---------------------------------------------------------------------------
|
|
31
|
-
# Constants
|
|
32
|
-
# ---------------------------------------------------------------------------
|
|
33
|
-
|
|
34
|
-
SCHEMA_VERSION: Final[int] = 1
|
|
35
|
-
|
|
36
|
-
# All table names in creation order (respects FK dependencies).
|
|
37
|
-
# FTS5 virtual tables listed separately — they cannot have FKs.
|
|
38
|
-
_TABLES: Final[tuple[str, ...]] = (
|
|
39
|
-
"schema_version",
|
|
40
|
-
"profiles",
|
|
41
|
-
"memories",
|
|
42
|
-
"atomic_facts",
|
|
43
|
-
"canonical_entities",
|
|
44
|
-
"fact_entity_associations",
|
|
45
|
-
"fact_entity_association_repair_state",
|
|
46
|
-
"entity_aliases",
|
|
47
|
-
"entity_profiles",
|
|
48
|
-
"memory_scenes",
|
|
49
|
-
"scene_fact_members",
|
|
50
|
-
"temporal_events",
|
|
51
|
-
"graph_edges",
|
|
52
|
-
"consolidation_log",
|
|
53
|
-
"trust_scores",
|
|
54
|
-
"provenance",
|
|
55
|
-
"feedback_records",
|
|
56
|
-
"behavioral_patterns",
|
|
57
|
-
"action_outcomes",
|
|
58
|
-
"compliance_audit",
|
|
59
|
-
"bm25_tokens",
|
|
60
|
-
"config",
|
|
61
|
-
"entity_communities",
|
|
62
|
-
"community_summaries",
|
|
63
|
-
"consolidated_summaries",
|
|
64
|
-
"persona_summary",
|
|
65
|
-
"projection_outbox",
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
_FTS_TABLES: Final[tuple[str, ...]] = (
|
|
69
|
-
"atomic_facts_fts",
|
|
70
|
-
"fact_expansion_fts",
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
# ---------------------------------------------------------------------------
|
|
75
|
-
# Pragmas
|
|
76
|
-
# ---------------------------------------------------------------------------
|
|
77
|
-
|
|
78
|
-
def _set_pragmas(conn: sqlite3.Connection) -> None:
|
|
79
|
-
"""Set SQLite pragmas for performance and integrity."""
|
|
80
|
-
conn.execute("PRAGMA journal_mode = WAL")
|
|
81
|
-
conn.execute("PRAGMA foreign_keys = ON")
|
|
82
|
-
conn.execute("PRAGMA busy_timeout = 5000")
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# ---------------------------------------------------------------------------
|
|
86
|
-
# Schema version (must be first — no FK dependencies)
|
|
87
|
-
# ---------------------------------------------------------------------------
|
|
88
|
-
|
|
89
|
-
_SQL_SCHEMA_VERSION: Final[str] = """
|
|
90
|
-
CREATE TABLE IF NOT EXISTS schema_version (
|
|
91
|
-
version INTEGER NOT NULL,
|
|
92
|
-
applied_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
93
|
-
description TEXT NOT NULL DEFAULT ''
|
|
94
|
-
);
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
# ---------------------------------------------------------------------------
|
|
99
|
-
# Profiles
|
|
100
|
-
# ---------------------------------------------------------------------------
|
|
101
|
-
|
|
102
|
-
_SQL_PROFILES: Final[str] = """
|
|
103
|
-
CREATE TABLE IF NOT EXISTS profiles (
|
|
104
|
-
profile_id TEXT PRIMARY KEY,
|
|
105
|
-
name TEXT NOT NULL,
|
|
106
|
-
description TEXT NOT NULL DEFAULT '',
|
|
107
|
-
personality TEXT NOT NULL DEFAULT '',
|
|
108
|
-
mode TEXT NOT NULL DEFAULT 'a'
|
|
109
|
-
CHECK (mode IN ('a', 'b', 'c')),
|
|
110
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
111
|
-
last_used TEXT,
|
|
112
|
-
config_json TEXT NOT NULL DEFAULT '{}'
|
|
113
|
-
);
|
|
114
|
-
"""
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
# ---------------------------------------------------------------------------
|
|
118
|
-
# Memories (raw conversation turns)
|
|
119
|
-
# ---------------------------------------------------------------------------
|
|
120
|
-
|
|
121
|
-
_SQL_MEMORIES: Final[str] = """
|
|
122
|
-
CREATE TABLE IF NOT EXISTS memories (
|
|
123
|
-
memory_id TEXT PRIMARY KEY,
|
|
124
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
125
|
-
scope TEXT NOT NULL DEFAULT 'personal',
|
|
126
|
-
shared_with TEXT,
|
|
127
|
-
content TEXT NOT NULL,
|
|
128
|
-
session_id TEXT NOT NULL DEFAULT '',
|
|
129
|
-
speaker TEXT NOT NULL DEFAULT '',
|
|
130
|
-
role TEXT NOT NULL DEFAULT '',
|
|
131
|
-
session_date TEXT,
|
|
132
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
133
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
134
|
-
|
|
135
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
136
|
-
ON DELETE CASCADE
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
CREATE INDEX IF NOT EXISTS idx_memories_profile
|
|
140
|
-
ON memories (profile_id);
|
|
141
|
-
CREATE INDEX IF NOT EXISTS idx_memories_session
|
|
142
|
-
ON memories (profile_id, session_id);
|
|
143
|
-
CREATE INDEX IF NOT EXISTS idx_memories_created
|
|
144
|
-
ON memories (created_at);"""
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
# ---------------------------------------------------------------------------
|
|
148
|
-
# Atomic facts — THE primary retrieval unit
|
|
149
|
-
# ---------------------------------------------------------------------------
|
|
150
|
-
|
|
151
|
-
_SQL_ATOMIC_FACTS: Final[str] = """
|
|
152
|
-
CREATE TABLE IF NOT EXISTS atomic_facts (
|
|
153
|
-
fact_id TEXT PRIMARY KEY,
|
|
154
|
-
memory_id TEXT NOT NULL,
|
|
155
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
156
|
-
scope TEXT NOT NULL DEFAULT 'personal',
|
|
157
|
-
shared_with TEXT,
|
|
158
|
-
content TEXT NOT NULL,
|
|
159
|
-
fact_type TEXT NOT NULL DEFAULT 'semantic'
|
|
160
|
-
CHECK (fact_type IN (
|
|
161
|
-
'episodic', 'semantic', 'opinion', 'prospective'
|
|
162
|
-
)),
|
|
163
|
-
|
|
164
|
-
-- Entities (JSON arrays)
|
|
165
|
-
entities_json TEXT NOT NULL DEFAULT '[]',
|
|
166
|
-
canonical_entities_json TEXT NOT NULL DEFAULT '[]',
|
|
167
|
-
|
|
168
|
-
-- Temporal (3-date model)
|
|
169
|
-
observation_date TEXT,
|
|
170
|
-
referenced_date TEXT,
|
|
171
|
-
interval_start TEXT,
|
|
172
|
-
interval_end TEXT,
|
|
173
|
-
|
|
174
|
-
-- Quality scores
|
|
175
|
-
confidence REAL NOT NULL DEFAULT 1.0,
|
|
176
|
-
importance REAL NOT NULL DEFAULT 0.5,
|
|
177
|
-
evidence_count INTEGER NOT NULL DEFAULT 1,
|
|
178
|
-
access_count INTEGER NOT NULL DEFAULT 0,
|
|
179
|
-
-- Core-memory injection priority (M015 on upgraded databases)
|
|
180
|
-
pinned INTEGER NOT NULL DEFAULT 0,
|
|
181
|
-
|
|
182
|
-
-- Source tracing
|
|
183
|
-
source_turn_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
184
|
-
session_id TEXT NOT NULL DEFAULT '',
|
|
185
|
-
|
|
186
|
-
-- Embeddings (JSON arrays — TEXT for simplicity and portability)
|
|
187
|
-
embedding TEXT,
|
|
188
|
-
fisher_mean TEXT,
|
|
189
|
-
fisher_variance TEXT,
|
|
190
|
-
-- Tracks how many accesses had Fisher applied; delta-based update in maintenance
|
|
191
|
-
fisher_last_applied_access INTEGER NOT NULL DEFAULT 0,
|
|
192
|
-
|
|
193
|
-
-- Lifecycle
|
|
194
|
-
lifecycle TEXT NOT NULL DEFAULT 'active'
|
|
195
|
-
CHECK (lifecycle IN (
|
|
196
|
-
'active', 'warm', 'cold', 'archived'
|
|
197
|
-
)),
|
|
198
|
-
-- Withheld from retrieval without being destroyed. Set by repair, never
|
|
199
|
-
-- by a normal write; enforced in exactly one place,
|
|
200
|
-
-- DatabaseManager.get_facts_by_ids, which every channel's candidates are
|
|
201
|
-
-- re-authorised through and which the engine hydrates from.
|
|
202
|
-
quarantined INTEGER NOT NULL DEFAULT 0,
|
|
203
|
-
langevin_position TEXT,
|
|
204
|
-
|
|
205
|
-
-- Emotional
|
|
206
|
-
emotional_valence REAL NOT NULL DEFAULT 0.0,
|
|
207
|
-
emotional_arousal REAL NOT NULL DEFAULT 0.0,
|
|
208
|
-
|
|
209
|
-
-- Signal type (V2 compatible)
|
|
210
|
-
signal_type TEXT NOT NULL DEFAULT 'factual',
|
|
211
|
-
|
|
212
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
213
|
-
|
|
214
|
-
FOREIGN KEY (memory_id) REFERENCES memories (memory_id)
|
|
215
|
-
ON DELETE CASCADE,
|
|
216
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
217
|
-
ON DELETE CASCADE
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
CREATE INDEX IF NOT EXISTS idx_facts_profile
|
|
221
|
-
ON atomic_facts (profile_id);
|
|
222
|
-
CREATE INDEX IF NOT EXISTS idx_facts_memory
|
|
223
|
-
ON atomic_facts (memory_id);
|
|
224
|
-
CREATE INDEX IF NOT EXISTS idx_facts_type
|
|
225
|
-
ON atomic_facts (profile_id, fact_type);
|
|
226
|
-
CREATE INDEX IF NOT EXISTS idx_facts_lifecycle
|
|
227
|
-
ON atomic_facts (profile_id, lifecycle);
|
|
228
|
-
CREATE INDEX IF NOT EXISTS idx_facts_pinned
|
|
229
|
-
ON atomic_facts (profile_id, pinned);
|
|
230
|
-
CREATE INDEX IF NOT EXISTS idx_facts_session
|
|
231
|
-
ON atomic_facts (profile_id, session_id);
|
|
232
|
-
CREATE INDEX IF NOT EXISTS idx_facts_referenced_date
|
|
233
|
-
ON atomic_facts (profile_id, referenced_date)
|
|
234
|
-
WHERE referenced_date IS NOT NULL;
|
|
235
|
-
CREATE INDEX IF NOT EXISTS idx_facts_interval
|
|
236
|
-
ON atomic_facts (profile_id, interval_start, interval_end)
|
|
237
|
-
WHERE interval_start IS NOT NULL;"""
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
# ---------------------------------------------------------------------------
|
|
241
|
-
# FTS5 virtual table on atomic_facts for full-text search
|
|
242
|
-
# ---------------------------------------------------------------------------
|
|
243
|
-
|
|
244
|
-
_SQL_V2_MIGRATION_CLEANUP: Final[str] = """
|
|
245
|
-
-- Clean up stale V2 triggers that fire on active tables but reference
|
|
246
|
-
-- renamed backup FTS tables. The V2→V3 migration renames tables via
|
|
247
|
-
-- ALTER TABLE RENAME, which auto-updates trigger bodies to reference
|
|
248
|
-
-- _v2_bak_* tables but leaves FTS5 delete-command column names stale.
|
|
249
|
-
-- This causes: "table _v2_bak_*_fts has no column named *_fts"
|
|
250
|
-
|
|
251
|
-
-- Drop V2-era triggers on memories table (memories_ai/ad/au)
|
|
252
|
-
DROP TRIGGER IF EXISTS memories_ai;
|
|
253
|
-
DROP TRIGGER IF EXISTS memories_ad;
|
|
254
|
-
DROP TRIGGER IF EXISTS memories_au;
|
|
255
|
-
|
|
256
|
-
-- Drop stale V3 triggers (may have been corrupted by V2 rename)
|
|
257
|
-
DROP TRIGGER IF EXISTS atomic_facts_fts_insert;
|
|
258
|
-
DROP TRIGGER IF EXISTS atomic_facts_fts_delete;
|
|
259
|
-
DROP TRIGGER IF EXISTS atomic_facts_fts_update;
|
|
260
|
-
|
|
261
|
-
-- Drop renamed V2 backup FTS virtual tables (and their shadow tables)
|
|
262
|
-
DROP TABLE IF EXISTS "_v2_bak_atomic_facts_fts";
|
|
263
|
-
DROP TABLE IF EXISTS "_v2_bak_memories_fts";
|
|
264
|
-
"""
|
|
265
|
-
|
|
266
|
-
_SQL_ATOMIC_FACTS_FTS: Final[str] = """
|
|
267
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS atomic_facts_fts
|
|
268
|
-
USING fts5(
|
|
269
|
-
fact_id UNINDEXED,
|
|
270
|
-
content,
|
|
271
|
-
content='atomic_facts',
|
|
272
|
-
content_rowid='rowid'
|
|
273
|
-
);
|
|
274
|
-
|
|
275
|
-
-- Triggers to keep FTS in sync with atomic_facts.
|
|
276
|
-
-- Always DROP+CREATE (not IF NOT EXISTS) to replace any stale triggers
|
|
277
|
-
-- left by V2 migration.
|
|
278
|
-
|
|
279
|
-
-- INSERT trigger
|
|
280
|
-
CREATE TRIGGER IF NOT EXISTS atomic_facts_fts_insert
|
|
281
|
-
AFTER INSERT ON atomic_facts
|
|
282
|
-
BEGIN
|
|
283
|
-
INSERT INTO atomic_facts_fts (rowid, fact_id, content)
|
|
284
|
-
VALUES (NEW.rowid, NEW.fact_id, NEW.content);
|
|
285
|
-
END;
|
|
286
|
-
|
|
287
|
-
-- DELETE trigger
|
|
288
|
-
CREATE TRIGGER IF NOT EXISTS atomic_facts_fts_delete
|
|
289
|
-
AFTER DELETE ON atomic_facts
|
|
290
|
-
BEGIN
|
|
291
|
-
INSERT INTO atomic_facts_fts (atomic_facts_fts, rowid, fact_id, content)
|
|
292
|
-
VALUES ('delete', OLD.rowid, OLD.fact_id, OLD.content);
|
|
293
|
-
END;
|
|
294
|
-
|
|
295
|
-
-- UPDATE trigger
|
|
296
|
-
CREATE TRIGGER IF NOT EXISTS atomic_facts_fts_update
|
|
297
|
-
AFTER UPDATE OF content ON atomic_facts
|
|
298
|
-
BEGIN
|
|
299
|
-
INSERT INTO atomic_facts_fts (atomic_facts_fts, rowid, fact_id, content)
|
|
300
|
-
VALUES ('delete', OLD.rowid, OLD.fact_id, OLD.content);
|
|
301
|
-
INSERT INTO atomic_facts_fts (rowid, fact_id, content)
|
|
302
|
-
VALUES (NEW.rowid, NEW.fact_id, NEW.content);
|
|
303
|
-
END;
|
|
304
|
-
"""
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
# ---------------------------------------------------------------------------
|
|
308
|
-
# Fact expansion FTS (Phase 4, T3b — fact-augmented key expansion)
|
|
309
|
-
# ---------------------------------------------------------------------------
|
|
310
|
-
# Standalone (NOT external-content) FTS5 holding per-fact alternate keys
|
|
311
|
-
# (entity aliases + paraphrases). Kept separate from atomic_facts_fts so the
|
|
312
|
-
# proven content index and its triggers are never touched. Populated by
|
|
313
|
-
# core.key_expander on store (and backfilled), queried as an additive UNION in
|
|
314
|
-
# the BM25 channel. fact_id is stored so results can be scope-JOINed to
|
|
315
|
-
# atomic_facts.
|
|
316
|
-
_SQL_FACT_EXPANSION_FTS: Final[str] = """
|
|
317
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS fact_expansion_fts
|
|
318
|
-
USING fts5(
|
|
319
|
-
fact_id UNINDEXED,
|
|
320
|
-
alt_keys
|
|
321
|
-
);
|
|
322
|
-
"""
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
# ---------------------------------------------------------------------------
|
|
326
|
-
# Canonical entities
|
|
327
|
-
# ---------------------------------------------------------------------------
|
|
328
|
-
|
|
329
|
-
_SQL_CANONICAL_ENTITIES: Final[str] = """
|
|
330
|
-
CREATE TABLE IF NOT EXISTS canonical_entities (
|
|
331
|
-
entity_id TEXT PRIMARY KEY,
|
|
332
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
333
|
-
scope TEXT NOT NULL DEFAULT 'personal',
|
|
334
|
-
shared_with TEXT,
|
|
335
|
-
canonical_name TEXT NOT NULL,
|
|
336
|
-
entity_type TEXT NOT NULL DEFAULT '',
|
|
337
|
-
first_seen TEXT NOT NULL DEFAULT (datetime('now')),
|
|
338
|
-
last_seen TEXT NOT NULL DEFAULT (datetime('now')),
|
|
339
|
-
fact_count INTEGER NOT NULL DEFAULT 0,
|
|
340
|
-
|
|
341
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
342
|
-
ON DELETE CASCADE
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
CREATE INDEX IF NOT EXISTS idx_entities_profile
|
|
346
|
-
ON canonical_entities (profile_id);
|
|
347
|
-
CREATE INDEX IF NOT EXISTS idx_entities_name_lower
|
|
348
|
-
ON canonical_entities (profile_id, canonical_name COLLATE NOCASE);
|
|
349
|
-
CREATE INDEX IF NOT EXISTS idx_entities_type
|
|
350
|
-
ON canonical_entities (profile_id, entity_type);
|
|
351
|
-
CREATE INDEX IF NOT EXISTS idx_entities_profile_fact_count
|
|
352
|
-
ON canonical_entities (profile_id, fact_count DESC);
|
|
353
|
-
CREATE INDEX IF NOT EXISTS idx_entities_profile_type_fact_count
|
|
354
|
-
ON canonical_entities (
|
|
355
|
-
profile_id, entity_type COLLATE NOCASE, fact_count DESC
|
|
356
|
-
);"""
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
# ---------------------------------------------------------------------------
|
|
360
|
-
# Normalized fact/entity associations (also the ingestion effect ledger)
|
|
361
|
-
# ---------------------------------------------------------------------------
|
|
362
|
-
|
|
363
|
-
_SQL_FACT_ENTITY_ASSOCIATIONS: Final[str] = """
|
|
364
|
-
CREATE TABLE IF NOT EXISTS fact_entity_associations (
|
|
365
|
-
profile_id TEXT NOT NULL,
|
|
366
|
-
fact_id TEXT NOT NULL,
|
|
367
|
-
entity_id TEXT NOT NULL,
|
|
368
|
-
first_operation_id TEXT NOT NULL DEFAULT '',
|
|
369
|
-
count_applied INTEGER NOT NULL DEFAULT 0
|
|
370
|
-
CHECK (count_applied IN (0, 1)),
|
|
371
|
-
created_at TEXT NOT NULL DEFAULT (
|
|
372
|
-
strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
373
|
-
),
|
|
374
|
-
PRIMARY KEY (profile_id, fact_id, entity_id),
|
|
375
|
-
FOREIGN KEY (fact_id) REFERENCES atomic_facts(fact_id) ON DELETE CASCADE,
|
|
376
|
-
FOREIGN KEY (entity_id)
|
|
377
|
-
REFERENCES canonical_entities(entity_id) ON DELETE CASCADE
|
|
378
|
-
);
|
|
379
|
-
CREATE INDEX IF NOT EXISTS idx_fact_entity_associations_entity
|
|
380
|
-
ON fact_entity_associations(profile_id, entity_id, fact_id);
|
|
381
|
-
CREATE TABLE IF NOT EXISTS fact_entity_association_repair_state (
|
|
382
|
-
repair_key TEXT PRIMARY KEY,
|
|
383
|
-
state TEXT NOT NULL DEFAULT 'pending'
|
|
384
|
-
CHECK (state IN ('pending', 'running', 'retrying', 'complete')),
|
|
385
|
-
target_fact_rowid INTEGER NOT NULL DEFAULT -1,
|
|
386
|
-
last_fact_rowid INTEGER NOT NULL DEFAULT 0,
|
|
387
|
-
scanned INTEGER NOT NULL DEFAULT 0,
|
|
388
|
-
inserted INTEGER NOT NULL DEFAULT 0,
|
|
389
|
-
last_error TEXT NOT NULL DEFAULT '',
|
|
390
|
-
updated_at TEXT NOT NULL
|
|
391
|
-
);
|
|
392
|
-
INSERT OR IGNORE INTO fact_entity_association_repair_state
|
|
393
|
-
(repair_key, state, target_fact_rowid, updated_at)
|
|
394
|
-
VALUES ('historical-backfill', 'pending', -1, '');
|
|
395
|
-
"""
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
# ---------------------------------------------------------------------------
|
|
399
|
-
# Entity aliases
|
|
400
|
-
# ---------------------------------------------------------------------------
|
|
401
|
-
|
|
402
|
-
_SQL_ENTITY_ALIASES: Final[str] = """
|
|
403
|
-
CREATE TABLE IF NOT EXISTS entity_aliases (
|
|
404
|
-
alias_id TEXT PRIMARY KEY,
|
|
405
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
406
|
-
entity_id TEXT NOT NULL,
|
|
407
|
-
alias TEXT NOT NULL,
|
|
408
|
-
confidence REAL NOT NULL DEFAULT 1.0,
|
|
409
|
-
source TEXT NOT NULL DEFAULT '',
|
|
410
|
-
|
|
411
|
-
FOREIGN KEY (entity_id) REFERENCES canonical_entities (entity_id)
|
|
412
|
-
ON DELETE CASCADE
|
|
413
|
-
);
|
|
414
|
-
|
|
415
|
-
CREATE INDEX IF NOT EXISTS idx_aliases_entity
|
|
416
|
-
ON entity_aliases (entity_id);
|
|
417
|
-
CREATE INDEX IF NOT EXISTS idx_aliases_lookup
|
|
418
|
-
ON entity_aliases (alias COLLATE NOCASE);
|
|
419
|
-
-- NOTE: the (profile_id, entity_id) index is created by migration M022, NOT
|
|
420
|
-
-- here. On an upgrading DB this DDL runs at engine init BEFORE the deferred
|
|
421
|
-
-- M022 adds the profile_id column, so referencing it here would fail engine
|
|
422
|
-
-- init with "no such column: profile_id".
|
|
423
|
-
"""
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
# ---------------------------------------------------------------------------
|
|
427
|
-
# Entity profiles (accumulated knowledge per entity)
|
|
428
|
-
# ---------------------------------------------------------------------------
|
|
429
|
-
|
|
430
|
-
_SQL_ENTITY_PROFILES: Final[str] = """
|
|
431
|
-
CREATE TABLE IF NOT EXISTS entity_profiles (
|
|
432
|
-
profile_entry_id TEXT PRIMARY KEY,
|
|
433
|
-
entity_id TEXT NOT NULL,
|
|
434
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
435
|
-
knowledge_summary TEXT NOT NULL DEFAULT '',
|
|
436
|
-
fact_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
437
|
-
last_updated TEXT NOT NULL DEFAULT (datetime('now')),
|
|
438
|
-
|
|
439
|
-
FOREIGN KEY (entity_id) REFERENCES canonical_entities (entity_id)
|
|
440
|
-
ON DELETE CASCADE,
|
|
441
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
442
|
-
ON DELETE CASCADE
|
|
443
|
-
);
|
|
444
|
-
|
|
445
|
-
CREATE INDEX IF NOT EXISTS idx_eprofiles_entity
|
|
446
|
-
ON entity_profiles (entity_id);
|
|
447
|
-
CREATE INDEX IF NOT EXISTS idx_eprofiles_profile
|
|
448
|
-
ON entity_profiles (profile_id);
|
|
449
|
-
"""
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
# ---------------------------------------------------------------------------
|
|
453
|
-
# Memory scenes (clustered groups of related facts)
|
|
454
|
-
# ---------------------------------------------------------------------------
|
|
455
|
-
|
|
456
|
-
_SQL_MEMORY_SCENES: Final[str] = """
|
|
457
|
-
CREATE TABLE IF NOT EXISTS memory_scenes (
|
|
458
|
-
scene_id TEXT PRIMARY KEY,
|
|
459
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
460
|
-
theme TEXT NOT NULL DEFAULT '',
|
|
461
|
-
fact_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
462
|
-
entity_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
463
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
464
|
-
last_updated TEXT NOT NULL DEFAULT (datetime('now')),
|
|
465
|
-
|
|
466
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
467
|
-
ON DELETE CASCADE
|
|
468
|
-
);
|
|
469
|
-
|
|
470
|
-
CREATE INDEX IF NOT EXISTS idx_scenes_profile
|
|
471
|
-
ON memory_scenes (profile_id);
|
|
472
|
-
CREATE UNIQUE INDEX IF NOT EXISTS uq_scenes_profile_scene
|
|
473
|
-
ON memory_scenes (profile_id, scene_id);
|
|
474
|
-
CREATE UNIQUE INDEX IF NOT EXISTS uq_facts_profile_fact
|
|
475
|
-
ON atomic_facts (profile_id, fact_id);
|
|
476
|
-
"""
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
# ---------------------------------------------------------------------------
|
|
480
|
-
# Normalized scene/fact membership projection (bounded scene assignment)
|
|
481
|
-
# ---------------------------------------------------------------------------
|
|
482
|
-
|
|
483
|
-
_SQL_SCENE_FACT_MEMBERS: Final[str] = """
|
|
484
|
-
CREATE TABLE IF NOT EXISTS scene_fact_members (
|
|
485
|
-
profile_id TEXT NOT NULL,
|
|
486
|
-
scene_id TEXT NOT NULL,
|
|
487
|
-
fact_id TEXT NOT NULL,
|
|
488
|
-
position INTEGER NOT NULL DEFAULT 0,
|
|
489
|
-
PRIMARY KEY (scene_id, fact_id),
|
|
490
|
-
FOREIGN KEY (profile_id, scene_id)
|
|
491
|
-
REFERENCES memory_scenes(profile_id, scene_id) ON DELETE CASCADE,
|
|
492
|
-
FOREIGN KEY (profile_id, fact_id)
|
|
493
|
-
REFERENCES atomic_facts(profile_id, fact_id) ON DELETE CASCADE,
|
|
494
|
-
FOREIGN KEY (profile_id) REFERENCES profiles(profile_id) ON DELETE CASCADE
|
|
495
|
-
);
|
|
496
|
-
|
|
497
|
-
CREATE INDEX IF NOT EXISTS idx_scene_fact_members_lookup
|
|
498
|
-
ON scene_fact_members (profile_id, fact_id, scene_id);
|
|
499
|
-
CREATE INDEX IF NOT EXISTS idx_scene_fact_members_order
|
|
500
|
-
ON scene_fact_members (scene_id, position);
|
|
501
|
-
|
|
502
|
-
CREATE TRIGGER IF NOT EXISTS trg_scene_fact_members_insert
|
|
503
|
-
AFTER INSERT ON memory_scenes
|
|
504
|
-
BEGIN
|
|
505
|
-
DELETE FROM scene_fact_members WHERE scene_id = NEW.scene_id;
|
|
506
|
-
INSERT OR IGNORE INTO scene_fact_members
|
|
507
|
-
(profile_id, scene_id, fact_id, position)
|
|
508
|
-
SELECT NEW.profile_id, NEW.scene_id, af.fact_id, CAST(member.key AS INTEGER)
|
|
509
|
-
FROM json_each(
|
|
510
|
-
CASE WHEN json_valid(NEW.fact_ids_json)
|
|
511
|
-
THEN NEW.fact_ids_json ELSE '[]' END
|
|
512
|
-
) AS member
|
|
513
|
-
JOIN atomic_facts AS af
|
|
514
|
-
ON af.fact_id = member.value
|
|
515
|
-
AND af.profile_id = NEW.profile_id;
|
|
516
|
-
END;
|
|
517
|
-
|
|
518
|
-
CREATE TRIGGER IF NOT EXISTS trg_scene_fact_members_update
|
|
519
|
-
AFTER UPDATE OF profile_id, fact_ids_json ON memory_scenes
|
|
520
|
-
BEGIN
|
|
521
|
-
DELETE FROM scene_fact_members WHERE scene_id = NEW.scene_id;
|
|
522
|
-
INSERT OR IGNORE INTO scene_fact_members
|
|
523
|
-
(profile_id, scene_id, fact_id, position)
|
|
524
|
-
SELECT NEW.profile_id, NEW.scene_id, af.fact_id, CAST(member.key AS INTEGER)
|
|
525
|
-
FROM json_each(
|
|
526
|
-
CASE WHEN json_valid(NEW.fact_ids_json)
|
|
527
|
-
THEN NEW.fact_ids_json ELSE '[]' END
|
|
528
|
-
) AS member
|
|
529
|
-
JOIN atomic_facts AS af
|
|
530
|
-
ON af.fact_id = member.value
|
|
531
|
-
AND af.profile_id = NEW.profile_id;
|
|
532
|
-
END;
|
|
533
|
-
"""
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
# ---------------------------------------------------------------------------
|
|
537
|
-
# Temporal events (per-entity timeline entries)
|
|
538
|
-
# ---------------------------------------------------------------------------
|
|
539
|
-
|
|
540
|
-
_SQL_TEMPORAL_EVENTS: Final[str] = """
|
|
541
|
-
CREATE TABLE IF NOT EXISTS temporal_events (
|
|
542
|
-
event_id TEXT PRIMARY KEY,
|
|
543
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
544
|
-
scope TEXT NOT NULL DEFAULT 'personal',
|
|
545
|
-
shared_with TEXT,
|
|
546
|
-
entity_id TEXT NOT NULL,
|
|
547
|
-
fact_id TEXT NOT NULL,
|
|
548
|
-
observation_date TEXT,
|
|
549
|
-
referenced_date TEXT,
|
|
550
|
-
interval_start TEXT,
|
|
551
|
-
interval_end TEXT,
|
|
552
|
-
description TEXT NOT NULL DEFAULT '',
|
|
553
|
-
|
|
554
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
555
|
-
ON DELETE CASCADE,
|
|
556
|
-
FOREIGN KEY (entity_id) REFERENCES canonical_entities (entity_id)
|
|
557
|
-
ON DELETE CASCADE,
|
|
558
|
-
FOREIGN KEY (fact_id) REFERENCES atomic_facts (fact_id)
|
|
559
|
-
ON DELETE CASCADE
|
|
560
|
-
);
|
|
561
|
-
|
|
562
|
-
CREATE INDEX IF NOT EXISTS idx_tevents_profile
|
|
563
|
-
ON temporal_events (profile_id);
|
|
564
|
-
CREATE INDEX IF NOT EXISTS idx_tevents_entity
|
|
565
|
-
ON temporal_events (profile_id, entity_id);
|
|
566
|
-
CREATE INDEX IF NOT EXISTS idx_tevents_date_range
|
|
567
|
-
ON temporal_events (profile_id, referenced_date)
|
|
568
|
-
WHERE referenced_date IS NOT NULL;"""
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
# ---------------------------------------------------------------------------
|
|
572
|
-
# Graph edges (knowledge graph between facts/entities)
|
|
573
|
-
# ---------------------------------------------------------------------------
|
|
574
|
-
|
|
575
|
-
_SQL_GRAPH_EDGES: Final[str] = """
|
|
576
|
-
CREATE TABLE IF NOT EXISTS graph_edges (
|
|
577
|
-
edge_id TEXT PRIMARY KEY,
|
|
578
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
579
|
-
scope TEXT NOT NULL DEFAULT 'personal',
|
|
580
|
-
shared_with TEXT,
|
|
581
|
-
source_id TEXT NOT NULL,
|
|
582
|
-
target_id TEXT NOT NULL,
|
|
583
|
-
edge_type TEXT NOT NULL DEFAULT 'entity'
|
|
584
|
-
CHECK (edge_type IN (
|
|
585
|
-
'entity', 'temporal', 'semantic',
|
|
586
|
-
'causal', 'contradiction', 'supersedes'
|
|
587
|
-
)),
|
|
588
|
-
weight REAL NOT NULL DEFAULT 1.0,
|
|
589
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
590
|
-
|
|
591
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
592
|
-
ON DELETE CASCADE
|
|
593
|
-
);
|
|
594
|
-
|
|
595
|
-
CREATE INDEX IF NOT EXISTS idx_edges_profile
|
|
596
|
-
ON graph_edges (profile_id);
|
|
597
|
-
CREATE INDEX IF NOT EXISTS idx_edges_source
|
|
598
|
-
ON graph_edges (profile_id, source_id);
|
|
599
|
-
CREATE INDEX IF NOT EXISTS idx_edges_target
|
|
600
|
-
ON graph_edges (profile_id, target_id);
|
|
601
|
-
CREATE INDEX IF NOT EXISTS idx_edges_type
|
|
602
|
-
ON graph_edges (profile_id, edge_type);
|
|
603
|
-
CREATE INDEX IF NOT EXISTS idx_edges_exists_check
|
|
604
|
-
ON graph_edges (profile_id, source_id, target_id, edge_type);"""
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
# ---------------------------------------------------------------------------
|
|
608
|
-
# Consolidation log (ADD / UPDATE / SUPERSEDE / NOOP decisions)
|
|
609
|
-
# ---------------------------------------------------------------------------
|
|
610
|
-
|
|
611
|
-
_SQL_CONSOLIDATION_LOG: Final[str] = """
|
|
612
|
-
CREATE TABLE IF NOT EXISTS consolidation_log (
|
|
613
|
-
action_id TEXT PRIMARY KEY,
|
|
614
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
615
|
-
action_type TEXT NOT NULL DEFAULT 'add'
|
|
616
|
-
CHECK (action_type IN (
|
|
617
|
-
'add', 'update', 'supersede', 'noop'
|
|
618
|
-
)),
|
|
619
|
-
new_fact_id TEXT NOT NULL DEFAULT '',
|
|
620
|
-
existing_fact_id TEXT NOT NULL DEFAULT '',
|
|
621
|
-
reason TEXT NOT NULL DEFAULT '',
|
|
622
|
-
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
623
|
-
|
|
624
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
625
|
-
ON DELETE CASCADE
|
|
626
|
-
);
|
|
627
|
-
|
|
628
|
-
CREATE INDEX IF NOT EXISTS idx_conslog_profile
|
|
629
|
-
ON consolidation_log (profile_id);
|
|
630
|
-
CREATE INDEX IF NOT EXISTS idx_conslog_new_fact
|
|
631
|
-
ON consolidation_log (new_fact_id);
|
|
632
|
-
"""
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
# ---------------------------------------------------------------------------
|
|
636
|
-
# Trust scores (Bayesian per source / entity / fact)
|
|
637
|
-
# ---------------------------------------------------------------------------
|
|
638
|
-
|
|
639
|
-
_SQL_TRUST_SCORES: Final[str] = """
|
|
640
|
-
CREATE TABLE IF NOT EXISTS trust_scores (
|
|
641
|
-
trust_id TEXT PRIMARY KEY,
|
|
642
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
643
|
-
target_type TEXT NOT NULL DEFAULT '',
|
|
644
|
-
target_id TEXT NOT NULL DEFAULT '',
|
|
645
|
-
trust_score REAL NOT NULL DEFAULT 0.5,
|
|
646
|
-
evidence_count INTEGER NOT NULL DEFAULT 0,
|
|
647
|
-
last_updated TEXT NOT NULL DEFAULT (datetime('now')),
|
|
648
|
-
|
|
649
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
650
|
-
ON DELETE CASCADE
|
|
651
|
-
);
|
|
652
|
-
|
|
653
|
-
CREATE INDEX IF NOT EXISTS idx_trust_profile
|
|
654
|
-
ON trust_scores (profile_id);
|
|
655
|
-
CREATE INDEX IF NOT EXISTS idx_trust_target
|
|
656
|
-
ON trust_scores (profile_id, target_type, target_id);
|
|
657
|
-
"""
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
# ---------------------------------------------------------------------------
|
|
661
|
-
# Provenance (who/what created this memory and how)
|
|
662
|
-
# ---------------------------------------------------------------------------
|
|
663
|
-
|
|
664
|
-
_SQL_PROVENANCE: Final[str] = """
|
|
665
|
-
CREATE TABLE IF NOT EXISTS provenance (
|
|
666
|
-
provenance_id TEXT PRIMARY KEY,
|
|
667
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
668
|
-
fact_id TEXT NOT NULL,
|
|
669
|
-
source_type TEXT NOT NULL DEFAULT '',
|
|
670
|
-
source_id TEXT NOT NULL DEFAULT '',
|
|
671
|
-
created_by TEXT NOT NULL DEFAULT '',
|
|
672
|
-
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
673
|
-
|
|
674
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
675
|
-
ON DELETE CASCADE,
|
|
676
|
-
FOREIGN KEY (fact_id) REFERENCES atomic_facts (fact_id)
|
|
677
|
-
ON DELETE CASCADE
|
|
678
|
-
);
|
|
679
|
-
|
|
680
|
-
CREATE INDEX IF NOT EXISTS idx_prov_profile
|
|
681
|
-
ON provenance (profile_id);
|
|
682
|
-
CREATE INDEX IF NOT EXISTS idx_prov_fact
|
|
683
|
-
ON provenance (fact_id);
|
|
684
|
-
"""
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
# ---------------------------------------------------------------------------
|
|
688
|
-
# Feedback records (user feedback on retrieval results)
|
|
689
|
-
# ---------------------------------------------------------------------------
|
|
690
|
-
|
|
691
|
-
_SQL_FEEDBACK_RECORDS: Final[str] = """
|
|
692
|
-
CREATE TABLE IF NOT EXISTS feedback_records (
|
|
693
|
-
feedback_id TEXT PRIMARY KEY,
|
|
694
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
695
|
-
query TEXT NOT NULL DEFAULT '',
|
|
696
|
-
fact_id TEXT NOT NULL,
|
|
697
|
-
feedback_type TEXT NOT NULL DEFAULT '',
|
|
698
|
-
dwell_time_ms INTEGER NOT NULL DEFAULT 0,
|
|
699
|
-
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
700
|
-
|
|
701
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
702
|
-
ON DELETE CASCADE,
|
|
703
|
-
FOREIGN KEY (fact_id) REFERENCES atomic_facts (fact_id)
|
|
704
|
-
ON DELETE CASCADE
|
|
705
|
-
);
|
|
706
|
-
|
|
707
|
-
CREATE INDEX IF NOT EXISTS idx_feedback_profile
|
|
708
|
-
ON feedback_records (profile_id);
|
|
709
|
-
CREATE INDEX IF NOT EXISTS idx_feedback_fact
|
|
710
|
-
ON feedback_records (fact_id);
|
|
711
|
-
"""
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
# ---------------------------------------------------------------------------
|
|
715
|
-
# Behavioral patterns (learned query habits / topic prefs)
|
|
716
|
-
# ---------------------------------------------------------------------------
|
|
717
|
-
|
|
718
|
-
_SQL_BEHAVIORAL_PATTERNS: Final[str] = """
|
|
719
|
-
CREATE TABLE IF NOT EXISTS behavioral_patterns (
|
|
720
|
-
pattern_id TEXT PRIMARY KEY,
|
|
721
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
722
|
-
pattern_type TEXT NOT NULL DEFAULT '',
|
|
723
|
-
pattern_key TEXT NOT NULL DEFAULT '',
|
|
724
|
-
pattern_value TEXT NOT NULL DEFAULT '',
|
|
725
|
-
confidence REAL NOT NULL DEFAULT 0.0,
|
|
726
|
-
observation_count INTEGER NOT NULL DEFAULT 0,
|
|
727
|
-
last_updated TEXT NOT NULL DEFAULT (datetime('now')),
|
|
728
|
-
|
|
729
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
730
|
-
ON DELETE CASCADE
|
|
731
|
-
);
|
|
732
|
-
|
|
733
|
-
CREATE INDEX IF NOT EXISTS idx_bpatterns_profile
|
|
734
|
-
ON behavioral_patterns (profile_id);
|
|
735
|
-
CREATE INDEX IF NOT EXISTS idx_bpatterns_type
|
|
736
|
-
ON behavioral_patterns (profile_id, pattern_type);
|
|
737
|
-
"""
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
# ---------------------------------------------------------------------------
|
|
741
|
-
# Action outcomes (did the retrieved facts help?)
|
|
742
|
-
# ---------------------------------------------------------------------------
|
|
743
|
-
|
|
744
|
-
_SQL_ACTION_OUTCOMES: Final[str] = """
|
|
745
|
-
CREATE TABLE IF NOT EXISTS action_outcomes (
|
|
746
|
-
outcome_id TEXT PRIMARY KEY,
|
|
747
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
748
|
-
query TEXT NOT NULL DEFAULT '',
|
|
749
|
-
fact_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
750
|
-
outcome TEXT NOT NULL DEFAULT '',
|
|
751
|
-
context_json TEXT NOT NULL DEFAULT '{}',
|
|
752
|
-
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
753
|
-
|
|
754
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
755
|
-
ON DELETE CASCADE
|
|
756
|
-
);
|
|
757
|
-
|
|
758
|
-
CREATE INDEX IF NOT EXISTS idx_outcomes_profile
|
|
759
|
-
ON action_outcomes (profile_id);
|
|
760
|
-
"""
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
# ---------------------------------------------------------------------------
|
|
764
|
-
# Compliance audit (GDPR, EU AI Act trail)
|
|
765
|
-
# ---------------------------------------------------------------------------
|
|
766
|
-
|
|
767
|
-
_SQL_COMPLIANCE_AUDIT: Final[str] = """
|
|
768
|
-
CREATE TABLE IF NOT EXISTS compliance_audit (
|
|
769
|
-
audit_id TEXT PRIMARY KEY,
|
|
770
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
771
|
-
action TEXT NOT NULL DEFAULT '',
|
|
772
|
-
target_type TEXT NOT NULL DEFAULT '',
|
|
773
|
-
target_id TEXT NOT NULL DEFAULT '',
|
|
774
|
-
details TEXT NOT NULL DEFAULT '',
|
|
775
|
-
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
776
|
-
|
|
777
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
778
|
-
ON DELETE CASCADE
|
|
779
|
-
);
|
|
780
|
-
|
|
781
|
-
CREATE INDEX IF NOT EXISTS idx_audit_profile
|
|
782
|
-
ON compliance_audit (profile_id);
|
|
783
|
-
CREATE INDEX IF NOT EXISTS idx_audit_action
|
|
784
|
-
ON compliance_audit (profile_id, action);
|
|
785
|
-
CREATE INDEX IF NOT EXISTS idx_audit_target
|
|
786
|
-
ON compliance_audit (profile_id, target_type, target_id);
|
|
787
|
-
"""
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
# ---------------------------------------------------------------------------
|
|
791
|
-
# BM25 Token Persistence
|
|
792
|
-
# ---------------------------------------------------------------------------
|
|
793
|
-
|
|
794
|
-
_SQL_BM25_TOKENS: Final[str] = """
|
|
795
|
-
CREATE TABLE IF NOT EXISTS bm25_tokens (
|
|
796
|
-
fact_id TEXT NOT NULL,
|
|
797
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
798
|
-
tokens TEXT NOT NULL DEFAULT '[]',
|
|
799
|
-
|
|
800
|
-
PRIMARY KEY (fact_id, profile_id),
|
|
801
|
-
FOREIGN KEY (profile_id) REFERENCES profiles (profile_id)
|
|
802
|
-
ON DELETE CASCADE
|
|
803
|
-
);
|
|
804
|
-
"""
|
|
805
|
-
|
|
806
|
-
# ---------------------------------------------------------------------------
|
|
807
|
-
# Key-Value Config Store
|
|
808
|
-
# ---------------------------------------------------------------------------
|
|
809
|
-
|
|
810
|
-
_SQL_CONFIG: Final[str] = """
|
|
811
|
-
CREATE TABLE IF NOT EXISTS config (
|
|
812
|
-
key TEXT PRIMARY KEY,
|
|
813
|
-
value TEXT NOT NULL DEFAULT '',
|
|
814
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
815
|
-
);
|
|
816
|
-
"""
|
|
817
|
-
|
|
818
|
-
# Wave Q: entity-community backbone (additive; safe on existing DBs).
|
|
819
|
-
# One row per (profile, entity) mapping to the community it belongs to,
|
|
820
|
-
# computed by Louvain over the entity co-occurrence graph in the background.
|
|
821
|
-
# Shared spine for Q2 community summaries and Q3 progressive abstraction.
|
|
822
|
-
_SQL_ENTITY_COMMUNITIES: Final[str] = """
|
|
823
|
-
CREATE TABLE IF NOT EXISTS entity_communities (
|
|
824
|
-
profile_id TEXT NOT NULL,
|
|
825
|
-
entity_id TEXT NOT NULL,
|
|
826
|
-
community_id INTEGER NOT NULL,
|
|
827
|
-
computed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
828
|
-
PRIMARY KEY (profile_id, entity_id)
|
|
829
|
-
);
|
|
830
|
-
CREATE INDEX IF NOT EXISTS idx_entity_comm_profile
|
|
831
|
-
ON entity_communities(profile_id);
|
|
832
|
-
CREATE INDEX IF NOT EXISTS idx_entity_comm_cid
|
|
833
|
-
ON entity_communities(profile_id, community_id);
|
|
834
|
-
"""
|
|
835
|
-
|
|
836
|
-
# Wave Q2: one synthesized report per entity community (additive; safe on
|
|
837
|
-
# existing DBs). Generated in the background after entity_communities; the
|
|
838
|
-
# summary excludes superseded facts. member_fact_ids enables drill-down.
|
|
839
|
-
_SQL_COMMUNITY_SUMMARIES: Final[str] = """
|
|
840
|
-
CREATE TABLE IF NOT EXISTS community_summaries (
|
|
841
|
-
profile_id TEXT NOT NULL,
|
|
842
|
-
community_id INTEGER NOT NULL,
|
|
843
|
-
summary TEXT NOT NULL DEFAULT '',
|
|
844
|
-
keywords TEXT NOT NULL DEFAULT '',
|
|
845
|
-
entity_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
846
|
-
fact_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
847
|
-
fact_count INTEGER NOT NULL DEFAULT 0,
|
|
848
|
-
computed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
849
|
-
PRIMARY KEY (profile_id, community_id)
|
|
850
|
-
);
|
|
851
|
-
CREATE INDEX IF NOT EXISTS idx_comm_summ_profile
|
|
852
|
-
ON community_summaries(profile_id);
|
|
853
|
-
"""
|
|
854
|
-
|
|
855
|
-
# Display-only consolidated summaries.
|
|
856
|
-
#
|
|
857
|
-
# A summary of a cluster of facts is a VIEW of memory, not a memory. Between
|
|
858
|
-
# v3.6.4 and 4.0.9 the fact consolidator wrote its summaries straight into
|
|
859
|
-
# atomic_facts with a raw INSERT, which put model-authored prose into the
|
|
860
|
-
# retrieval corpus alongside the user's own words — where it out-ranked them,
|
|
861
|
-
# because those rows carried every entity in their cluster and so had more
|
|
862
|
-
# entity links than any real fact.
|
|
863
|
-
#
|
|
864
|
-
# This table restores the boundary. community_summaries is the precedent to
|
|
865
|
-
# read it by: written by one owner, read only after retrieval has finished, and
|
|
866
|
-
# named by no channel. tests/test_retrieval/test_summaries_stay_out_of_recall.py
|
|
867
|
-
# fails if a retrieval module so much as mentions it.
|
|
868
|
-
#
|
|
869
|
-
# source_earliest / source_latest are the honest dates for a derived row. A
|
|
870
|
-
# summary has no observation_date of its own — it was never observed — but the
|
|
871
|
-
# span of what it summarises is real, and it is what lets the dashboard say
|
|
872
|
-
# which stretch of work a summary covers.
|
|
873
|
-
CONSOLIDATED_SUMMARIES_DDL: Final[str] = """
|
|
874
|
-
CREATE TABLE IF NOT EXISTS consolidated_summaries (
|
|
875
|
-
summary_id TEXT PRIMARY KEY,
|
|
876
|
-
profile_id TEXT NOT NULL,
|
|
877
|
-
entity_id TEXT NOT NULL DEFAULT '',
|
|
878
|
-
entity_name TEXT NOT NULL DEFAULT '',
|
|
879
|
-
content TEXT NOT NULL,
|
|
880
|
-
source_fact_ids TEXT NOT NULL DEFAULT '[]',
|
|
881
|
-
source_count INTEGER NOT NULL DEFAULT 0,
|
|
882
|
-
char_count INTEGER NOT NULL DEFAULT 0,
|
|
883
|
-
generated_by TEXT NOT NULL DEFAULT 'extractive'
|
|
884
|
-
CHECK (generated_by IN (
|
|
885
|
-
'extractive', 'ollama', 'cloud', 'migrated'
|
|
886
|
-
)),
|
|
887
|
-
scope TEXT NOT NULL DEFAULT 'personal',
|
|
888
|
-
shared_with TEXT,
|
|
889
|
-
source_earliest TEXT,
|
|
890
|
-
source_latest TEXT,
|
|
891
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
892
|
-
UNIQUE (profile_id, entity_id, content)
|
|
893
|
-
);
|
|
894
|
-
CREATE INDEX IF NOT EXISTS idx_consolidated_summaries_profile
|
|
895
|
-
ON consolidated_summaries(profile_id, created_at DESC);
|
|
896
|
-
CREATE INDEX IF NOT EXISTS idx_consolidated_summaries_entity
|
|
897
|
-
ON consolidated_summaries(profile_id, entity_id);
|
|
898
|
-
"""
|
|
899
|
-
|
|
900
|
-
# Wave Q3: progressive-abstraction top tier — one persona roll-up per profile
|
|
901
|
-
# consuming the top community summaries (additive; safe on existing DBs).
|
|
902
|
-
# Recall-gated (never auto-injected into hot recall) and size-bounded to avoid
|
|
903
|
-
# the V3.4.40 summary-pollution regression. Drill-down: community_ids_json →
|
|
904
|
-
# communities → their member facts.
|
|
905
|
-
_SQL_PERSONA_SUMMARY: Final[str] = """
|
|
906
|
-
CREATE TABLE IF NOT EXISTS persona_summary (
|
|
907
|
-
profile_id TEXT PRIMARY KEY,
|
|
908
|
-
summary TEXT NOT NULL DEFAULT '',
|
|
909
|
-
keywords TEXT NOT NULL DEFAULT '',
|
|
910
|
-
community_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
911
|
-
computed_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
912
|
-
);
|
|
913
|
-
"""
|
|
914
|
-
|
|
915
|
-
# ---------------------------------------------------------------------------
|
|
916
|
-
# Ordered DDL list (tables before FTS, respects FK order)
|
|
917
|
-
# ---------------------------------------------------------------------------
|
|
918
|
-
|
|
919
|
-
#: Imported rather than restated so the table has exactly one definition; the
|
|
920
|
-
#: module that owns the queue owns its shape.
|
|
921
|
-
from superlocalmemory.storage.projection_outbox import DDL as _PROJECTION_OUTBOX_DDL
|
|
922
|
-
|
|
923
|
-
_DDL_ORDERED: Final[tuple[str, ...]] = (
|
|
924
|
-
_SQL_SCHEMA_VERSION,
|
|
925
|
-
_SQL_PROFILES,
|
|
926
|
-
_SQL_MEMORIES,
|
|
927
|
-
_SQL_ATOMIC_FACTS,
|
|
928
|
-
_SQL_CANONICAL_ENTITIES,
|
|
929
|
-
_SQL_FACT_ENTITY_ASSOCIATIONS,
|
|
930
|
-
_SQL_ENTITY_ALIASES,
|
|
931
|
-
_SQL_ENTITY_PROFILES,
|
|
932
|
-
_SQL_MEMORY_SCENES,
|
|
933
|
-
_SQL_SCENE_FACT_MEMBERS,
|
|
934
|
-
_SQL_TEMPORAL_EVENTS,
|
|
935
|
-
_SQL_GRAPH_EDGES,
|
|
936
|
-
_SQL_CONSOLIDATION_LOG,
|
|
937
|
-
_SQL_TRUST_SCORES,
|
|
938
|
-
_SQL_PROVENANCE,
|
|
939
|
-
_SQL_FEEDBACK_RECORDS,
|
|
940
|
-
_SQL_BEHAVIORAL_PATTERNS,
|
|
941
|
-
_SQL_ACTION_OUTCOMES,
|
|
942
|
-
_SQL_COMPLIANCE_AUDIT,
|
|
943
|
-
_SQL_BM25_TOKENS,
|
|
944
|
-
_SQL_CONFIG,
|
|
945
|
-
# V2 migration cleanup — drop stale triggers/FTS before recreating
|
|
946
|
-
_SQL_V2_MIGRATION_CLEANUP,
|
|
947
|
-
# FTS5 must come after atomic_facts (content table) AND after cleanup
|
|
948
|
-
_SQL_ATOMIC_FACTS_FTS,
|
|
949
|
-
# T3b: standalone expansion FTS (additive; safe on existing DBs)
|
|
950
|
-
_SQL_FACT_EXPANSION_FTS,
|
|
951
|
-
# Wave Q: entity-community backbone (additive; safe on existing DBs)
|
|
952
|
-
_SQL_ENTITY_COMMUNITIES,
|
|
953
|
-
# Wave Q2: community summaries (additive; safe on existing DBs)
|
|
954
|
-
_SQL_COMMUNITY_SUMMARIES,
|
|
955
|
-
CONSOLIDATED_SUMMARIES_DDL,
|
|
956
|
-
# Wave Q3: persona roll-up tier (additive; safe on existing DBs)
|
|
957
|
-
_SQL_PERSONA_SUMMARY,
|
|
958
|
-
# The queue that makes a graph/vector projection write survive a crash.
|
|
959
|
-
# Created here, at every engine init, rather than only by its migration:
|
|
960
|
-
# if this table is missing, facts stop being projected and the only symptom
|
|
961
|
-
# is a memory that cannot be recalled. That invariant must not be
|
|
962
|
-
# contingent on a migration pass having succeeded.
|
|
963
|
-
_PROJECTION_OUTBOX_DDL,
|
|
964
|
-
)
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
# ---------------------------------------------------------------------------
|
|
968
|
-
# Public API
|
|
969
|
-
# ---------------------------------------------------------------------------
|
|
970
|
-
|
|
971
|
-
#: (table, column, column definition). Applied with ALTER TABLE ADD COLUMN,
|
|
972
|
-
#: which SQLite offers no IF NOT EXISTS form of, so presence is checked first.
|
|
973
|
-
_ADDITIVE_COLUMNS: Final[tuple[tuple[str, str, str], ...]] = (
|
|
974
|
-
("atomic_facts", "quarantined", "INTEGER NOT NULL DEFAULT 0"),
|
|
975
|
-
# ``pinned`` arrives with M015, which is a DEFERRED migration -- it runs
|
|
976
|
-
# after the engine is up. But the DDL below indexes it
|
|
977
|
-
# (``idx_facts_pinned``), and that DDL runs during engine start. On a store
|
|
978
|
-
# old enough to predate M015 the index therefore raised "no such column:
|
|
979
|
-
# pinned" before anything could add it, and every start failed the same way:
|
|
980
|
-
# the deferred pass could not run because the engine could not start, and
|
|
981
|
-
# the engine could not start because the deferred pass had not run.
|
|
982
|
-
# ``slm db migrate`` did not break the loop either -- it reports Failed=0
|
|
983
|
-
# and skips deferred migrations by definition.
|
|
984
|
-
# The column has to exist before its own index either way, so it belongs
|
|
985
|
-
# here, where a store gets it at start regardless of migration state.
|
|
986
|
-
("atomic_facts", "pinned", "INTEGER NOT NULL DEFAULT 0"),
|
|
987
|
-
)
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
def _add_missing_columns(conn: sqlite3.Connection) -> None:
|
|
991
|
-
"""Add columns that upgraded databases predate. Idempotent.
|
|
992
|
-
|
|
993
|
-
A missing table is not an error: this runs inside create_all_tables, so the
|
|
994
|
-
table is created moments earlier in the same call, and a database old enough
|
|
995
|
-
to lack it entirely has nothing to alter.
|
|
996
|
-
"""
|
|
997
|
-
for table, column, definition in _ADDITIVE_COLUMNS:
|
|
998
|
-
try:
|
|
999
|
-
present = any(
|
|
1000
|
-
row[1] == column
|
|
1001
|
-
for row in conn.execute(f"PRAGMA table_info({table})")
|
|
1002
|
-
)
|
|
1003
|
-
if not present:
|
|
1004
|
-
conn.execute(
|
|
1005
|
-
f"ALTER TABLE {table} ADD COLUMN {column} {definition}"
|
|
1006
|
-
)
|
|
1007
|
-
except sqlite3.Error as exc:
|
|
1008
|
-
# Never fatal. A store that cannot take the column keeps working;
|
|
1009
|
-
# get_facts_by_ids checks for the column before filtering on it.
|
|
1010
|
-
logger.warning(
|
|
1011
|
-
"additive column %s.%s not applied: %s", table, column, exc,
|
|
1012
|
-
)
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
def create_all_tables(conn: sqlite3.Connection) -> None:
|
|
1016
|
-
"""Create every table, index, trigger, and FTS virtual table.
|
|
1017
|
-
|
|
1018
|
-
Safe to call repeatedly — all statements use IF NOT EXISTS.
|
|
1019
|
-
Inserts the initial schema_version row on first run.
|
|
1020
|
-
|
|
1021
|
-
Args:
|
|
1022
|
-
conn: An open SQLite connection. Caller manages commit.
|
|
1023
|
-
"""
|
|
1024
|
-
_set_pragmas(conn)
|
|
1025
|
-
|
|
1026
|
-
# Before the DDL, not only after it. The DDL below indexes columns that an
|
|
1027
|
-
# upgraded store may not have yet, and an index on a column that does not
|
|
1028
|
-
# exist is a hard error, not a skipped statement -- so the whole of
|
|
1029
|
-
# create_all_tables would raise and the engine would never start.
|
|
1030
|
-
#
|
|
1031
|
-
# On a fresh database this pass does nothing: the tables do not exist yet,
|
|
1032
|
-
# which the helper treats as "nothing to alter". On an upgraded one the
|
|
1033
|
-
# tables are already there and this is exactly where the columns are owed.
|
|
1034
|
-
# It runs again at the end for tables created during this call.
|
|
1035
|
-
_add_missing_columns(conn)
|
|
1036
|
-
|
|
1037
|
-
for ddl in _DDL_ORDERED:
|
|
1038
|
-
conn.executescript(ddl)
|
|
1039
|
-
|
|
1040
|
-
# --- V3.2 schema extension (additive only) ---
|
|
1041
|
-
from superlocalmemory.storage.schema_v32 import V32_DDL
|
|
1042
|
-
for ddl in V32_DDL:
|
|
1043
|
-
conn.executescript(ddl)
|
|
1044
|
-
|
|
1045
|
-
# Additive columns on tables that predate them.
|
|
1046
|
-
#
|
|
1047
|
-
# CREATE TABLE IF NOT EXISTS cannot add a column to a table that already
|
|
1048
|
-
# exists, so an upgraded database gets the column here rather than only from
|
|
1049
|
-
# a migration. Doing it at every engine init makes the invariant "if
|
|
1050
|
-
# atomic_facts exists then quarantined exists" hold even when the migration
|
|
1051
|
-
# pass failed or was never reached — which matters because withholding a
|
|
1052
|
-
# poisoned row from retrieval must not be contingent on a migration having
|
|
1053
|
-
# succeeded.
|
|
1054
|
-
_add_missing_columns(conn)
|
|
1055
|
-
|
|
1056
|
-
# Seed schema version on first run.
|
|
1057
|
-
existing = conn.execute(
|
|
1058
|
-
"SELECT COUNT(*) AS n FROM schema_version"
|
|
1059
|
-
).fetchone()
|
|
1060
|
-
if existing[0] == 0:
|
|
1061
|
-
conn.execute(
|
|
1062
|
-
"INSERT INTO schema_version (version, description) VALUES (?, ?)",
|
|
1063
|
-
(SCHEMA_VERSION, "Initial schema — zero dead tables"),
|
|
1064
|
-
)
|
|
1065
|
-
|
|
1066
|
-
# Ensure the 'default' profile exists.
|
|
1067
|
-
conn.execute(
|
|
1068
|
-
"INSERT OR IGNORE INTO profiles (profile_id, name) VALUES (?, ?)",
|
|
1069
|
-
("default", "Default Profile"),
|
|
1070
|
-
)
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
def drop_all_tables(conn: sqlite3.Connection) -> None:
|
|
1074
|
-
"""Drop every table and FTS virtual table. For testing only.
|
|
1075
|
-
|
|
1076
|
-
Args:
|
|
1077
|
-
conn: An open SQLite connection. Caller manages commit.
|
|
1078
|
-
"""
|
|
1079
|
-
# V32 tables first (they may FK to base tables)
|
|
1080
|
-
from superlocalmemory.storage.schema_v32 import V32_ROLLBACK
|
|
1081
|
-
for sql in V32_ROLLBACK:
|
|
1082
|
-
conn.execute(sql)
|
|
1083
|
-
|
|
1084
|
-
# FTS + triggers first (depend on atomic_facts).
|
|
1085
|
-
for fts in _FTS_TABLES:
|
|
1086
|
-
conn.execute(f"DROP TABLE IF EXISTS {fts}")
|
|
1087
|
-
for trigger in (
|
|
1088
|
-
"atomic_facts_fts_insert",
|
|
1089
|
-
"atomic_facts_fts_delete",
|
|
1090
|
-
"atomic_facts_fts_update",
|
|
1091
|
-
"trg_scene_fact_members_insert",
|
|
1092
|
-
"trg_scene_fact_members_update",
|
|
1093
|
-
):
|
|
1094
|
-
conn.execute(f"DROP TRIGGER IF EXISTS {trigger}")
|
|
1095
|
-
|
|
1096
|
-
# Drop regular tables in reverse FK order.
|
|
1097
|
-
for table in reversed(_TABLES):
|
|
1098
|
-
conn.execute(f"DROP TABLE IF EXISTS {table}")
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
def get_table_names() -> tuple[str, ...]:
|
|
1102
|
-
"""Return all regular table names (excludes FTS virtual tables)."""
|
|
1103
|
-
return _TABLES
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
def get_fts_table_names() -> tuple[str, ...]:
|
|
1107
|
-
"""Return all FTS virtual table names."""
|
|
1108
|
-
return _FTS_TABLES
|