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,499 +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
|
-
"""Bi-temporal validity filter for the retrieval pipeline (Phase 4, T1 + T1b).
|
|
6
|
-
|
|
7
|
-
Post-retrieval filter that demotes facts whose bi-temporal validity window
|
|
8
|
-
makes them ineligible for the current recall point in time. Two independent
|
|
9
|
-
demotion axes:
|
|
10
|
-
|
|
11
|
-
**Axis 1 — Transaction-time supersession (P5-INT-01, existing):**
|
|
12
|
-
A fact whose temporal record has ``system_expired_at`` set was superseded or
|
|
13
|
-
contradicted by a newer fact (see ``invalidate_fact_temporal`` /
|
|
14
|
-
conflict-resolution supersession). Its per-channel score is multiplied by
|
|
15
|
-
``superseded_demotion_factor`` (default 0.25).
|
|
16
|
-
|
|
17
|
-
**Axis 2 — Event-time expiry (Phase 4 T1b, new):**
|
|
18
|
-
A fact whose ``valid_until`` has passed (in wall-clock time) was true in the
|
|
19
|
-
real world only up to that date. Its per-channel score is multiplied by
|
|
20
|
-
``event_time_demotion_factor`` (default 0.5, softer than supersession). A
|
|
21
|
-
separate "not-yet-valid" demotion applies when ``as_of`` is set for
|
|
22
|
-
point-in-time time-travel recall: facts whose ``valid_from > as_of`` are
|
|
23
|
-
also demoted.
|
|
24
|
-
|
|
25
|
-
**Zero-regression guarantee (default path):**
|
|
26
|
-
Almost all existing facts have ``valid_until = NULL`` (open-ended / still
|
|
27
|
-
valid). The event-time expiry lookup therefore returns an empty set on the
|
|
28
|
-
default path, so no scores change and default recall output is identical.
|
|
29
|
-
Additionally, when ``include_expired_in_history = True`` (the config default)
|
|
30
|
-
AND no explicit ``as_of`` is requested, event-time demotion is skipped
|
|
31
|
-
entirely — the guard ensures historical recall modes that intentionally want
|
|
32
|
-
to surface expired facts are unaffected.
|
|
33
|
-
|
|
34
|
-
**As-of time-travel:**
|
|
35
|
-
When ``as_of`` is packed into the filter context dict (``{"as_of": "..."}``),
|
|
36
|
-
event-time demotion is always applied regardless of
|
|
37
|
-
``include_expired_in_history``, because the caller explicitly requested a
|
|
38
|
-
point-in-time view. Facts not yet valid at ``as_of`` (``valid_from > as_of``)
|
|
39
|
-
and facts already expired at ``as_of`` (``valid_until <= as_of``, half-open) are
|
|
40
|
-
both demoted.
|
|
41
|
-
|
|
42
|
-
**Demotion priority:**
|
|
43
|
-
- System-invalidated facts: score × ``superseded_demotion_factor`` (0.25).
|
|
44
|
-
- Event-time-expired only (not system-invalidated): score × ``event_time_demotion_factor`` (0.5).
|
|
45
|
-
- Both: system-invalidated wins (the harder demotion, 0.25, is applied; event-time
|
|
46
|
-
demotion is not stacked to avoid excessive double-penalty).
|
|
47
|
-
|
|
48
|
-
All demotions are non-destructive (P5-INT-01): facts stay in the candidate
|
|
49
|
-
list but rank below valid facts. A factor of 0.0 restores the legacy hide
|
|
50
|
-
behaviour (a score of zero is gated out by the evidence floor).
|
|
51
|
-
|
|
52
|
-
All correction-admission lookups are bounded (candidate ids only), chunked,
|
|
53
|
-
and indexed. Admission is deliberately **fail-closed**: if SLM cannot prove
|
|
54
|
-
which candidates are invalidated, it returns no candidates rather than let an
|
|
55
|
-
approved stale fact re-enter recall. The legacy score-demotion filter follows
|
|
56
|
-
the same rule for its system-invalidated lookup. Event-time demotion remains a
|
|
57
|
-
best-effort ranking signal; it is not the correction authority.
|
|
58
|
-
|
|
59
|
-
Integrates with ChannelRegistry.register_filter() using the FilterFn signature:
|
|
60
|
-
(all_channel_results, profile_id, context) -> filtered_results
|
|
61
|
-
|
|
62
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
63
|
-
License: AGPL-3.0-or-later
|
|
64
|
-
"""
|
|
65
|
-
|
|
66
|
-
from __future__ import annotations
|
|
67
|
-
|
|
68
|
-
import logging
|
|
69
|
-
from dataclasses import dataclass, field
|
|
70
|
-
from typing import TYPE_CHECKING, Any
|
|
71
|
-
|
|
72
|
-
if TYPE_CHECKING:
|
|
73
|
-
from superlocalmemory.core.config import TemporalValidatorConfig
|
|
74
|
-
from superlocalmemory.retrieval.channel_registry import ChannelRegistry
|
|
75
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
76
|
-
|
|
77
|
-
logger = logging.getLogger(__name__)
|
|
78
|
-
|
|
79
|
-
# Module-level fallback for event-time demotion factor.
|
|
80
|
-
# Used when the config object does not yet carry ``event_time_demotion_factor``
|
|
81
|
-
# (e.g. older serialised configs loaded from disk). Softer than the supersession
|
|
82
|
-
# factor (0.25) because event-time expiry is a softer signal — the boundary may
|
|
83
|
-
# be approximate or the fact may still be conceptually relevant.
|
|
84
|
-
_EVENT_TIME_DEMOTION_FACTOR: float = 0.5
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
@dataclass
|
|
88
|
-
class CorrectionAdmissionCache:
|
|
89
|
-
"""Per-recall lifecycle admission cache.
|
|
90
|
-
|
|
91
|
-
The retrieval engine performs a mandatory second admission after bridge or
|
|
92
|
-
scene expansion. Facts already checked before fusion do not need a second
|
|
93
|
-
database read in the *same* recall, while any newly expanded id is checked
|
|
94
|
-
immediately. The cache never crosses requests, profiles, or DB writes.
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
checked_fact_ids: set[str] = field(default_factory=set)
|
|
98
|
-
inadmissible_fact_ids: set[str] = field(default_factory=set)
|
|
99
|
-
unavailable: bool = False
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def _normalized_as_of(as_of: str | None) -> str | None:
|
|
103
|
-
"""Normalize an optional transaction-time boundary at one boundary.
|
|
104
|
-
|
|
105
|
-
The MCP/HTTP adapters already reject invalid non-blank values. Engine
|
|
106
|
-
callers are also public, however, so an invalid direct value must degrade
|
|
107
|
-
to current recall rather than turn a read into an exception.
|
|
108
|
-
"""
|
|
109
|
-
if as_of is None:
|
|
110
|
-
return None
|
|
111
|
-
from superlocalmemory.retrieval.temporal_utils import normalize_as_of
|
|
112
|
-
return normalize_as_of(as_of)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def _invalidated_candidate_ids(
|
|
116
|
-
db: DatabaseManager,
|
|
117
|
-
fact_ids: set[str],
|
|
118
|
-
profile_id: str,
|
|
119
|
-
*,
|
|
120
|
-
as_of: str | None = None,
|
|
121
|
-
include_global: bool = False,
|
|
122
|
-
include_shared: bool = False,
|
|
123
|
-
lifecycle_cache: CorrectionAdmissionCache | None = None,
|
|
124
|
-
) -> set[str] | None:
|
|
125
|
-
"""Return correction failures, or ``None`` when admission is unprovable.
|
|
126
|
-
|
|
127
|
-
``None`` is intentionally distinct from an empty set. Callers MUST turn
|
|
128
|
-
it into an abstention (an empty candidate path), never treat it as "nothing
|
|
129
|
-
invalidated". Treating an unavailable lifecycle read as an empty set is a
|
|
130
|
-
fail-open path through which an approved stale fact can be re-admitted.
|
|
131
|
-
"""
|
|
132
|
-
if not fact_ids:
|
|
133
|
-
return set()
|
|
134
|
-
if lifecycle_cache is not None and lifecycle_cache.unavailable:
|
|
135
|
-
return None
|
|
136
|
-
unchecked = (
|
|
137
|
-
fact_ids - lifecycle_cache.checked_fact_ids
|
|
138
|
-
if lifecycle_cache is not None
|
|
139
|
-
else fact_ids
|
|
140
|
-
)
|
|
141
|
-
if not unchecked:
|
|
142
|
-
return (
|
|
143
|
-
lifecycle_cache.inadmissible_fact_ids & fact_ids
|
|
144
|
-
if lifecycle_cache is not None
|
|
145
|
-
else set()
|
|
146
|
-
)
|
|
147
|
-
try:
|
|
148
|
-
kwargs: dict[str, Any] = {"as_of": _normalized_as_of(as_of)}
|
|
149
|
-
if include_global:
|
|
150
|
-
kwargs["include_global"] = True
|
|
151
|
-
if include_shared:
|
|
152
|
-
kwargs["include_shared"] = True
|
|
153
|
-
# Do not infer support from a permissive mock's dynamic attributes.
|
|
154
|
-
# The concrete storage manager owns this optimized contract; older
|
|
155
|
-
# adapters continue through the two focused public queries below.
|
|
156
|
-
combined = getattr(type(db), "get_correction_inadmissible_fact_ids", None)
|
|
157
|
-
if callable(combined):
|
|
158
|
-
invalid = db.get_correction_inadmissible_fact_ids(
|
|
159
|
-
list(unchecked), profile_id, **kwargs,
|
|
160
|
-
)
|
|
161
|
-
else:
|
|
162
|
-
invalid = db.get_invalidated_fact_ids(list(unchecked), profile_id, **kwargs)
|
|
163
|
-
pending_successors = db.get_nonapplied_correction_successor_ids(
|
|
164
|
-
list(unchecked),
|
|
165
|
-
profile_id,
|
|
166
|
-
include_global=include_global,
|
|
167
|
-
include_shared=include_shared,
|
|
168
|
-
)
|
|
169
|
-
if not isinstance(pending_successors, set):
|
|
170
|
-
return None
|
|
171
|
-
invalid |= pending_successors
|
|
172
|
-
except Exception as exc:
|
|
173
|
-
logger.warning("Correction admission lookup failed: %s", exc)
|
|
174
|
-
if lifecycle_cache is not None:
|
|
175
|
-
lifecycle_cache.unavailable = True
|
|
176
|
-
return None
|
|
177
|
-
if not isinstance(invalid, set):
|
|
178
|
-
if lifecycle_cache is not None:
|
|
179
|
-
lifecycle_cache.unavailable = True
|
|
180
|
-
return None
|
|
181
|
-
if lifecycle_cache is not None:
|
|
182
|
-
lifecycle_cache.checked_fact_ids.update(unchecked)
|
|
183
|
-
lifecycle_cache.inadmissible_fact_ids.update(invalid)
|
|
184
|
-
return lifecycle_cache.inadmissible_fact_ids & fact_ids
|
|
185
|
-
return invalid
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def _strict_temporal_candidate_ids(
|
|
189
|
-
db: DatabaseManager,
|
|
190
|
-
fact_ids: set[str],
|
|
191
|
-
profile_id: str,
|
|
192
|
-
*,
|
|
193
|
-
known_as_of: str | None = None,
|
|
194
|
-
valid_at: str | None = None,
|
|
195
|
-
include_unknown: bool = False,
|
|
196
|
-
include_global: bool = False,
|
|
197
|
-
include_shared: bool = False,
|
|
198
|
-
) -> set[str] | None:
|
|
199
|
-
"""Return strict two-clock failures, or ``None`` when admission is unprovable."""
|
|
200
|
-
if not fact_ids or (known_as_of is None and valid_at is None):
|
|
201
|
-
return set()
|
|
202
|
-
try:
|
|
203
|
-
invalid = db.get_strict_temporal_inadmissible_fact_ids(
|
|
204
|
-
list(fact_ids), profile_id,
|
|
205
|
-
known_as_of=_normalized_as_of(known_as_of),
|
|
206
|
-
valid_at=_normalized_as_of(valid_at),
|
|
207
|
-
include_unknown=include_unknown,
|
|
208
|
-
include_global=include_global,
|
|
209
|
-
include_shared=include_shared,
|
|
210
|
-
)
|
|
211
|
-
except Exception as exc:
|
|
212
|
-
logger.warning("Strict temporal admission lookup failed: %s", exc)
|
|
213
|
-
return None
|
|
214
|
-
return invalid if isinstance(invalid, set) else None
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
def _abstain_candidates(
|
|
218
|
-
all_results: dict[str, list[tuple[str, float]]],
|
|
219
|
-
*,
|
|
220
|
-
stage: str,
|
|
221
|
-
) -> dict[str, list[tuple[str, float]]]:
|
|
222
|
-
"""Fail closed without changing the retrieval filter public contract.
|
|
223
|
-
|
|
224
|
-
``ChannelRegistry`` and the retrieval engine both expect the original
|
|
225
|
-
channel-result shape. Returning the same channel names with empty lists
|
|
226
|
-
is an explicit candidate-level abstention: downstream fusion naturally
|
|
227
|
-
produces no materializable facts, while callers keep their stable response
|
|
228
|
-
schema and can report ``no_confident_match``.
|
|
229
|
-
"""
|
|
230
|
-
logger.error(
|
|
231
|
-
"Temporal correction admission unavailable at %s; abstaining from recall candidates",
|
|
232
|
-
stage,
|
|
233
|
-
)
|
|
234
|
-
return {channel_name: [] for channel_name in all_results}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
def admit_correction_candidates(
|
|
238
|
-
all_results: dict[str, list[tuple[str, float]]],
|
|
239
|
-
profile_id: str,
|
|
240
|
-
db: DatabaseManager,
|
|
241
|
-
*,
|
|
242
|
-
as_of: str | None = None,
|
|
243
|
-
known_as_of: str | None = None,
|
|
244
|
-
valid_at: str | None = None,
|
|
245
|
-
include_unknown: bool = False,
|
|
246
|
-
include_global: bool = False,
|
|
247
|
-
include_shared: bool = False,
|
|
248
|
-
lifecycle_cache: CorrectionAdmissionCache | None = None,
|
|
249
|
-
) -> dict[str, list[tuple[str, float]]]:
|
|
250
|
-
"""Hard-exclude system-superseded facts before candidate fusion.
|
|
251
|
-
|
|
252
|
-
This is the SLM 4.0.2 Brain Core admission invariant. Ranking is unable to
|
|
253
|
-
enforce a correction because a high-scoring stale fact can still win. The
|
|
254
|
-
historical ``as_of`` boundary preserves facts that had not yet been
|
|
255
|
-
superseded at that point, so current corrections do not rewrite history.
|
|
256
|
-
"""
|
|
257
|
-
fact_ids = {
|
|
258
|
-
fact_id
|
|
259
|
-
for channel_results in all_results.values()
|
|
260
|
-
for fact_id, _ in channel_results
|
|
261
|
-
}
|
|
262
|
-
invalid = _invalidated_candidate_ids(
|
|
263
|
-
db, fact_ids, profile_id, as_of=as_of,
|
|
264
|
-
include_global=include_global, include_shared=include_shared,
|
|
265
|
-
lifecycle_cache=lifecycle_cache,
|
|
266
|
-
)
|
|
267
|
-
if invalid is None:
|
|
268
|
-
return _abstain_candidates(all_results, stage="pre_fusion.lifecycle")
|
|
269
|
-
strict = _strict_temporal_candidate_ids(
|
|
270
|
-
db, fact_ids, profile_id,
|
|
271
|
-
known_as_of=known_as_of, valid_at=valid_at,
|
|
272
|
-
include_unknown=include_unknown,
|
|
273
|
-
include_global=include_global, include_shared=include_shared,
|
|
274
|
-
)
|
|
275
|
-
if strict is None:
|
|
276
|
-
return _abstain_candidates(all_results, stage="pre_fusion.strict_temporal")
|
|
277
|
-
if strict:
|
|
278
|
-
invalid |= strict
|
|
279
|
-
if not invalid:
|
|
280
|
-
return all_results
|
|
281
|
-
return {
|
|
282
|
-
channel_name: [
|
|
283
|
-
(fact_id, score)
|
|
284
|
-
for fact_id, score in channel_results
|
|
285
|
-
if fact_id not in invalid
|
|
286
|
-
]
|
|
287
|
-
for channel_name, channel_results in all_results.items()
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
def admit_correction_fusion_results(
|
|
292
|
-
fused_results: list[Any],
|
|
293
|
-
profile_id: str,
|
|
294
|
-
db: DatabaseManager,
|
|
295
|
-
*,
|
|
296
|
-
as_of: str | None = None,
|
|
297
|
-
known_as_of: str | None = None,
|
|
298
|
-
valid_at: str | None = None,
|
|
299
|
-
include_unknown: bool = False,
|
|
300
|
-
include_global: bool = False,
|
|
301
|
-
include_shared: bool = False,
|
|
302
|
-
lifecycle_cache: CorrectionAdmissionCache | None = None,
|
|
303
|
-
) -> list[Any]:
|
|
304
|
-
"""Re-apply correction admission after graph/scene candidate expansion."""
|
|
305
|
-
fact_ids = {result.fact_id for result in fused_results}
|
|
306
|
-
invalid = _invalidated_candidate_ids(
|
|
307
|
-
db, fact_ids, profile_id, as_of=as_of,
|
|
308
|
-
include_global=include_global, include_shared=include_shared,
|
|
309
|
-
lifecycle_cache=lifecycle_cache,
|
|
310
|
-
)
|
|
311
|
-
if invalid is None:
|
|
312
|
-
logger.error(
|
|
313
|
-
"Temporal correction admission unavailable at post_fusion.lifecycle; "
|
|
314
|
-
"abstaining from recall candidates",
|
|
315
|
-
)
|
|
316
|
-
return []
|
|
317
|
-
strict = _strict_temporal_candidate_ids(
|
|
318
|
-
db, fact_ids, profile_id,
|
|
319
|
-
known_as_of=known_as_of, valid_at=valid_at,
|
|
320
|
-
include_unknown=include_unknown,
|
|
321
|
-
include_global=include_global, include_shared=include_shared,
|
|
322
|
-
)
|
|
323
|
-
if strict is None:
|
|
324
|
-
logger.error(
|
|
325
|
-
"Temporal correction admission unavailable at post_fusion.strict_temporal; "
|
|
326
|
-
"abstaining from recall candidates",
|
|
327
|
-
)
|
|
328
|
-
return []
|
|
329
|
-
if strict:
|
|
330
|
-
invalid |= strict
|
|
331
|
-
if not invalid:
|
|
332
|
-
return fused_results
|
|
333
|
-
return [result for result in fused_results if result.fact_id not in invalid]
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
class TemporalValidityFilter:
|
|
337
|
-
"""Demotes bi-temporally invalid facts in retrieval candidates.
|
|
338
|
-
|
|
339
|
-
Two demotion axes:
|
|
340
|
-
- Axis 1: system-invalidated (superseded) facts — existing behaviour.
|
|
341
|
-
- Axis 2: event-time-expired facts — new in Phase 4 T1b.
|
|
342
|
-
|
|
343
|
-
Both are non-destructive: facts stay recallable but rank below valid ones.
|
|
344
|
-
"""
|
|
345
|
-
|
|
346
|
-
__slots__ = (
|
|
347
|
-
"_db",
|
|
348
|
-
"_demotion_factor",
|
|
349
|
-
"_event_time_factor",
|
|
350
|
-
"_include_expired_in_history",
|
|
351
|
-
)
|
|
352
|
-
|
|
353
|
-
def __init__(
|
|
354
|
-
self,
|
|
355
|
-
db: DatabaseManager,
|
|
356
|
-
demotion_factor: float = 0.25,
|
|
357
|
-
event_time_factor: float = _EVENT_TIME_DEMOTION_FACTOR,
|
|
358
|
-
include_expired_in_history: bool = True,
|
|
359
|
-
) -> None:
|
|
360
|
-
self._db = db
|
|
361
|
-
# Clamp to [0, 1]. 0.0 = legacy hide; 1.0 = no demotion.
|
|
362
|
-
self._demotion_factor = max(0.0, min(1.0, float(demotion_factor)))
|
|
363
|
-
self._event_time_factor = max(0.0, min(1.0, float(event_time_factor)))
|
|
364
|
-
self._include_expired_in_history = bool(include_expired_in_history)
|
|
365
|
-
|
|
366
|
-
def filter(
|
|
367
|
-
self,
|
|
368
|
-
all_results: dict[str, list[tuple[str, float]]],
|
|
369
|
-
profile_id: str,
|
|
370
|
-
context: Any,
|
|
371
|
-
) -> dict[str, list[tuple[str, float]]]:
|
|
372
|
-
"""Demote bi-temporally invalid fact_ids in every channel's candidate list.
|
|
373
|
-
|
|
374
|
-
Matches FilterFn signature from channel_registry.py.
|
|
375
|
-
|
|
376
|
-
Args:
|
|
377
|
-
all_results: Channel name -> [(fact_id, score)] dict.
|
|
378
|
-
profile_id: Current profile.
|
|
379
|
-
context: Optional dict that may carry ``as_of`` (ISO 8601 string)
|
|
380
|
-
for point-in-time time-travel recall. None or any non-dict value
|
|
381
|
-
means "current time, no time-travel" — the default path.
|
|
382
|
-
|
|
383
|
-
Returns:
|
|
384
|
-
A new dict where invalid facts keep their channel presence but have
|
|
385
|
-
their score scaled by the appropriate demotion factor and the channel
|
|
386
|
-
lists re-sorted so valid facts rank above them. Inputs are never
|
|
387
|
-
mutated (immutability contract). Returns the input unchanged when
|
|
388
|
-
nothing is invalid (fast path).
|
|
389
|
-
"""
|
|
390
|
-
# Collect all unique candidate fact_ids across every channel.
|
|
391
|
-
all_fact_ids: set[str] = set()
|
|
392
|
-
for channel_results in all_results.values():
|
|
393
|
-
for fact_id, _ in channel_results:
|
|
394
|
-
all_fact_ids.add(fact_id)
|
|
395
|
-
|
|
396
|
-
if not all_fact_ids:
|
|
397
|
-
return all_results
|
|
398
|
-
|
|
399
|
-
# Extract as_of FIRST — needed for both Axis 1 and Axis 2. Must happen
|
|
400
|
-
# before any DB call so as_of is available for transaction-time gating.
|
|
401
|
-
# None context = legacy/default; non-dict = upstream caller without
|
|
402
|
-
# as_of support. Both treated as "no time-travel, current time".
|
|
403
|
-
as_of: str | None = (
|
|
404
|
-
context.get("as_of") if isinstance(context, dict) else None
|
|
405
|
-
)
|
|
406
|
-
# UTC-normalize at the filter boundary to guarantee format consistency
|
|
407
|
-
# before forwarding to DB comparisons.
|
|
408
|
-
if as_of is not None:
|
|
409
|
-
from superlocalmemory.retrieval.temporal_utils import normalize_as_of
|
|
410
|
-
as_of = normalize_as_of(as_of)
|
|
411
|
-
# normalize_as_of returns None on invalid input; treat as no as_of.
|
|
412
|
-
|
|
413
|
-
# --- Axis 1: Transaction-time supersession ---
|
|
414
|
-
# When as_of is set: only supersessions that occurred AT OR BEFORE
|
|
415
|
-
# as_of contribute (Phase 4b bi-temporal fix). Supersessions after
|
|
416
|
-
# as_of are invisible — the fact was still valid at the query point.
|
|
417
|
-
invalid = _invalidated_candidate_ids(
|
|
418
|
-
self._db, all_fact_ids, profile_id, as_of=as_of,
|
|
419
|
-
)
|
|
420
|
-
if invalid is None:
|
|
421
|
-
return _abstain_candidates(all_results, stage="legacy_filter.lifecycle")
|
|
422
|
-
|
|
423
|
-
# --- Axis 2: Event-time expiry (Phase 4 T1b) ---
|
|
424
|
-
# Guard: skip event-time demotion when the caller signals it wants
|
|
425
|
-
# historical / all-expired-included mode AND no explicit as_of point
|
|
426
|
-
# is requested. Config default is include_expired_in_history=True,
|
|
427
|
-
# so the default recall path always takes this skip branch — the two
|
|
428
|
-
# new DB calls are never made, and no scores change.
|
|
429
|
-
apply_event_time = (as_of is not None) or (not self._include_expired_in_history)
|
|
430
|
-
|
|
431
|
-
event_expired: set[str] = set()
|
|
432
|
-
if apply_event_time:
|
|
433
|
-
try:
|
|
434
|
-
event_expired = self._db.get_event_time_expired_fact_ids(
|
|
435
|
-
list(all_fact_ids), profile_id, as_of=as_of,
|
|
436
|
-
)
|
|
437
|
-
except Exception as exc:
|
|
438
|
-
# Fail-open: continue with empty event_expired set.
|
|
439
|
-
logger.warning("Event-time expiry lookup failed: %s", exc)
|
|
440
|
-
|
|
441
|
-
# Fast path: nothing to demote — return input unchanged.
|
|
442
|
-
if not invalid and not event_expired:
|
|
443
|
-
return all_results
|
|
444
|
-
|
|
445
|
-
system_factor = self._demotion_factor
|
|
446
|
-
event_factor = self._event_time_factor
|
|
447
|
-
# event_time_only: expired by event-time but NOT system-invalidated.
|
|
448
|
-
# System-invalid already carries the harder demotion (0.25 < 0.5).
|
|
449
|
-
# We do not stack both factors to avoid excessive double-penalty.
|
|
450
|
-
event_time_only = event_expired - invalid
|
|
451
|
-
|
|
452
|
-
demoted: dict[str, list[tuple[str, float]]] = {}
|
|
453
|
-
for channel_name, channel_results in all_results.items():
|
|
454
|
-
new_list = [
|
|
455
|
-
(fact_id,
|
|
456
|
-
score * system_factor if fact_id in invalid
|
|
457
|
-
else score * event_factor if fact_id in event_time_only
|
|
458
|
-
else score)
|
|
459
|
-
for fact_id, score in channel_results
|
|
460
|
-
]
|
|
461
|
-
# Re-sort descending so demoted facts fall below currently-valid
|
|
462
|
-
# facts in this channel's rank order.
|
|
463
|
-
new_list.sort(key=lambda pair: (-pair[1], pair[0]))
|
|
464
|
-
demoted[channel_name] = new_list
|
|
465
|
-
return demoted
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
def register_temporal_validity_filter(
|
|
469
|
-
registry: ChannelRegistry,
|
|
470
|
-
db: DatabaseManager,
|
|
471
|
-
config: TemporalValidatorConfig,
|
|
472
|
-
) -> None:
|
|
473
|
-
"""Register the bi-temporal validity filter into the channel registry.
|
|
474
|
-
|
|
475
|
-
Does nothing if config.enabled is False.
|
|
476
|
-
|
|
477
|
-
Reads ``event_time_demotion_factor`` from the config with a fallback to the
|
|
478
|
-
module constant ``_EVENT_TIME_DEMOTION_FACTOR`` (0.5) so older serialised
|
|
479
|
-
configs without this field work without a migration.
|
|
480
|
-
|
|
481
|
-
Args:
|
|
482
|
-
registry: Channel registry to register with.
|
|
483
|
-
db: Database manager for validity queries.
|
|
484
|
-
config: Temporal-validator configuration.
|
|
485
|
-
"""
|
|
486
|
-
if not getattr(config, "enabled", True):
|
|
487
|
-
return
|
|
488
|
-
factor = getattr(config, "superseded_demotion_factor", 0.25)
|
|
489
|
-
event_time_factor = getattr(
|
|
490
|
-
config, "event_time_demotion_factor", _EVENT_TIME_DEMOTION_FACTOR,
|
|
491
|
-
)
|
|
492
|
-
include_expired_in_history = getattr(config, "include_expired_in_history", True)
|
|
493
|
-
f = TemporalValidityFilter(
|
|
494
|
-
db,
|
|
495
|
-
demotion_factor=factor,
|
|
496
|
-
event_time_factor=event_time_factor,
|
|
497
|
-
include_expired_in_history=include_expired_in_history,
|
|
498
|
-
)
|
|
499
|
-
registry.register_filter(f.filter)
|
|
@@ -1,181 +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
|
-
"""Time-window parsing + membership for recall (Phase 4, T-window).
|
|
6
|
-
|
|
7
|
-
Pure, dependency-free helpers so recall() can prune candidates to an
|
|
8
|
-
event-time range. Two window forms are accepted:
|
|
9
|
-
|
|
10
|
-
* relative string — ``"1h" | "24h" | "7d" | "30d" | "90d" | "1y"`` etc.
|
|
11
|
-
(``<int><unit>`` where unit is h/d/w/m/y; m≈30d, y≈365d) → ``[now-Δ, now]``.
|
|
12
|
-
* explicit range — ``(start_iso, end_iso)`` two-tuple of timestamps.
|
|
13
|
-
|
|
14
|
-
Timestamps are parsed tolerantly: SQLite ``datetime('now')`` form
|
|
15
|
-
(``"YYYY-MM-DD HH:MM:SS"``), ISO-8601 with ``T`` and/or trailing ``Z``, and
|
|
16
|
-
date-only ``"YYYY-MM-DD"`` are all accepted. Comparing the *strings* would be
|
|
17
|
-
wrong (a space sorts before ``T``), so everything is parsed to tz-aware UTC
|
|
18
|
-
datetimes before comparison — never lexicographic.
|
|
19
|
-
|
|
20
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
21
|
-
License: AGPL-3.0-or-later
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
from __future__ import annotations
|
|
25
|
-
|
|
26
|
-
import re
|
|
27
|
-
from datetime import datetime, timedelta, timezone
|
|
28
|
-
|
|
29
|
-
__all__ = [
|
|
30
|
-
"parse_timestamp",
|
|
31
|
-
"parse_window",
|
|
32
|
-
"in_window",
|
|
33
|
-
"infer_window_from_query",
|
|
34
|
-
]
|
|
35
|
-
|
|
36
|
-
_REL = re.compile(r"^\s*(\d+)\s*([hdwmy])\s*$", re.IGNORECASE)
|
|
37
|
-
|
|
38
|
-
# Hours per unit. Month and year are documented approximations.
|
|
39
|
-
_UNIT_HOURS: dict[str, int] = {
|
|
40
|
-
"h": 1,
|
|
41
|
-
"d": 24,
|
|
42
|
-
"w": 24 * 7,
|
|
43
|
-
"m": 24 * 30,
|
|
44
|
-
"y": 24 * 365,
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def parse_timestamp(value: str | None) -> datetime | None:
|
|
49
|
-
"""Parse a stored timestamp into a tz-aware UTC datetime, or None.
|
|
50
|
-
|
|
51
|
-
Accepts SQLite ``datetime('now')`` (space-separated), ISO-8601 (``T`` and
|
|
52
|
-
optional ``Z``), and date-only strings. Naive values are assumed UTC.
|
|
53
|
-
"""
|
|
54
|
-
if not value or not isinstance(value, str):
|
|
55
|
-
return None
|
|
56
|
-
text = value.strip()
|
|
57
|
-
if not text:
|
|
58
|
-
return None
|
|
59
|
-
if text.endswith(("Z", "z")):
|
|
60
|
-
text = text[:-1] + "+00:00"
|
|
61
|
-
dt: datetime | None = None
|
|
62
|
-
try:
|
|
63
|
-
dt = datetime.fromisoformat(text)
|
|
64
|
-
except ValueError:
|
|
65
|
-
# Fall back to a date-only prefix (e.g. "2026-03-15 ...").
|
|
66
|
-
try:
|
|
67
|
-
dt = datetime.fromisoformat(text[:10])
|
|
68
|
-
except ValueError:
|
|
69
|
-
return None
|
|
70
|
-
if dt.tzinfo is None:
|
|
71
|
-
dt = dt.replace(tzinfo=timezone.utc)
|
|
72
|
-
return dt.astimezone(timezone.utc)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def parse_window(
|
|
76
|
-
window: str | tuple[str, str] | list | None,
|
|
77
|
-
now: datetime | None = None,
|
|
78
|
-
) -> tuple[datetime, datetime] | None:
|
|
79
|
-
"""Resolve a window spec to a ``(start, end)`` UTC datetime pair, or None.
|
|
80
|
-
|
|
81
|
-
Returns None when the spec is None or unparseable (caller then applies no
|
|
82
|
-
time filter — additive, fail-open).
|
|
83
|
-
"""
|
|
84
|
-
if window is None:
|
|
85
|
-
return None
|
|
86
|
-
_now = now or datetime.now(timezone.utc)
|
|
87
|
-
if _now.tzinfo is None:
|
|
88
|
-
_now = _now.replace(tzinfo=timezone.utc)
|
|
89
|
-
|
|
90
|
-
# Explicit (start, end) range.
|
|
91
|
-
if isinstance(window, (tuple, list)):
|
|
92
|
-
if len(window) != 2:
|
|
93
|
-
return None
|
|
94
|
-
start = parse_timestamp(window[0])
|
|
95
|
-
end = parse_timestamp(window[1])
|
|
96
|
-
if start is None or end is None:
|
|
97
|
-
return None
|
|
98
|
-
return (start, end) if start <= end else (end, start)
|
|
99
|
-
|
|
100
|
-
# String forms: relative "<int><unit>" or an explicit range written as
|
|
101
|
-
# "start..end" / "start,end" (so it survives URL params, JSON, and CLI args
|
|
102
|
-
# as a single value — no tuple serialization needed on the wire).
|
|
103
|
-
if isinstance(window, str):
|
|
104
|
-
m = _REL.match(window)
|
|
105
|
-
if m:
|
|
106
|
-
n = int(m.group(1))
|
|
107
|
-
unit = m.group(2).lower()
|
|
108
|
-
hours = n * _UNIT_HOURS[unit]
|
|
109
|
-
return (_now - timedelta(hours=hours), _now)
|
|
110
|
-
for sep in ("..", ","):
|
|
111
|
-
if sep in window:
|
|
112
|
-
left, _, right = window.partition(sep)
|
|
113
|
-
start = parse_timestamp(left)
|
|
114
|
-
end = parse_timestamp(right)
|
|
115
|
-
if start is None or end is None:
|
|
116
|
-
return None
|
|
117
|
-
return (start, end) if start <= end else (end, start)
|
|
118
|
-
|
|
119
|
-
return None
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
# Natural-language temporal-scope patterns → relative window spec. Ordered:
|
|
123
|
-
# more specific ("last 3 weeks") is matched before generic ("last week").
|
|
124
|
-
_UNIT_TO_SPEC = {"day": "d", "week": "w", "month": "m", "year": "y"}
|
|
125
|
-
_QUERY_N_UNIT = re.compile(
|
|
126
|
-
r"\b(?:last|past|previous|prior)\s+(\d{1,3})\s+(day|week|month|year)s?\b",
|
|
127
|
-
re.IGNORECASE,
|
|
128
|
-
)
|
|
129
|
-
_QUERY_PHRASES: tuple[tuple[re.Pattern[str], str], ...] = (
|
|
130
|
-
(re.compile(r"\btoday\b", re.IGNORECASE), "1d"),
|
|
131
|
-
(re.compile(r"\byesterday\b", re.IGNORECASE), "2d"),
|
|
132
|
-
(re.compile(r"\b(?:this|last|past|previous)\s+week\b", re.IGNORECASE), "7d"),
|
|
133
|
-
(re.compile(r"\b(?:this|last|past|previous)\s+month\b", re.IGNORECASE), "30d"),
|
|
134
|
-
(re.compile(r"\b(?:this|last|past|previous)\s+year\b", re.IGNORECASE), "1y"),
|
|
135
|
-
(re.compile(r"\b(?:recent|recently|lately)\b", re.IGNORECASE), "30d"),
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def infer_window_from_query(query: str | None) -> str | None:
|
|
140
|
-
"""Infer a relative time window from natural-language scope in a query.
|
|
141
|
-
|
|
142
|
-
Recognises a small, unambiguous set of temporal-scope phrases ("yesterday",
|
|
143
|
-
"last week", "past 3 months", "recently") and maps them to a relative
|
|
144
|
-
window spec ("2d", "7d", "3m", …) that ``parse_window`` understands. Returns
|
|
145
|
-
None when no clear temporal scope is present, so recall applies no window.
|
|
146
|
-
|
|
147
|
-
Deliberately conservative — only fires on explicit scope words, never on
|
|
148
|
-
bare content — so it augments, never surprises. Callers use it only when the
|
|
149
|
-
user did not pass an explicit window.
|
|
150
|
-
"""
|
|
151
|
-
if not query or not isinstance(query, str):
|
|
152
|
-
return None
|
|
153
|
-
m = _QUERY_N_UNIT.search(query)
|
|
154
|
-
if m:
|
|
155
|
-
n = int(m.group(1))
|
|
156
|
-
unit = _UNIT_TO_SPEC.get(m.group(2).lower())
|
|
157
|
-
if unit and n > 0:
|
|
158
|
-
return f"{n}{unit}"
|
|
159
|
-
for pattern, spec in _QUERY_PHRASES:
|
|
160
|
-
if pattern.search(query):
|
|
161
|
-
return spec
|
|
162
|
-
return None
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def in_window(
|
|
166
|
-
event_time: str | None,
|
|
167
|
-
bounds: tuple[datetime, datetime] | None,
|
|
168
|
-
) -> bool:
|
|
169
|
-
"""True if ``event_time`` falls within ``bounds`` (inclusive).
|
|
170
|
-
|
|
171
|
-
No bounds → always True (no filtering). An unparseable/missing event time
|
|
172
|
-
is excluded (conservative: a windowed query returns only datable facts in
|
|
173
|
-
range).
|
|
174
|
-
"""
|
|
175
|
-
if bounds is None:
|
|
176
|
-
return True
|
|
177
|
-
dt = parse_timestamp(event_time)
|
|
178
|
-
if dt is None:
|
|
179
|
-
return False
|
|
180
|
-
start, end = bounds
|
|
181
|
-
return start <= dt <= end
|