superlocalmemory 4.1.13 → 4.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,620 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""M046 — a planned future event is prospective memory, not a temporal one.
|
|
5
|
-
|
|
6
|
-
THE COLLISION
|
|
7
|
-
-------------
|
|
8
|
-
``FactType.TEMPORAL`` was documented in two places as two different things. The
|
|
9
|
-
type's own comment said "time-bounded events with intervals". The router that
|
|
10
|
-
assigns it says "a scheduled/planned future event" and matches on
|
|
11
|
-
``scheduled|deadline|appointment|planned|tomorrow``. Those are not the same
|
|
12
|
-
concept: the second is prospective memory — remembering to do something later.
|
|
13
|
-
|
|
14
|
-
Meanwhile the retrieval **channel** named "temporal" scores every fact by date
|
|
15
|
-
proximity regardless of its type. So one word meant a memory type and a scoring
|
|
16
|
-
strategy, and the two met in the fusion step with nothing to distinguish them.
|
|
17
|
-
|
|
18
|
-
Renaming the type is not cosmetic. The surface that answers "what is coming up"
|
|
19
|
-
selects ``WHERE fact_type = 'temporal'`` in raw SQL — a reader looking for
|
|
20
|
-
prospective memory had to know it was filed under a word that also names a
|
|
21
|
-
scoring strategy applied to everything.
|
|
22
|
-
|
|
23
|
-
WHY THE TABLE HAS TO BE REBUILT
|
|
24
|
-
-------------------------------
|
|
25
|
-
``atomic_facts`` carries ``CHECK (fact_type IN ('episodic','semantic','opinion',
|
|
26
|
-
'temporal'))``. SQLite cannot alter a CHECK constraint, so a new value requires
|
|
27
|
-
the documented rebuild: create the corrected table, copy, drop, rename.
|
|
28
|
-
|
|
29
|
-
Widening the CHECK to accept both words was considered and rejected. It would
|
|
30
|
-
leave an old process able to keep writing the wrong value and succeed, which is
|
|
31
|
-
the whole failure this release is trying to close.
|
|
32
|
-
|
|
33
|
-
ROWID IS PRESERVED, AND THAT IS NOT OPTIONAL
|
|
34
|
-
--------------------------------------------
|
|
35
|
-
``atomic_facts_fts`` is an external-content FTS5 index: ``content='atomic_facts',
|
|
36
|
-
content_rowid='rowid'``. The base table's primary key is TEXT, so it is *not* a
|
|
37
|
-
rowid alias — the table has an implicit rowid, and ``SELECT *`` does not include
|
|
38
|
-
it. A copy that lets SQLite assign fresh rowids leaves every FTS entry pointing
|
|
39
|
-
at a different fact than the one it was built from: searches keep working and
|
|
40
|
-
start returning the wrong rows. Nothing raises.
|
|
41
|
-
|
|
42
|
-
So the copy names ``rowid`` explicitly, and the index is rebuilt afterwards as
|
|
43
|
-
well. Either alone would probably do; both cost nothing and the failure mode is
|
|
44
|
-
silent.
|
|
45
|
-
|
|
46
|
-
ALL OR NOTHING
|
|
47
|
-
--------------
|
|
48
|
-
The runner does not wrap ``apply()`` in a transaction — atomicity is opt-in per
|
|
49
|
-
migration, and a migration that drops a table has to opt in. Everything below
|
|
50
|
-
happens inside one ``BEGIN IMMEDIATE``, and the row count is compared before the
|
|
51
|
-
COMMIT: a copy that lost rows raises, which rolls the whole thing back and leaves
|
|
52
|
-
the original table exactly as it was.
|
|
53
|
-
|
|
54
|
-
``PRAGMA foreign_keys`` is set before the transaction opens, because setting it
|
|
55
|
-
inside one is a silent no-op.
|
|
56
|
-
|
|
57
|
-
FORWARD ONLY
|
|
58
|
-
------------
|
|
59
|
-
The framework has no rollback. Recovery from a bad outcome is restoring the
|
|
60
|
-
pre-migration snapshot. That is why the backup tooling is a hard precondition
|
|
61
|
-
for this migration rather than a nice-to-have.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
from __future__ import annotations
|
|
65
|
-
|
|
66
|
-
import logging
|
|
67
|
-
import sqlite3
|
|
68
|
-
|
|
69
|
-
logger = logging.getLogger(__name__)
|
|
70
|
-
|
|
71
|
-
NAME = "M046_prospective_memory_has_its_own_name"
|
|
72
|
-
DB_TARGET = "memory"
|
|
73
|
-
|
|
74
|
-
#: A store this migration has touched must not be opened by a build whose
|
|
75
|
-
#: ceiling is below this.
|
|
76
|
-
#:
|
|
77
|
-
#: Declared per-migration rather than left to the runner's end-of-run stamp,
|
|
78
|
-
#: because that stamp is a completion certificate: it is written only when EVERY
|
|
79
|
-
#: migration on BOTH databases is recorded complete. So an unrelated failure
|
|
80
|
-
#: elsewhere — a deferred migration on the learning database, say — leaves this
|
|
81
|
-
#: rebuild applied and the ceiling still at the old value. An older build then
|
|
82
|
-
#: passes the guard, opens the store, and its first planned event is rejected by
|
|
83
|
-
#: the new constraint and lost. That is the exact outcome the ceiling exists to
|
|
84
|
-
#: convert into a refusal to start.
|
|
85
|
-
#:
|
|
86
|
-
#: Additive and monotonic: the runner raises the stored version to at least this
|
|
87
|
-
#: and never lowers it.
|
|
88
|
-
BREAKING_VERSION = 46
|
|
89
|
-
|
|
90
|
-
_TABLE = "atomic_facts"
|
|
91
|
-
_OLD_VALUE = "temporal"
|
|
92
|
-
_NEW_VALUE = "prospective"
|
|
93
|
-
_FTS = "atomic_facts_fts"
|
|
94
|
-
|
|
95
|
-
#: Recorded for the runner's DDL hash. ``apply()`` runs instead of this string —
|
|
96
|
-
#: the rebuild needs the live table's own definition, which no static script can
|
|
97
|
-
#: name. Kept accurate because the hash is what detects a shipped migration
|
|
98
|
-
#: being edited afterwards.
|
|
99
|
-
DDL = """
|
|
100
|
-
-- Rebuild atomic_facts with fact_type CHECK accepting 'prospective',
|
|
101
|
-
-- translating every existing 'temporal' row. See apply().
|
|
102
|
-
"""
|
|
103
|
-
|
|
104
|
-
def _table_sql(conn: sqlite3.Connection, name: str) -> str | None:
|
|
105
|
-
try:
|
|
106
|
-
row = conn.execute(
|
|
107
|
-
"SELECT sql FROM sqlite_master WHERE type='table' AND name=?",
|
|
108
|
-
(name,),
|
|
109
|
-
).fetchone()
|
|
110
|
-
except sqlite3.Error:
|
|
111
|
-
return None
|
|
112
|
-
if row is None:
|
|
113
|
-
return None
|
|
114
|
-
return row[0] if not isinstance(row, dict) else row.get("sql")
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
def _columns(conn: sqlite3.Connection, table: str) -> list[str]:
|
|
118
|
-
"""Column names in declared order, tolerant of the connection's row factory."""
|
|
119
|
-
out: list[str] = []
|
|
120
|
-
try:
|
|
121
|
-
for row in conn.execute(f"PRAGMA table_info({table})"):
|
|
122
|
-
if isinstance(row, dict):
|
|
123
|
-
out.append(str(row.get("name", "")))
|
|
124
|
-
else:
|
|
125
|
-
try:
|
|
126
|
-
out.append(str(row["name"]))
|
|
127
|
-
except (TypeError, IndexError, KeyError):
|
|
128
|
-
out.append(str(row[1]))
|
|
129
|
-
except sqlite3.Error:
|
|
130
|
-
return []
|
|
131
|
-
return [c for c in out if c]
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def _count(conn: sqlite3.Connection, sql: str) -> int:
|
|
135
|
-
try:
|
|
136
|
-
row = conn.execute(sql).fetchone()
|
|
137
|
-
except sqlite3.Error:
|
|
138
|
-
return -1
|
|
139
|
-
if row is None:
|
|
140
|
-
return -1
|
|
141
|
-
if isinstance(row, dict):
|
|
142
|
-
return int(next(iter(row.values())))
|
|
143
|
-
return int(row[0])
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def _dependents(conn: sqlite3.Connection) -> list[str]:
|
|
147
|
-
"""DDL for every index and trigger attached to the table.
|
|
148
|
-
|
|
149
|
-
Captured before the drop and replayed after the rename. Auto-created
|
|
150
|
-
indexes (those backing PRIMARY KEY / UNIQUE) have NULL sql and are recreated
|
|
151
|
-
by the table definition itself, so they are excluded rather than replayed.
|
|
152
|
-
"""
|
|
153
|
-
out: list[str] = []
|
|
154
|
-
try:
|
|
155
|
-
rows = conn.execute(
|
|
156
|
-
"SELECT sql FROM sqlite_master "
|
|
157
|
-
"WHERE tbl_name=? AND type IN ('index','trigger') "
|
|
158
|
-
"AND sql IS NOT NULL",
|
|
159
|
-
(_TABLE,),
|
|
160
|
-
).fetchall()
|
|
161
|
-
except sqlite3.Error:
|
|
162
|
-
return []
|
|
163
|
-
for row in rows:
|
|
164
|
-
sql = row[0] if not isinstance(row, dict) else row.get("sql")
|
|
165
|
-
if sql:
|
|
166
|
-
out.append(str(sql))
|
|
167
|
-
return out
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
def _referencing_objects(conn: sqlite3.Connection) -> list[tuple[str, str, str]]:
|
|
171
|
-
"""Triggers and views that NAME this table while living somewhere else.
|
|
172
|
-
|
|
173
|
-
``_dependents`` finds what is attached to the table. This finds what points
|
|
174
|
-
at it. Since SQLite 3.25 an ``ALTER TABLE ... RENAME`` reparses every
|
|
175
|
-
trigger and view in the schema so it can fix up their references, and at
|
|
176
|
-
that moment the old table has already been dropped — so a trigger on
|
|
177
|
-
another table that joins this one makes the rename fail outright:
|
|
178
|
-
|
|
179
|
-
error in trigger trg_scene_fact_members_insert:
|
|
180
|
-
no such table: main.atomic_facts
|
|
181
|
-
|
|
182
|
-
Two such triggers ship on ``memory_scenes``, which means every store that
|
|
183
|
-
has ever held a scene. Caught by running the whole migration chain against
|
|
184
|
-
a real archive; running this migration on its own does not reach it,
|
|
185
|
-
because the triggers are created by a migration that had not run yet.
|
|
186
|
-
|
|
187
|
-
Returned as (kind, name, sql) so each can be dropped before the rename and
|
|
188
|
-
replayed identically afterwards.
|
|
189
|
-
"""
|
|
190
|
-
out: list[tuple[str, str, str]] = []
|
|
191
|
-
try:
|
|
192
|
-
rows = conn.execute(
|
|
193
|
-
"SELECT type, name, sql, tbl_name FROM sqlite_master "
|
|
194
|
-
"WHERE type IN ('trigger','view') AND sql IS NOT NULL "
|
|
195
|
-
"AND tbl_name <> ? AND sql LIKE ?",
|
|
196
|
-
(_TABLE, f"%{_TABLE}%"),
|
|
197
|
-
).fetchall()
|
|
198
|
-
except sqlite3.Error:
|
|
199
|
-
return []
|
|
200
|
-
# ``LIKE '%atomic_facts%'`` is a substring test, so it also matches a
|
|
201
|
-
# future ``atomic_facts_archive``. Narrow it to the table named as a whole
|
|
202
|
-
# word, in any of the spellings SQL allows.
|
|
203
|
-
import re as _re
|
|
204
|
-
|
|
205
|
-
named = _re.compile(
|
|
206
|
-
r"(?<![A-Za-z0-9_])[\"`\[]?" + _re.escape(_TABLE) + r"[\"`\]]?(?![A-Za-z0-9_])"
|
|
207
|
-
)
|
|
208
|
-
for row in rows:
|
|
209
|
-
kind, name, sql = str(row[0]), str(row[1]), str(row[2])
|
|
210
|
-
# The shadow tables of the external-content FTS index name the table
|
|
211
|
-
# too, and they are handled by the FTS rebuild, not by replay.
|
|
212
|
-
if name.startswith(_FTS):
|
|
213
|
-
continue
|
|
214
|
-
if not named.search(sql):
|
|
215
|
-
continue
|
|
216
|
-
out.append((kind, name, sql))
|
|
217
|
-
return out
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
def _has_rowid(conn: sqlite3.Connection) -> bool:
|
|
221
|
-
"""Whether this table has a rowid to preserve.
|
|
222
|
-
|
|
223
|
-
A ``WITHOUT ROWID`` table has none, and naming it in the copy fails with
|
|
224
|
-
"no column named rowid" — which rolls back and leaves the migration retrying
|
|
225
|
-
forever. Asked by trying, for the same reason the constraint is: the answer
|
|
226
|
-
is a property of the table, not of how its definition was written.
|
|
227
|
-
|
|
228
|
-
The shipped schema has a rowid and needs it preserved, because the search
|
|
229
|
-
index is keyed on it. A store that does not have one cannot have that index
|
|
230
|
-
either, so there is nothing to keep.
|
|
231
|
-
"""
|
|
232
|
-
try:
|
|
233
|
-
conn.execute(f"SELECT rowid FROM {_TABLE} LIMIT 1").fetchone()
|
|
234
|
-
return True
|
|
235
|
-
except sqlite3.Error:
|
|
236
|
-
return False
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
def _fts_exists(conn: sqlite3.Connection) -> bool:
|
|
240
|
-
try:
|
|
241
|
-
return conn.execute(
|
|
242
|
-
"SELECT name FROM sqlite_master WHERE name=?", (_FTS,),
|
|
243
|
-
).fetchone() is not None
|
|
244
|
-
except sqlite3.Error:
|
|
245
|
-
return False
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
def _fts_triggers_present(conn: sqlite3.Connection) -> bool:
|
|
249
|
-
"""Whether the table still has triggers feeding the search index.
|
|
250
|
-
|
|
251
|
-
The rebuild drops every trigger and replays it. Without them the table and
|
|
252
|
-
the index drift apart from the next write onwards, which no row count and no
|
|
253
|
-
constraint check would notice.
|
|
254
|
-
"""
|
|
255
|
-
try:
|
|
256
|
-
rows = conn.execute(
|
|
257
|
-
"SELECT COUNT(*) FROM sqlite_master "
|
|
258
|
-
"WHERE type='trigger' AND tbl_name=? AND sql LIKE ?",
|
|
259
|
-
(_TABLE, f"%{_FTS}%"),
|
|
260
|
-
).fetchone()
|
|
261
|
-
except sqlite3.Error:
|
|
262
|
-
return False
|
|
263
|
-
if rows is None:
|
|
264
|
-
return False
|
|
265
|
-
count = next(iter(rows.values())) if isinstance(rows, dict) else rows[0]
|
|
266
|
-
return int(count) > 0
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
def _accepts(conn: sqlite3.Connection, value: str) -> bool | None:
|
|
270
|
-
"""Whether the table will accept ``value`` in ``fact_type``. None if unknown.
|
|
271
|
-
|
|
272
|
-
Asked by attempting a write inside a savepoint and rolling it back, because
|
|
273
|
-
the constraint is what decides and its DDL text can be spelled several ways.
|
|
274
|
-
|
|
275
|
-
An earlier version read the answer out of the CREATE statement with a regex
|
|
276
|
-
that required a bare ``fact_type`` identifier. On a store whose constraint
|
|
277
|
-
was written ``CHECK ("fact_type" IN (...))`` the pattern did not match, the
|
|
278
|
-
migration concluded there was nothing blocking it, took the cheap UPDATE
|
|
279
|
-
path — and then either raised on the first converted row, or, on a store
|
|
280
|
-
with none, committed happily. In that second case ``verify()`` reported the
|
|
281
|
-
migration complete while the table went on rejecting the new value, so every
|
|
282
|
-
planned event stored afterwards was lost to a constraint failure. Nothing
|
|
283
|
-
would ever have repaired it, because the same regex answered the same way
|
|
284
|
-
every time.
|
|
285
|
-
|
|
286
|
-
Returns None when there is no row to probe with. The caller treats that as
|
|
287
|
-
"rebuild anyway": on an empty table a rebuild costs microseconds and makes
|
|
288
|
-
the constraint correct by construction, which is a better trade than
|
|
289
|
-
guessing from text.
|
|
290
|
-
"""
|
|
291
|
-
try:
|
|
292
|
-
row = conn.execute(f"SELECT rowid FROM {_TABLE} LIMIT 1").fetchone()
|
|
293
|
-
except sqlite3.Error:
|
|
294
|
-
return None
|
|
295
|
-
if row is None:
|
|
296
|
-
return None
|
|
297
|
-
rowid = next(iter(row.values())) if isinstance(row, dict) else row[0]
|
|
298
|
-
|
|
299
|
-
try:
|
|
300
|
-
conn.execute("SAVEPOINT m046_probe")
|
|
301
|
-
except sqlite3.Error:
|
|
302
|
-
return None
|
|
303
|
-
try:
|
|
304
|
-
conn.execute(
|
|
305
|
-
f"UPDATE {_TABLE} SET fact_type=? WHERE rowid=?", (value, rowid),
|
|
306
|
-
)
|
|
307
|
-
return True
|
|
308
|
-
except sqlite3.IntegrityError:
|
|
309
|
-
return False
|
|
310
|
-
except sqlite3.Error:
|
|
311
|
-
return None
|
|
312
|
-
finally:
|
|
313
|
-
# Rolled back either way: this asks a question, it does not change data.
|
|
314
|
-
try:
|
|
315
|
-
conn.execute("ROLLBACK TO m046_probe")
|
|
316
|
-
conn.execute("RELEASE m046_probe")
|
|
317
|
-
except sqlite3.Error: # pragma: no cover — best effort
|
|
318
|
-
pass
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
def _ddl_mentions_old_value(conn: sqlite3.Connection) -> bool:
|
|
322
|
-
"""Is the old value still written into the table definition?
|
|
323
|
-
|
|
324
|
-
The fallback for a table with no rows to probe. Deliberately looks for the
|
|
325
|
-
quoted literal rather than the word: the shipped schema carries a comment
|
|
326
|
-
reading "-- Temporal (3-date model)", which sqlite_master preserves, and
|
|
327
|
-
matching that would report every correctly-migrated store as unmigrated.
|
|
328
|
-
"""
|
|
329
|
-
sql = _table_sql(conn, _TABLE) or ""
|
|
330
|
-
return f"'{_OLD_VALUE}'" in sql
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def _has_fact_type(conn: sqlite3.Connection) -> bool:
|
|
334
|
-
"""Whether the table carries the column this migration converts.
|
|
335
|
-
|
|
336
|
-
A store can have ``atomic_facts`` without ``fact_type``: the runner applies
|
|
337
|
-
migrations against partially-built schemas, and the column arrives with a
|
|
338
|
-
migration that may not have run yet. Without this check the no-constraint
|
|
339
|
-
path issues ``UPDATE ... SET fact_type`` and fails with "no such column",
|
|
340
|
-
and ``verify`` then fails forever on the same store — which is exactly how
|
|
341
|
-
the previous release's M043 became permanently stuck.
|
|
342
|
-
"""
|
|
343
|
-
return "fact_type" in _columns(conn, _TABLE)
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
347
|
-
"""End state: no row carries the old value, and the CHECK accepts the new one.
|
|
348
|
-
|
|
349
|
-
Deliberately does NOT require that any ``prospective`` rows exist. A store
|
|
350
|
-
with no scheduled events is a normal store, and asserting a non-zero count
|
|
351
|
-
would make this migration fail forever on a fresh install — the mistake a
|
|
352
|
-
migration in the previous release made and had to be repaired for.
|
|
353
|
-
|
|
354
|
-
A missing table, or a table without the column, means there is nothing to
|
|
355
|
-
convert and that is the end state. Every branch of ``apply()`` produces what
|
|
356
|
-
this asserts.
|
|
357
|
-
"""
|
|
358
|
-
if _table_sql(conn, _TABLE) is None:
|
|
359
|
-
return True
|
|
360
|
-
if not _has_fact_type(conn):
|
|
361
|
-
return True
|
|
362
|
-
if _count(conn, f"SELECT COUNT(*) FROM {_TABLE} "
|
|
363
|
-
f"WHERE fact_type='{_OLD_VALUE}'") != 0:
|
|
364
|
-
return False
|
|
365
|
-
|
|
366
|
-
# Two things must hold: the definition no longer names the old value
|
|
367
|
-
# anywhere, and the table actually accepts the new one. The second is asked
|
|
368
|
-
# of SQLite rather than read out of the DDL, because a constraint's text can
|
|
369
|
-
# be spelled several ways and its behaviour cannot.
|
|
370
|
-
#
|
|
371
|
-
# Deliberately NOT asserted: that the old value is rejected. On a store whose
|
|
372
|
-
# table never had a CHECK, that is unachievable without inventing a
|
|
373
|
-
# constraint it never had, and the schema-version ceiling is what actually
|
|
374
|
-
# stops an older writer.
|
|
375
|
-
if _ddl_mentions_old_value(conn):
|
|
376
|
-
return False
|
|
377
|
-
|
|
378
|
-
# The triggers that keep the search index in step with the table. Checked
|
|
379
|
-
# because the rebuild drops and replays them, and a store that ended up
|
|
380
|
-
# without them is not migrated — it is a store that has silently stopped
|
|
381
|
-
# indexing anything written since. Only asserted when the index exists at
|
|
382
|
-
# all: a store without it never had the triggers either.
|
|
383
|
-
if _fts_exists(conn) and not _fts_triggers_present(conn):
|
|
384
|
-
return False
|
|
385
|
-
|
|
386
|
-
accepts_new = _accepts(conn, _NEW_VALUE)
|
|
387
|
-
# None means there was no row to probe with, which on an empty table leaves
|
|
388
|
-
# the definition check above as the whole answer.
|
|
389
|
-
return accepts_new is not False
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
393
|
-
"""Translate the rows, and rebuild the table if its CHECK stands in the way."""
|
|
394
|
-
if _table_sql(conn, _TABLE) is None:
|
|
395
|
-
# The schema has not been created yet; there is nothing to convert.
|
|
396
|
-
return
|
|
397
|
-
if not _has_fact_type(conn):
|
|
398
|
-
# The column this migration converts does not exist on this store yet.
|
|
399
|
-
return
|
|
400
|
-
|
|
401
|
-
# Rebuild only when the definition still names the old value. A store whose
|
|
402
|
-
# table never constrained fact_type at all has nothing to rewrite: its rows
|
|
403
|
-
# still need translating, but inventing a constraint it never had is not this
|
|
404
|
-
# migration's job — the version ceiling is what stops an older writer.
|
|
405
|
-
needs_rebuild = _ddl_mentions_old_value(conn)
|
|
406
|
-
if not needs_rebuild:
|
|
407
|
-
# The constraint is right; only the rows need translating. A plain UPDATE
|
|
408
|
-
# is enough and touches no index: FTS is external-content over
|
|
409
|
-
# `content`, which this does not change.
|
|
410
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
411
|
-
try:
|
|
412
|
-
conn.execute(
|
|
413
|
-
f"UPDATE {_TABLE} SET fact_type=? WHERE fact_type=?",
|
|
414
|
-
(_NEW_VALUE, _OLD_VALUE),
|
|
415
|
-
)
|
|
416
|
-
conn.execute("COMMIT")
|
|
417
|
-
except sqlite3.Error:
|
|
418
|
-
conn.execute("ROLLBACK")
|
|
419
|
-
raise
|
|
420
|
-
return
|
|
421
|
-
|
|
422
|
-
_rebuild(conn)
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
def _rebuild(conn: sqlite3.Connection) -> None:
|
|
426
|
-
"""The documented table rebuild, all inside one transaction."""
|
|
427
|
-
original = _table_sql(conn, _TABLE)
|
|
428
|
-
if not original: # pragma: no cover — guarded by the caller
|
|
429
|
-
raise sqlite3.OperationalError(f"M046: cannot read {_TABLE} definition")
|
|
430
|
-
|
|
431
|
-
# Rename the VALUE, not the column reference. Everything else about the
|
|
432
|
-
# table — every column, default, collation and constraint — is left exactly
|
|
433
|
-
# as the installed schema declared it, because reconstructing from
|
|
434
|
-
# PRAGMA table_info silently drops CHECK constraints and collations.
|
|
435
|
-
#
|
|
436
|
-
# Targeting the quoted literal is what makes this work on any spelling of
|
|
437
|
-
# the constraint. An earlier version matched the identifier, which required a
|
|
438
|
-
# bare `fact_type`; a store written `CHECK ("fact_type" IN (...))` did not
|
|
439
|
-
# match and could not be migrated at all. The value is always `'temporal'`
|
|
440
|
-
# regardless of how the column beside it is quoted.
|
|
441
|
-
rebuilt = original.replace(f"'{_OLD_VALUE}'", f"'{_NEW_VALUE}'")
|
|
442
|
-
|
|
443
|
-
# A rewrite that did not take must stop the migration. Proceeding would
|
|
444
|
-
# create a replacement table carrying the ORIGINAL constraint and then drop
|
|
445
|
-
# the real one — the corrupting outcome this whole module exists to avoid.
|
|
446
|
-
if f"'{_OLD_VALUE}'" in rebuilt or f"'{_NEW_VALUE}'" not in rebuilt:
|
|
447
|
-
raise sqlite3.OperationalError(
|
|
448
|
-
"M046: could not rewrite the fact_type constraint; "
|
|
449
|
-
"refusing to rebuild the table"
|
|
450
|
-
)
|
|
451
|
-
|
|
452
|
-
staged = rebuilt.replace(_TABLE, f"{_TABLE}_m046_new", 1)
|
|
453
|
-
if f"{_TABLE}_m046_new" not in staged: # pragma: no cover — defensive
|
|
454
|
-
raise sqlite3.OperationalError("M046: could not name the staging table")
|
|
455
|
-
|
|
456
|
-
columns = _columns(conn, _TABLE)
|
|
457
|
-
if not columns: # pragma: no cover — defensive
|
|
458
|
-
raise sqlite3.OperationalError(f"M046: {_TABLE} reports no columns")
|
|
459
|
-
|
|
460
|
-
# Generated columns are deliberately absent from this list: PRAGMA
|
|
461
|
-
# table_info does not return them (they appear only in table_xinfo, flagged
|
|
462
|
-
# hidden), and inserting into one is an error. So a store that has added one
|
|
463
|
-
# copies correctly without special handling — verified rather than assumed.
|
|
464
|
-
carries_rowid = _has_rowid(conn)
|
|
465
|
-
|
|
466
|
-
dependents = _dependents(conn)
|
|
467
|
-
referencing = _referencing_objects(conn)
|
|
468
|
-
before = _count(conn, f"SELECT COUNT(*) FROM {_TABLE}")
|
|
469
|
-
if before < 0: # pragma: no cover — defensive
|
|
470
|
-
raise sqlite3.OperationalError(f"M046: cannot count {_TABLE}")
|
|
471
|
-
|
|
472
|
-
# Outside the transaction: inside one, this is a silent no-op.
|
|
473
|
-
#
|
|
474
|
-
# The previous value is read first and put back at the end. Unconditionally
|
|
475
|
-
# switching it ON afterwards would leave the caller's connection in a state
|
|
476
|
-
# it did not ask for — this migration borrows the connection, it does not
|
|
477
|
-
# own its settings.
|
|
478
|
-
try:
|
|
479
|
-
_fk_was = conn.execute("PRAGMA foreign_keys").fetchone()
|
|
480
|
-
fk_was = bool(_fk_was[0]) if _fk_was else False
|
|
481
|
-
except sqlite3.Error: # pragma: no cover
|
|
482
|
-
fk_was = False
|
|
483
|
-
try:
|
|
484
|
-
conn.execute("PRAGMA foreign_keys=OFF")
|
|
485
|
-
except sqlite3.Error: # pragma: no cover
|
|
486
|
-
pass
|
|
487
|
-
|
|
488
|
-
select_list = ", ".join(
|
|
489
|
-
f"CASE WHEN fact_type='{_OLD_VALUE}' THEN '{_NEW_VALUE}' ELSE fact_type END"
|
|
490
|
-
if col == "fact_type" else f'"{col}"'
|
|
491
|
-
for col in columns
|
|
492
|
-
)
|
|
493
|
-
insert_list = ", ".join(f'"{col}"' for col in columns)
|
|
494
|
-
|
|
495
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
496
|
-
try:
|
|
497
|
-
conn.execute(f'DROP TABLE IF EXISTS "{_TABLE}_m046_new"')
|
|
498
|
-
conn.execute(staged)
|
|
499
|
-
|
|
500
|
-
# rowid is named on both sides where there is one. See the module
|
|
501
|
-
# docstring: the FTS index is keyed on it and the primary key is TEXT,
|
|
502
|
-
# so letting SQLite assign fresh ones silently repoints every index
|
|
503
|
-
# entry. A WITHOUT ROWID table has none to name, and naming it there
|
|
504
|
-
# fails the whole rebuild.
|
|
505
|
-
if carries_rowid:
|
|
506
|
-
conn.execute(
|
|
507
|
-
f'INSERT INTO "{_TABLE}_m046_new" (rowid, {insert_list}) '
|
|
508
|
-
f"SELECT rowid, {select_list} FROM {_TABLE}"
|
|
509
|
-
)
|
|
510
|
-
else:
|
|
511
|
-
conn.execute(
|
|
512
|
-
f'INSERT INTO "{_TABLE}_m046_new" ({insert_list}) '
|
|
513
|
-
f"SELECT {select_list} FROM {_TABLE}"
|
|
514
|
-
)
|
|
515
|
-
|
|
516
|
-
after = _count(conn, f'SELECT COUNT(*) FROM "{_TABLE}_m046_new"')
|
|
517
|
-
if after != before:
|
|
518
|
-
raise sqlite3.OperationalError(
|
|
519
|
-
f"M046: copied {after} of {before} rows; rolling back"
|
|
520
|
-
)
|
|
521
|
-
stragglers = _count(
|
|
522
|
-
conn,
|
|
523
|
-
f'SELECT COUNT(*) FROM "{_TABLE}_m046_new" '
|
|
524
|
-
f"WHERE fact_type='{_OLD_VALUE}'",
|
|
525
|
-
)
|
|
526
|
-
if stragglers != 0:
|
|
527
|
-
raise sqlite3.OperationalError(
|
|
528
|
-
f"M046: {stragglers} rows still carry the old value; rolling back"
|
|
529
|
-
)
|
|
530
|
-
|
|
531
|
-
# Triggers first — they name the table and block the drop.
|
|
532
|
-
for kind, name in _trigger_and_index_names(conn):
|
|
533
|
-
conn.execute(f'DROP {kind} IF EXISTS "{name}"')
|
|
534
|
-
|
|
535
|
-
# And anything elsewhere in the schema that merely POINTS at the table:
|
|
536
|
-
# the rename reparses every trigger and view, and one that joins a table
|
|
537
|
-
# which no longer exists fails the whole statement.
|
|
538
|
-
for kind, name, _sql in referencing:
|
|
539
|
-
conn.execute(f'DROP {kind} IF EXISTS "{name}"')
|
|
540
|
-
|
|
541
|
-
conn.execute(f"DROP TABLE {_TABLE}")
|
|
542
|
-
conn.execute(f'ALTER TABLE "{_TABLE}_m046_new" RENAME TO {_TABLE}')
|
|
543
|
-
|
|
544
|
-
for _kind, _name, ddl in referencing:
|
|
545
|
-
# Fatal for the same reason the table's own dependents are: these
|
|
546
|
-
# keep a derived table in step, and committing without them leaves
|
|
547
|
-
# it silently stale.
|
|
548
|
-
conn.execute(ddl)
|
|
549
|
-
|
|
550
|
-
for ddl in dependents:
|
|
551
|
-
# Fatal, which reverses an earlier judgement here. That judgement
|
|
552
|
-
# was that losing the converted rows to a rollback would be worse
|
|
553
|
-
# than a missing index — and it was simply wrong: a rollback loses
|
|
554
|
-
# NOTHING, because the original table is still sitting there and the
|
|
555
|
-
# migration will be retried.
|
|
556
|
-
#
|
|
557
|
-
# Committing without these is what costs something. Two of the three
|
|
558
|
-
# replayed statements are the triggers that keep the search index in
|
|
559
|
-
# step with the table, so a store that commits without them stops
|
|
560
|
-
# indexing every memory saved from then on. Lexical search quietly
|
|
561
|
-
# goes blind to new writes, and nothing reports it.
|
|
562
|
-
conn.execute(ddl)
|
|
563
|
-
|
|
564
|
-
_rebuild_fts(conn)
|
|
565
|
-
conn.execute("COMMIT")
|
|
566
|
-
except sqlite3.Error:
|
|
567
|
-
try:
|
|
568
|
-
conn.execute("ROLLBACK")
|
|
569
|
-
except sqlite3.Error: # pragma: no cover — best effort
|
|
570
|
-
pass
|
|
571
|
-
raise
|
|
572
|
-
finally:
|
|
573
|
-
try:
|
|
574
|
-
conn.execute(
|
|
575
|
-
f"PRAGMA foreign_keys={'ON' if fk_was else 'OFF'}"
|
|
576
|
-
)
|
|
577
|
-
except sqlite3.Error: # pragma: no cover
|
|
578
|
-
pass
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
def _trigger_and_index_names(conn: sqlite3.Connection) -> list[tuple[str, str]]:
|
|
582
|
-
out: list[tuple[str, str]] = []
|
|
583
|
-
try:
|
|
584
|
-
rows = conn.execute(
|
|
585
|
-
"SELECT type, name FROM sqlite_master "
|
|
586
|
-
"WHERE tbl_name=? AND type IN ('index','trigger') "
|
|
587
|
-
"AND sql IS NOT NULL",
|
|
588
|
-
(_TABLE,),
|
|
589
|
-
).fetchall()
|
|
590
|
-
except sqlite3.Error:
|
|
591
|
-
return []
|
|
592
|
-
for row in rows:
|
|
593
|
-
if isinstance(row, dict):
|
|
594
|
-
out.append((str(row.get("type", "")).upper(), str(row.get("name", ""))))
|
|
595
|
-
else:
|
|
596
|
-
out.append((str(row[0]).upper(), str(row[1])))
|
|
597
|
-
return [(k, n) for k, n in out if k and n]
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
def _rebuild_fts(conn: sqlite3.Connection) -> None:
|
|
601
|
-
"""Re-derive the search index from the rebuilt table.
|
|
602
|
-
|
|
603
|
-
Belt and braces alongside preserving rowid. Never fatal: a store whose
|
|
604
|
-
search index needs another rebuild is recoverable, and losing the converted
|
|
605
|
-
rows to a rollback over it would not be.
|
|
606
|
-
"""
|
|
607
|
-
try:
|
|
608
|
-
exists = conn.execute(
|
|
609
|
-
"SELECT name FROM sqlite_master WHERE name=?", (_FTS,),
|
|
610
|
-
).fetchone()
|
|
611
|
-
if exists is None:
|
|
612
|
-
return
|
|
613
|
-
conn.execute(f"INSERT INTO {_FTS}({_FTS}) VALUES('rebuild')")
|
|
614
|
-
except sqlite3.Error as exc:
|
|
615
|
-
logger.warning("M046: search index rebuild deferred: %s", exc)
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
def repair(conn: sqlite3.Connection) -> None:
|
|
619
|
-
"""Re-run apply. Safe: both paths are idempotent and verify their own work."""
|
|
620
|
-
apply(conn)
|