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,306 +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
|
-
"""Rewrite the two Fisher vectors on each fact as float32, like the embedding.
|
|
6
|
-
|
|
7
|
-
WHAT THIS IS ABOUT
|
|
8
|
-
|
|
9
|
-
A fact carries three vectors of the same width: its embedding, and the diagonal
|
|
10
|
-
Fisher mean and variance the memory dynamics read to decide how fast it decays.
|
|
11
|
-
4.0.9 converted the embedding from JSON text to float32 and got 5.5x. The other
|
|
12
|
-
two were left in text.
|
|
13
|
-
|
|
14
|
-
Measured on a real 447 MB store:
|
|
15
|
-
|
|
16
|
-
fisher_mean + fisher_variance 116.5 MB
|
|
17
|
-
embedding (already binary) 15.5 MB
|
|
18
|
-
content — the memories themselves 3.6 MB
|
|
19
|
-
|
|
20
|
-
The Fisher matrices were thirty-two times the size of the memories they
|
|
21
|
-
describe, and more than a quarter of the entire file, because a float printed
|
|
22
|
-
as decimal text costs about 22 bytes and the same float costs 4.
|
|
23
|
-
|
|
24
|
-
WHY AN UPDATE AND NOT A REBUILD
|
|
25
|
-
|
|
26
|
-
``atomic_facts`` has a TEXT primary key, so it also has an implicit rowid, and
|
|
27
|
-
its full-text index is external-content keyed on that rowid. Rebuilding the
|
|
28
|
-
table reassigns rowids and every index entry then points at a different fact —
|
|
29
|
-
searches keep working and return the wrong rows. An UPDATE touches no rowid, so
|
|
30
|
-
the search index is untouched by construction. Nothing here alters the schema:
|
|
31
|
-
the columns are declared TEXT and SQLite stores a BLOB in them regardless.
|
|
32
|
-
|
|
33
|
-
WHY IT CAN BE INTERRUPTED
|
|
34
|
-
|
|
35
|
-
Every row is converted independently and the read path accepts both forms, so a
|
|
36
|
-
store stopped halfway is a working store. Re-running finishes it. That is why
|
|
37
|
-
the work is committed in batches rather than held in one transaction across
|
|
38
|
-
three thousand facts.
|
|
39
|
-
|
|
40
|
-
WHAT VERIFY CAN AND CANNOT CHECK
|
|
41
|
-
|
|
42
|
-
float32 has about seven significant digits, and these numbers were written from
|
|
43
|
-
float64, so the conversion loses precision on purpose. That trade is checked in
|
|
44
|
-
the tests, which hold the original values and compare against them at the
|
|
45
|
-
tolerance float32 provides.
|
|
46
|
-
|
|
47
|
-
``verify`` runs after the fact, when the text it replaced no longer exists, so
|
|
48
|
-
it cannot make that comparison. What it can do is refuse the shapes a broken
|
|
49
|
-
conversion would leave: a convertible vector still in the old form, meaning the
|
|
50
|
-
run stopped early; a buffer that is not a whole number of floats; a non-finite
|
|
51
|
-
value; and a buffer that is entirely zero — which passes every structural check
|
|
52
|
-
and is a deletion wearing the right shape, because the dynamics read an all-zero
|
|
53
|
-
vector as "this memory carries no evidence".
|
|
54
|
-
"""
|
|
55
|
-
|
|
56
|
-
from __future__ import annotations
|
|
57
|
-
|
|
58
|
-
import json
|
|
59
|
-
import logging
|
|
60
|
-
import sqlite3
|
|
61
|
-
|
|
62
|
-
import numpy as np
|
|
63
|
-
|
|
64
|
-
logger = logging.getLogger(__name__)
|
|
65
|
-
|
|
66
|
-
NAME = "M047_fisher_vectors_are_stored_like_every_other_vector"
|
|
67
|
-
DB_TARGET = "memory"
|
|
68
|
-
|
|
69
|
-
#: No schema change and both forms are readable, so an older build opening a
|
|
70
|
-
#: converted store is safe. The floor does not move.
|
|
71
|
-
BREAKING_VERSION = 0
|
|
72
|
-
|
|
73
|
-
_TABLE = "atomic_facts"
|
|
74
|
-
_COLUMNS = ("fisher_mean", "fisher_variance")
|
|
75
|
-
|
|
76
|
-
#: Rows per transaction. Large enough that the commit overhead is irrelevant,
|
|
77
|
-
#: small enough that an interrupted run loses a fraction of a second of work.
|
|
78
|
-
_BATCH = 500
|
|
79
|
-
|
|
80
|
-
#: float32 keeps about seven significant digits. Anything inside this is the
|
|
81
|
-
#: cost that was chosen; anything outside it is a bug.
|
|
82
|
-
_TOLERANCE = 1e-6
|
|
83
|
-
|
|
84
|
-
DDL = """
|
|
85
|
-
-- No schema change. apply() rewrites the two Fisher columns of each fact from
|
|
86
|
-
-- JSON text to a little-endian float32 buffer, in place, in batches.
|
|
87
|
-
"""
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def _is_text_vector(value: object) -> bool:
|
|
91
|
-
"""A value still in the old form: a string that opens like a JSON list."""
|
|
92
|
-
return isinstance(value, str) and value.strip().startswith("[")
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def _encode(text: str) -> bytes | None:
|
|
96
|
-
"""Text form to float32 buffer, or None when there is nothing to store."""
|
|
97
|
-
parsed = json.loads(text)
|
|
98
|
-
if parsed is None:
|
|
99
|
-
return None
|
|
100
|
-
if not isinstance(parsed, list):
|
|
101
|
-
raise ValueError(f"expected a list, got {type(parsed).__name__}")
|
|
102
|
-
return np.asarray(parsed, dtype=np.float32).tobytes()
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def _pending(conn: sqlite3.Connection) -> int:
|
|
106
|
-
"""How many rows still hold a Fisher vector in the old form."""
|
|
107
|
-
clauses = " OR ".join(
|
|
108
|
-
f"(typeof({col}) = 'text' AND {col} LIKE '[%')" for col in _COLUMNS
|
|
109
|
-
)
|
|
110
|
-
row = conn.execute(f"SELECT COUNT(*) FROM {_TABLE} WHERE {clauses}").fetchone()
|
|
111
|
-
return int(row[0]) if row else 0
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
115
|
-
"""Convert every remaining text Fisher vector, in batches, resumably."""
|
|
116
|
-
existing = {r[1] for r in conn.execute(f"PRAGMA table_info({_TABLE})")}
|
|
117
|
-
missing = [c for c in _COLUMNS if c not in existing]
|
|
118
|
-
if missing:
|
|
119
|
-
logger.info("M047: %s has no %s; nothing to convert", _TABLE, missing)
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
remaining = _pending(conn)
|
|
123
|
-
if remaining == 0:
|
|
124
|
-
logger.info("M047: no Fisher vector is in the old form")
|
|
125
|
-
return
|
|
126
|
-
logger.info("M047: converting Fisher vectors on %d fact(s)", remaining)
|
|
127
|
-
|
|
128
|
-
converted = 0
|
|
129
|
-
skipped = 0
|
|
130
|
-
# Walk forward by rowid rather than re-querying "what is left". A row can
|
|
131
|
-
# legitimately still match the WHERE clause after being visited — one of its
|
|
132
|
-
# two vectors may be unreadable while the other converts — and re-selecting
|
|
133
|
-
# on the predicate alone would then hand back the same row forever.
|
|
134
|
-
cursor = 0
|
|
135
|
-
clauses = " OR ".join(
|
|
136
|
-
f"(typeof({col}) = 'text' AND {col} LIKE '[%')" for col in _COLUMNS
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
while True:
|
|
140
|
-
batch = conn.execute(
|
|
141
|
-
f"SELECT rowid, fact_id, {', '.join(_COLUMNS)} FROM {_TABLE} "
|
|
142
|
-
f"WHERE rowid > ? AND ({clauses}) ORDER BY rowid LIMIT {_BATCH}",
|
|
143
|
-
(cursor,),
|
|
144
|
-
).fetchall()
|
|
145
|
-
if not batch:
|
|
146
|
-
break
|
|
147
|
-
cursor = batch[-1][0]
|
|
148
|
-
|
|
149
|
-
updates: list[tuple[object, ...]] = []
|
|
150
|
-
for row in batch:
|
|
151
|
-
rowid, fact_id = row[0], row[1]
|
|
152
|
-
values: list[object] = []
|
|
153
|
-
changed = False
|
|
154
|
-
unreadable = False
|
|
155
|
-
# The two vectors are independent. One being unreadable is no reason
|
|
156
|
-
# to leave the other in the form that costs five times as much.
|
|
157
|
-
for offset, column in enumerate(_COLUMNS, start=2):
|
|
158
|
-
raw = row[offset]
|
|
159
|
-
if not _is_text_vector(raw):
|
|
160
|
-
values.append(raw)
|
|
161
|
-
continue
|
|
162
|
-
try:
|
|
163
|
-
values.append(_encode(raw))
|
|
164
|
-
changed = True
|
|
165
|
-
except (ValueError, TypeError, json.JSONDecodeError) as exc:
|
|
166
|
-
# A vector that cannot be parsed is left exactly as it is.
|
|
167
|
-
# Replacing it with NULL would turn "unreadable" into
|
|
168
|
-
# "absent", and absent reads as "no evidence" in the decay
|
|
169
|
-
# dynamics rather than as something to look at.
|
|
170
|
-
logger.warning(
|
|
171
|
-
"M047: leaving %s on fact %s as text — %s",
|
|
172
|
-
column, fact_id, exc,
|
|
173
|
-
)
|
|
174
|
-
values.append(raw)
|
|
175
|
-
unreadable = True
|
|
176
|
-
if unreadable:
|
|
177
|
-
skipped += 1
|
|
178
|
-
if changed:
|
|
179
|
-
updates.append((*values, rowid))
|
|
180
|
-
|
|
181
|
-
if updates:
|
|
182
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
183
|
-
try:
|
|
184
|
-
# Only write over a value that is STILL in the old form. Reading
|
|
185
|
-
# a row and writing it back later is a lost update: a live
|
|
186
|
-
# writer that recomputes this fact's vectors between the two
|
|
187
|
-
# would have its new value replaced by the old one re-encoded,
|
|
188
|
-
# silently, with no error and no retry. The typeof() guard makes
|
|
189
|
-
# the update conditional on nothing having changed underneath.
|
|
190
|
-
for column in _COLUMNS:
|
|
191
|
-
per_column = [
|
|
192
|
-
(values[_COLUMNS.index(column)], rowid)
|
|
193
|
-
for *values, rowid in updates
|
|
194
|
-
]
|
|
195
|
-
conn.executemany(
|
|
196
|
-
f"UPDATE {_TABLE} SET {column} = ? "
|
|
197
|
-
f"WHERE rowid = ? AND typeof({column}) = 'text'",
|
|
198
|
-
per_column,
|
|
199
|
-
)
|
|
200
|
-
conn.commit()
|
|
201
|
-
except Exception:
|
|
202
|
-
conn.rollback()
|
|
203
|
-
raise
|
|
204
|
-
converted += len(updates)
|
|
205
|
-
|
|
206
|
-
logger.info(
|
|
207
|
-
"M047: converted %d fact(s); left %d vector(s) as text for inspection",
|
|
208
|
-
converted, skipped,
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def repair(conn: sqlite3.Connection) -> None:
|
|
213
|
-
"""Finish the conversion on a store that has drifted back to the old form.
|
|
214
|
-
|
|
215
|
-
WHY A COMPLETED MIGRATION NEEDS THIS
|
|
216
|
-
------------------------------------
|
|
217
|
-
A long-running daemon holds its writers in memory. This migration and the
|
|
218
|
-
write-path change that stores the new form shipped in the same commit, so a
|
|
219
|
-
daemon started before that commit converts nothing and keeps writing text --
|
|
220
|
-
and the migration, run by some later short-lived process, marks itself
|
|
221
|
-
complete against a store that is still gaining old-form rows behind it.
|
|
222
|
-
|
|
223
|
-
That happened, and the numbers say so exactly: on the author's store the
|
|
224
|
-
migration completed at 08:37, the newest converted row was written at 08:08,
|
|
225
|
-
and sixteen facts written between 10:50 and 17:34 were text. The daemon had
|
|
226
|
-
been up for twenty-five hours, since before the commit existed.
|
|
227
|
-
|
|
228
|
-
Without a repair hook the framework refuses to touch a completed migration
|
|
229
|
-
and logs "schema incomplete for completed migration; automatic replay is
|
|
230
|
-
disabled" on every open. Both halves of that are wrong here -- the
|
|
231
|
-
conversion did not stop early, and disabling replay for a false alarm means
|
|
232
|
-
a migration that IS incomplete later goes unrepaired. The mechanism was
|
|
233
|
-
already there; this migration simply never supplied the hook.
|
|
234
|
-
|
|
235
|
-
``apply`` is the whole repair: every row converts independently, the read
|
|
236
|
-
path accepts both forms, and re-running finishes what is left. So this is
|
|
237
|
-
not a second implementation to keep in step -- it is the same one.
|
|
238
|
-
"""
|
|
239
|
-
apply(conn)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
243
|
-
"""Every convertible vector is converted, and the numbers still agree.
|
|
244
|
-
|
|
245
|
-
Reading a sample back and comparing it to what it replaced is the only
|
|
246
|
-
check that distinguishes a conversion from a deletion. A count of BLOBs
|
|
247
|
-
would pass just as happily on zeroed buffers.
|
|
248
|
-
"""
|
|
249
|
-
existing = {r[1] for r in conn.execute(f"PRAGMA table_info({_TABLE})")}
|
|
250
|
-
if any(c not in existing for c in _COLUMNS):
|
|
251
|
-
return True
|
|
252
|
-
|
|
253
|
-
# A row whose vector could not be parsed is left as text on purpose, so
|
|
254
|
-
# "some text remains" is not by itself a failure. What would be a failure is
|
|
255
|
-
# text that WOULD have converted — that means apply() stopped early.
|
|
256
|
-
for column in _COLUMNS:
|
|
257
|
-
leftover = conn.execute(
|
|
258
|
-
f"SELECT fact_id, {column} FROM {_TABLE} "
|
|
259
|
-
f"WHERE typeof({column}) = 'text' AND {column} LIKE '[%'"
|
|
260
|
-
).fetchall()
|
|
261
|
-
for fact_id, raw in leftover:
|
|
262
|
-
try:
|
|
263
|
-
_encode(raw)
|
|
264
|
-
except (ValueError, TypeError, json.JSONDecodeError):
|
|
265
|
-
continue # genuinely unconvertible; apply() reported it
|
|
266
|
-
logger.error(
|
|
267
|
-
"M047 verify: %s on fact %s is still text and would have "
|
|
268
|
-
"converted, so the conversion stopped early",
|
|
269
|
-
column, fact_id,
|
|
270
|
-
)
|
|
271
|
-
return False
|
|
272
|
-
|
|
273
|
-
for column in _COLUMNS:
|
|
274
|
-
sample = conn.execute(
|
|
275
|
-
f"SELECT {column} FROM {_TABLE} "
|
|
276
|
-
f"WHERE typeof({column}) = 'blob' LIMIT 50"
|
|
277
|
-
).fetchall()
|
|
278
|
-
nonzero = 0
|
|
279
|
-
for (raw,) in sample:
|
|
280
|
-
if raw is None:
|
|
281
|
-
continue
|
|
282
|
-
if len(raw) == 0 or len(raw) % 4 != 0:
|
|
283
|
-
logger.error(
|
|
284
|
-
"M047 verify: a %s buffer is %d bytes, not a float32 vector",
|
|
285
|
-
column, len(raw),
|
|
286
|
-
)
|
|
287
|
-
return False
|
|
288
|
-
values = np.frombuffer(raw, dtype=np.float32)
|
|
289
|
-
if not np.all(np.isfinite(values)):
|
|
290
|
-
logger.error("M047 verify: a %s buffer holds a non-finite value", column)
|
|
291
|
-
return False
|
|
292
|
-
if np.any(values):
|
|
293
|
-
nonzero += 1
|
|
294
|
-
if sample and nonzero == 0:
|
|
295
|
-
# EVERY sampled vector being zero is a blanket wipe wearing the
|
|
296
|
-
# right shape: the buffers are the correct length and finite, and
|
|
297
|
-
# the dynamics would read all of them as "this memory carries no
|
|
298
|
-
# evidence". One honestly-zero vector is not that, and refusing on
|
|
299
|
-
# a single one would mark the migration incomplete forever on a
|
|
300
|
-
# store that legitimately holds one.
|
|
301
|
-
logger.error(
|
|
302
|
-
"M047 verify: every sampled %s buffer is entirely zero, which "
|
|
303
|
-
"is a wipe rather than a conversion", column,
|
|
304
|
-
)
|
|
305
|
-
return False
|
|
306
|
-
return True
|
package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py
DELETED
|
@@ -1,229 +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
|
-
"""Re-read what is filed as a plan, and file the rest correctly.
|
|
6
|
-
|
|
7
|
-
M046 renamed the type used for planned events. Renaming is all it did: every
|
|
8
|
-
row that said ``temporal`` now says ``prospective``, and the contents were never
|
|
9
|
-
re-read. On a real store 869 rows carried that type and seven of them contained
|
|
10
|
-
any planning language — session summaries, records of finished work, lists of
|
|
11
|
-
commits. After the rename that same set carries a more confident name, and the
|
|
12
|
-
question a user actually asks — "what is coming up" — reads exactly that set.
|
|
13
|
-
|
|
14
|
-
So the rename needs a second half. This one re-reads each of those memories
|
|
15
|
-
under the rule that decides the question today and moves the ones that are not
|
|
16
|
-
plans to the type their wording supports.
|
|
17
|
-
|
|
18
|
-
WHY THIS ONLY DEMOTES
|
|
19
|
-
|
|
20
|
-
It never promotes. A memory filed as ordinary that turns out to read like a plan
|
|
21
|
-
is left alone, because the cost is asymmetric in the same way the classifier's
|
|
22
|
-
own tiers are: a plan filed as an ordinary memory is still found by every
|
|
23
|
-
retrieval channel, and an ordinary memory filed as a plan is the pollution this
|
|
24
|
-
exists to remove. Walking every fact in the store to look for promotions would
|
|
25
|
-
also cost a full table scan for the smaller half of the benefit.
|
|
26
|
-
|
|
27
|
-
WHY IT IS SAFE TO RE-RUN
|
|
28
|
-
|
|
29
|
-
The rule is a pure function of the text. Running it twice gives the same answer,
|
|
30
|
-
so a second pass moves nothing.
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
from __future__ import annotations
|
|
34
|
-
|
|
35
|
-
import logging
|
|
36
|
-
import contextlib
|
|
37
|
-
import sqlite3
|
|
38
|
-
from typing import Any
|
|
39
|
-
|
|
40
|
-
logger = logging.getLogger(__name__)
|
|
41
|
-
|
|
42
|
-
NAME = "M048_upcoming_holds_only_what_is_upcoming"
|
|
43
|
-
DB_TARGET = "memory"
|
|
44
|
-
|
|
45
|
-
#: No schema change and no new value — every type written here already existed.
|
|
46
|
-
BREAKING_VERSION = 0
|
|
47
|
-
|
|
48
|
-
_TABLE = "atomic_facts"
|
|
49
|
-
_PROSPECTIVE = "prospective"
|
|
50
|
-
|
|
51
|
-
#: Rows per transaction.
|
|
52
|
-
_BATCH = 500
|
|
53
|
-
|
|
54
|
-
DDL = """
|
|
55
|
-
-- No schema change. apply() re-reads the content of every fact typed
|
|
56
|
-
-- 'prospective' and demotes the ones whose wording does not describe something
|
|
57
|
-
-- still ahead.
|
|
58
|
-
"""
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def _resolve(content: str) -> str:
|
|
62
|
-
"""The type this text supports — and the question asked in the right order.
|
|
63
|
-
|
|
64
|
-
The full classifier answers "which of the four is this", and it asks about
|
|
65
|
-
opinion before it asks about plans. That is right for a new memory: "I think
|
|
66
|
-
we should ship next week" is an opinion. It is WRONG here, because this
|
|
67
|
-
migration is only deciding whether a row belongs under the plan type, and
|
|
68
|
-
"we should deploy next Tuesday" IS something coming up. Asking the full
|
|
69
|
-
classifier demoted real deadlines into opinions and they vanished from the
|
|
70
|
-
list of what is upcoming — which is the exact harm this exists to repair.
|
|
71
|
-
|
|
72
|
-
So: if it reads as a plan, it stays a plan. Only when it does not is the
|
|
73
|
-
full classifier asked where it should go instead, and its answer is taken
|
|
74
|
-
only if it is not "prospective".
|
|
75
|
-
"""
|
|
76
|
-
from superlocalmemory.encoding.fact_extractor import _classify_sentence
|
|
77
|
-
from superlocalmemory.encoding.prospective_markers import looks_prospective
|
|
78
|
-
|
|
79
|
-
text = content or ""
|
|
80
|
-
if looks_prospective(text):
|
|
81
|
-
return _PROSPECTIVE
|
|
82
|
-
resolved = _classify_sentence(text).value
|
|
83
|
-
return "semantic" if resolved == _PROSPECTIVE else resolved
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
@contextlib.contextmanager
|
|
87
|
-
def _held(conn: sqlite3.Connection):
|
|
88
|
-
"""Yield the connection the caller already owns, and leave it open."""
|
|
89
|
-
yield conn
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def apply(
|
|
93
|
-
conn: sqlite3.Connection | None = None,
|
|
94
|
-
*,
|
|
95
|
-
open_connection: Any = None,
|
|
96
|
-
) -> None:
|
|
97
|
-
"""Demote every wrongly-filed plan, in batches, resumably.
|
|
98
|
-
|
|
99
|
-
Pass ``conn`` when the caller owns the connection for the whole pass -- the
|
|
100
|
-
migration runner at startup, where nothing else is writing. Pass
|
|
101
|
-
``open_connection`` (a context manager factory, typically the database
|
|
102
|
-
manager's ``raw_connection``) on a running store: each batch then takes and
|
|
103
|
-
releases the process write lock, so a memory being saved waits one batch
|
|
104
|
-
rather than the whole pass. The batching below cannot do that on its own,
|
|
105
|
-
because holding the connection is what holds the lock.
|
|
106
|
-
"""
|
|
107
|
-
if (conn is None) == (open_connection is None):
|
|
108
|
-
raise ValueError("pass exactly one of conn or open_connection")
|
|
109
|
-
acquire = (lambda: _held(conn)) if conn is not None else open_connection
|
|
110
|
-
|
|
111
|
-
with acquire() as probe:
|
|
112
|
-
existing = {r[1] for r in probe.execute(f"PRAGMA table_info({_TABLE})")}
|
|
113
|
-
if "fact_type" not in existing or "content" not in existing:
|
|
114
|
-
logger.info("M048: %s has no fact_type/content; nothing to re-read", _TABLE)
|
|
115
|
-
return
|
|
116
|
-
|
|
117
|
-
cursor = 0
|
|
118
|
-
demoted = 0
|
|
119
|
-
kept = 0
|
|
120
|
-
while True:
|
|
121
|
-
with acquire() as active:
|
|
122
|
-
batch = active.execute(
|
|
123
|
-
f"SELECT rowid, fact_id, content FROM {_TABLE} "
|
|
124
|
-
f"WHERE rowid > ? AND fact_type = ? ORDER BY rowid LIMIT {_BATCH}",
|
|
125
|
-
(cursor, _PROSPECTIVE),
|
|
126
|
-
).fetchall()
|
|
127
|
-
if not batch:
|
|
128
|
-
break
|
|
129
|
-
cursor = batch[-1][0]
|
|
130
|
-
|
|
131
|
-
moves: list[tuple[str, int]] = []
|
|
132
|
-
for rowid, _fact_id, content in batch:
|
|
133
|
-
resolved = _resolve(content)
|
|
134
|
-
if resolved == _PROSPECTIVE:
|
|
135
|
-
kept += 1
|
|
136
|
-
continue
|
|
137
|
-
moves.append((resolved, rowid))
|
|
138
|
-
|
|
139
|
-
if moves:
|
|
140
|
-
active.execute("BEGIN IMMEDIATE")
|
|
141
|
-
try:
|
|
142
|
-
# Conditional on the row still being what was read, so a
|
|
143
|
-
# concurrent write is not clobbered.
|
|
144
|
-
changed = 0
|
|
145
|
-
for new_type, rowid in moves:
|
|
146
|
-
cur = active.execute(
|
|
147
|
-
f"UPDATE {_TABLE} SET fact_type = ? "
|
|
148
|
-
f"WHERE rowid = ? AND fact_type = '{_PROSPECTIVE}'",
|
|
149
|
-
(new_type, rowid),
|
|
150
|
-
)
|
|
151
|
-
# Count what the guard let through, not what was
|
|
152
|
-
# offered. A concurrent write can change the row
|
|
153
|
-
# underneath, and a log line that reports the intention
|
|
154
|
-
# as the outcome is how a receipt comes to overstate
|
|
155
|
-
# what happened.
|
|
156
|
-
changed += cur.rowcount if cur.rowcount and cur.rowcount > 0 else 0
|
|
157
|
-
active.commit()
|
|
158
|
-
except Exception:
|
|
159
|
-
active.rollback()
|
|
160
|
-
raise
|
|
161
|
-
demoted += changed
|
|
162
|
-
|
|
163
|
-
logger.info(
|
|
164
|
-
"M048: re-read %d memories filed as plans; %d were, %d moved",
|
|
165
|
-
demoted + kept, kept, demoted,
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
170
|
-
"""Is the end state in place: would running this pass again change nothing?
|
|
171
|
-
|
|
172
|
-
That is the question the runner asks a verify, and it is answerable exactly
|
|
173
|
-
— this pass is a pure function of the text, so its end state is its own
|
|
174
|
-
fixed point. No estimate, no threshold.
|
|
175
|
-
|
|
176
|
-
An earlier version tried to tell "the pass never ran" from "the rule got
|
|
177
|
-
sharper" by how much disagreed, and a share cannot carry that: a store with
|
|
178
|
-
nine memories, six of them real plans, sits at 33% disagreement having never
|
|
179
|
-
been touched at all. It reported success.
|
|
180
|
-
|
|
181
|
-
Drift after a rule change makes this answer False, correctly — the end state
|
|
182
|
-
under today's rule is genuinely not in place. It is not left to the runner
|
|
183
|
-
to repair, because a completed migration is never replayed: the maintenance
|
|
184
|
-
cycle re-runs the same pass, so the store converges on its own. See
|
|
185
|
-
``core/maintenance_scheduler``.
|
|
186
|
-
"""
|
|
187
|
-
existing = {r[1] for r in conn.execute(f"PRAGMA table_info({_TABLE})")}
|
|
188
|
-
if "fact_type" not in existing or "content" not in existing:
|
|
189
|
-
return True
|
|
190
|
-
|
|
191
|
-
rows = conn.execute(
|
|
192
|
-
f"SELECT fact_id, content FROM {_TABLE} WHERE fact_type = ?",
|
|
193
|
-
(_PROSPECTIVE,),
|
|
194
|
-
).fetchall()
|
|
195
|
-
if not rows:
|
|
196
|
-
return True
|
|
197
|
-
|
|
198
|
-
drifted = [
|
|
199
|
-
fact_id for fact_id, content in rows if _resolve(content) != _PROSPECTIVE
|
|
200
|
-
]
|
|
201
|
-
if drifted:
|
|
202
|
-
logger.info(
|
|
203
|
-
"M048: %d of %d memories filed as plans no longer read as one; the "
|
|
204
|
-
"maintenance cycle re-reads them", len(drifted), len(rows),
|
|
205
|
-
)
|
|
206
|
-
return False
|
|
207
|
-
return True
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
def blocks_serving(conn: sqlite3.Connection) -> bool:
|
|
211
|
-
"""Should a daemon refuse to serve while this check does not hold? No.
|
|
212
|
-
|
|
213
|
-
Nothing here is about schema. ``verify()`` reads ``content`` and compares
|
|
214
|
-
today's reading of it against the ``fact_type`` already stored, so a False
|
|
215
|
-
means some memories are filed as plans that no longer read as plans. Every
|
|
216
|
-
table and column a query needs is present either way; the store answers
|
|
217
|
-
normally, and at worst a handful of memories carry a stale label until the
|
|
218
|
-
next maintenance pass re-reads them.
|
|
219
|
-
|
|
220
|
-
The distinction matters because this is a standing guard over data that
|
|
221
|
-
ordinary use re-violates by design: a plan whose date passes stops reading
|
|
222
|
-
as upcoming, which is the rule working, not a fault. Treating that like a
|
|
223
|
-
missing table let one drifted row answer 503 on every route for as long as
|
|
224
|
-
the process lived — and because the readiness snapshot is taken once at
|
|
225
|
-
startup, the background pass that repairs the data could not lift the
|
|
226
|
-
refusal it caused. An outage produced by a quality check is worse than the
|
|
227
|
-
thing the check is for. Same reasoning as ``M043.blocks_serving``.
|
|
228
|
-
"""
|
|
229
|
-
return False
|