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,200 +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
|
-
"""Summarizer — Mode A heuristic + Mode B Ollama + Mode C OpenRouter.
|
|
6
|
-
|
|
7
|
-
Generates cluster summaries and search synthesis. All LLM failures
|
|
8
|
-
fall back to heuristic silently — never crashes the caller.
|
|
9
|
-
|
|
10
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
import logging
|
|
16
|
-
import os
|
|
17
|
-
import re
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class Summarizer:
|
|
23
|
-
"""Generate summaries using heuristic or LLM based on mode."""
|
|
24
|
-
|
|
25
|
-
def __init__(self, config) -> None:
|
|
26
|
-
self._config = config
|
|
27
|
-
self._mode = config.mode.value if hasattr(config.mode, 'value') else str(config.mode)
|
|
28
|
-
|
|
29
|
-
# ------------------------------------------------------------------
|
|
30
|
-
# Public API
|
|
31
|
-
# ------------------------------------------------------------------
|
|
32
|
-
|
|
33
|
-
def summarize_cluster(self, members: list[dict]) -> str:
|
|
34
|
-
"""Generate a human-readable cluster summary.
|
|
35
|
-
|
|
36
|
-
Args:
|
|
37
|
-
members: List of dicts with 'content' key.
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
Summary string (2-3 sentences).
|
|
41
|
-
"""
|
|
42
|
-
texts = [m.get("content", "") for m in members if m.get("content")]
|
|
43
|
-
if not texts:
|
|
44
|
-
return "Empty cluster."
|
|
45
|
-
if self._mode in ("b", "c") and self._has_llm():
|
|
46
|
-
try:
|
|
47
|
-
prompt = self._cluster_prompt(texts[:10])
|
|
48
|
-
return self._call_llm(prompt, max_tokens=150)
|
|
49
|
-
except Exception as exc:
|
|
50
|
-
logger.warning("LLM cluster summary failed, using heuristic: %s", exc)
|
|
51
|
-
return self._heuristic_summary(texts[:5])
|
|
52
|
-
|
|
53
|
-
def synthesize_answer(self, query: str, facts: list[dict]) -> str:
|
|
54
|
-
"""Generate a synthesized answer from query + retrieved facts.
|
|
55
|
-
|
|
56
|
-
Returns empty string in Mode A (no LLM available).
|
|
57
|
-
"""
|
|
58
|
-
if self._mode == "a" or not self._has_llm():
|
|
59
|
-
return ""
|
|
60
|
-
texts = [f.get("content", "") for f in facts if f.get("content")]
|
|
61
|
-
if not texts:
|
|
62
|
-
return ""
|
|
63
|
-
try:
|
|
64
|
-
prompt = self._synthesis_prompt(query, texts[:8])
|
|
65
|
-
return self._call_llm(prompt, max_tokens=250)
|
|
66
|
-
except Exception as exc:
|
|
67
|
-
logger.warning("LLM synthesis failed: %s", exc)
|
|
68
|
-
return ""
|
|
69
|
-
|
|
70
|
-
# ------------------------------------------------------------------
|
|
71
|
-
# Heuristic (Mode A — always available)
|
|
72
|
-
# ------------------------------------------------------------------
|
|
73
|
-
|
|
74
|
-
def _heuristic_summary(self, texts: list[str]) -> str:
|
|
75
|
-
"""First sentence from top-3 texts, joined."""
|
|
76
|
-
sentences = []
|
|
77
|
-
for text in texts[:3]:
|
|
78
|
-
first = self._first_sentence(text)
|
|
79
|
-
if first and first not in sentences:
|
|
80
|
-
sentences.append(first)
|
|
81
|
-
return " ".join(sentences)[:300] if sentences else "No summary available."
|
|
82
|
-
|
|
83
|
-
@staticmethod
|
|
84
|
-
def _first_sentence(text: str) -> str:
|
|
85
|
-
"""Extract first sentence (up to period, question mark, or 100 chars)."""
|
|
86
|
-
text = text.strip()
|
|
87
|
-
match = re.match(r'^(.+?[.!?])\s', text)
|
|
88
|
-
if match:
|
|
89
|
-
return match.group(1).strip()
|
|
90
|
-
return text[:100].strip()
|
|
91
|
-
|
|
92
|
-
# ------------------------------------------------------------------
|
|
93
|
-
# LLM calls (Mode B/C)
|
|
94
|
-
# ------------------------------------------------------------------
|
|
95
|
-
|
|
96
|
-
def _has_llm(self) -> bool:
|
|
97
|
-
"""Check if LLM is available.
|
|
98
|
-
|
|
99
|
-
Mode B: Ollama assumed running (num_ctx: 4096 caps memory at 5.5 GB).
|
|
100
|
-
Mode C: Requires API key for cloud provider.
|
|
101
|
-
"""
|
|
102
|
-
if self._mode == "b":
|
|
103
|
-
return True
|
|
104
|
-
if self._mode == "c":
|
|
105
|
-
return bool(
|
|
106
|
-
os.environ.get("OPENROUTER_API_KEY")
|
|
107
|
-
or getattr(self._config.llm, 'api_key', None)
|
|
108
|
-
)
|
|
109
|
-
return False
|
|
110
|
-
|
|
111
|
-
def _call_llm(self, prompt: str, max_tokens: int = 200) -> str:
|
|
112
|
-
"""Route to Ollama (B) or OpenRouter (C)."""
|
|
113
|
-
if self._mode == "b":
|
|
114
|
-
return self._call_ollama(prompt, max_tokens)
|
|
115
|
-
return self._call_openrouter(prompt, max_tokens)
|
|
116
|
-
|
|
117
|
-
def _call_ollama(self, prompt: str, max_tokens: int = 200) -> str:
|
|
118
|
-
"""Call local Ollama for summary generation.
|
|
119
|
-
|
|
120
|
-
CRITICAL: num_ctx MUST be set. Without it, Ollama defaults to the
|
|
121
|
-
model's native context (128K for llama3.1) which allocates ~30 GB
|
|
122
|
-
of KV cache — fatal on machines with ≤32 GB RAM.
|
|
123
|
-
SLM prompts are <500 tokens; 4096 context is more than enough.
|
|
124
|
-
"""
|
|
125
|
-
import httpx
|
|
126
|
-
model = getattr(self._config.llm, 'model', None) or "llama3.1:8b"
|
|
127
|
-
# v3.6.12 (modeb-2): honor the configured endpoint instead of hardcoding
|
|
128
|
-
# localhost:11434, so a remote/non-default Ollama host works in Mode B.
|
|
129
|
-
_base = (getattr(self._config.llm, 'api_base', '') or "http://localhost:11434").rstrip("/")
|
|
130
|
-
with httpx.Client(timeout=httpx.Timeout(30.0)) as client:
|
|
131
|
-
resp = client.post(f"{_base}/api/generate", json={
|
|
132
|
-
"model": model,
|
|
133
|
-
"prompt": prompt,
|
|
134
|
-
"stream": False,
|
|
135
|
-
"keep_alive": "30s",
|
|
136
|
-
"options": {
|
|
137
|
-
"num_predict": max_tokens,
|
|
138
|
-
"temperature": 0.3,
|
|
139
|
-
"num_ctx": 4096,
|
|
140
|
-
},
|
|
141
|
-
})
|
|
142
|
-
resp.raise_for_status()
|
|
143
|
-
return resp.json().get("response", "").strip()
|
|
144
|
-
|
|
145
|
-
def _call_openrouter(self, prompt: str, max_tokens: int = 200) -> str:
|
|
146
|
-
"""Call OpenRouter API for summary generation."""
|
|
147
|
-
import httpx
|
|
148
|
-
api_key = (
|
|
149
|
-
os.environ.get("OPENROUTER_API_KEY")
|
|
150
|
-
or getattr(self._config.llm, 'api_key', None)
|
|
151
|
-
)
|
|
152
|
-
if not api_key:
|
|
153
|
-
raise RuntimeError("No OpenRouter API key")
|
|
154
|
-
model = (
|
|
155
|
-
getattr(self._config.llm, 'model', None)
|
|
156
|
-
or "meta-llama/llama-3.1-8b-instruct:free"
|
|
157
|
-
)
|
|
158
|
-
with httpx.Client(timeout=httpx.Timeout(20.0)) as client:
|
|
159
|
-
resp = client.post(
|
|
160
|
-
"https://openrouter.ai/api/v1/chat/completions",
|
|
161
|
-
headers={
|
|
162
|
-
"Authorization": f"Bearer {api_key}",
|
|
163
|
-
"Content-Type": "application/json",
|
|
164
|
-
},
|
|
165
|
-
json={
|
|
166
|
-
"model": model,
|
|
167
|
-
"messages": [{"role": "user", "content": prompt}],
|
|
168
|
-
"max_tokens": max_tokens,
|
|
169
|
-
"temperature": 0.3,
|
|
170
|
-
},
|
|
171
|
-
)
|
|
172
|
-
resp.raise_for_status()
|
|
173
|
-
choices = resp.json().get("choices", [])
|
|
174
|
-
if choices:
|
|
175
|
-
return choices[0].get("message", {}).get("content", "").strip()
|
|
176
|
-
return ""
|
|
177
|
-
|
|
178
|
-
# ------------------------------------------------------------------
|
|
179
|
-
# Prompt templates
|
|
180
|
-
# ------------------------------------------------------------------
|
|
181
|
-
|
|
182
|
-
@staticmethod
|
|
183
|
-
def _cluster_prompt(texts: list[str]) -> str:
|
|
184
|
-
numbered = "\n".join(f"{i+1}. {t[:200]}" for i, t in enumerate(texts))
|
|
185
|
-
return (
|
|
186
|
-
"Summarize the following related memories in 2-3 concise sentences. "
|
|
187
|
-
"Focus on the common theme and key facts.\n\n"
|
|
188
|
-
f"Memories:\n{numbered}\n\n"
|
|
189
|
-
"Summary:"
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
@staticmethod
|
|
193
|
-
def _synthesis_prompt(query: str, texts: list[str]) -> str:
|
|
194
|
-
numbered = "\n".join(f"- {t[:200]}" for t in texts)
|
|
195
|
-
return (
|
|
196
|
-
f"Based on these stored memories, answer the question concisely.\n\n"
|
|
197
|
-
f"Question: {query}\n\n"
|
|
198
|
-
f"Relevant memories:\n{numbered}\n\n"
|
|
199
|
-
"Answer (2-3 sentences):"
|
|
200
|
-
)
|
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3.4.11 "Scale-Ready" — Tier Manager.
|
|
6
|
-
|
|
7
|
-
Manages the lifecycle tiers of atomic facts:
|
|
8
|
-
- active (hot): Recent, frequently accessed. Full retrieval priority.
|
|
9
|
-
- warm: Consolidated or aging. Reduced retrieval weight (0.7x).
|
|
10
|
-
- cold: Old, rarely accessed. Low retrieval weight (0.3x).
|
|
11
|
-
- archived: Superseded or consolidated. Excluded from default retrieval,
|
|
12
|
-
but searchable via deep recall.
|
|
13
|
-
|
|
14
|
-
CRITICAL RULE: Facts are NEVER deleted. Only moved between tiers.
|
|
15
|
-
The forgetting curve affects RETRIEVAL RANKING, not data existence.
|
|
16
|
-
|
|
17
|
-
Demotion logic: A fact is demoted based on time since last access
|
|
18
|
-
(via fact_retention.last_accessed_at), NOT total age from created_at.
|
|
19
|
-
If no access record exists, created_at is used as fallback.
|
|
20
|
-
|
|
21
|
-
Runs on the maintenance scheduler alongside Ebbinghaus/Langevin.
|
|
22
|
-
|
|
23
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
from __future__ import annotations
|
|
27
|
-
|
|
28
|
-
import logging
|
|
29
|
-
from datetime import datetime, timedelta, UTC
|
|
30
|
-
from typing import TYPE_CHECKING
|
|
31
|
-
|
|
32
|
-
from superlocalmemory.core.lifecycle_state import (
|
|
33
|
-
reconcile_profile_lifecycle,
|
|
34
|
-
set_fact_lifecycle_zone,
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
if TYPE_CHECKING:
|
|
38
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
39
|
-
|
|
40
|
-
logger = logging.getLogger(__name__)
|
|
41
|
-
|
|
42
|
-
# ---------------------------------------------------------------------------
|
|
43
|
-
# Tier thresholds (configurable via SLMConfig in future)
|
|
44
|
-
# ---------------------------------------------------------------------------
|
|
45
|
-
|
|
46
|
-
WARM_AFTER_DAYS = 30 # active → warm after 30 days without access
|
|
47
|
-
COLD_AFTER_DAYS = 180 # warm → cold after 180 days without access
|
|
48
|
-
ARCHIVE_AFTER_DAYS = 365 # cold → archived after 365 days without access
|
|
49
|
-
|
|
50
|
-
ACCESS_BOOST_THRESHOLD = 5 # 5+ accesses: boost demotion timer
|
|
51
|
-
ACCESS_BOOST_MULTIPLIER = 2.0
|
|
52
|
-
|
|
53
|
-
IMPORTANCE_RESIST_THRESHOLD = 0.8 # importance >= 0.8: boost demotion timer
|
|
54
|
-
IMPORTANCE_RESIST_MULTIPLIER = 3.0
|
|
55
|
-
|
|
56
|
-
# Cap: when both boosts apply, use max (not multiplicative) to prevent
|
|
57
|
-
# 6x suppression (which would delay archival for 6+ years).
|
|
58
|
-
MAX_COMBINED_MULTIPLIER = 3.0
|
|
59
|
-
|
|
60
|
-
_BATCH_SIZE = 1000 # Process facts in batches to prevent OOM at scale
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def evaluate_tiers(
|
|
64
|
-
db: DatabaseManager,
|
|
65
|
-
profile_id: str = "default",
|
|
66
|
-
dry_run: bool = False,
|
|
67
|
-
) -> dict[str, int]:
|
|
68
|
-
"""Evaluate and update lifecycle tiers for all facts in a profile.
|
|
69
|
-
|
|
70
|
-
Rules:
|
|
71
|
-
1. Pinned facts ALWAYS stay 'active' regardless of age/access.
|
|
72
|
-
2. Recently accessed facts resist demotion (access_count boost).
|
|
73
|
-
3. High-importance facts resist demotion (importance boost).
|
|
74
|
-
4. Boosts cap at MAX_COMBINED_MULTIPLIER (3x), not multiplicative.
|
|
75
|
-
5. NEVER delete facts. NEVER.
|
|
76
|
-
"""
|
|
77
|
-
stats = {
|
|
78
|
-
"demoted_to_warm": 0,
|
|
79
|
-
"demoted_to_cold": 0,
|
|
80
|
-
"demoted_to_archive": 0,
|
|
81
|
-
"pinned_protected": 0,
|
|
82
|
-
"total_evaluated": 0,
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
# Repair any rows written by pre-V3.7 split lifecycle paths before making
|
|
86
|
-
# new transition decisions.
|
|
87
|
-
reconcile_profile_lifecycle(db, profile_id)
|
|
88
|
-
|
|
89
|
-
now = datetime.now(UTC)
|
|
90
|
-
pinned_ids = _get_pinned_fact_ids(db, profile_id)
|
|
91
|
-
|
|
92
|
-
stats["demoted_to_warm"] = _demote_tier(
|
|
93
|
-
db, profile_id, "active", "warm",
|
|
94
|
-
WARM_AFTER_DAYS, pinned_ids, now, dry_run,
|
|
95
|
-
)
|
|
96
|
-
stats["demoted_to_cold"] = _demote_tier(
|
|
97
|
-
db, profile_id, "warm", "cold",
|
|
98
|
-
COLD_AFTER_DAYS, pinned_ids, now, dry_run,
|
|
99
|
-
)
|
|
100
|
-
stats["demoted_to_archive"] = _demote_tier(
|
|
101
|
-
db, profile_id, "cold", "archived",
|
|
102
|
-
ARCHIVE_AFTER_DAYS, pinned_ids, now, dry_run,
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
stats["pinned_protected"] = len(pinned_ids)
|
|
106
|
-
|
|
107
|
-
# Count only non-archived facts (archived are not inspected by _demote_tier)
|
|
108
|
-
rows = db.execute(
|
|
109
|
-
"SELECT COUNT(*) as c FROM atomic_facts "
|
|
110
|
-
"WHERE profile_id = ? AND lifecycle != 'archived'",
|
|
111
|
-
(profile_id,),
|
|
112
|
-
)
|
|
113
|
-
stats["total_evaluated"] = rows[0]["c"] if rows else 0
|
|
114
|
-
|
|
115
|
-
total_demoted = (
|
|
116
|
-
stats["demoted_to_warm"]
|
|
117
|
-
+ stats["demoted_to_cold"]
|
|
118
|
-
+ stats["demoted_to_archive"]
|
|
119
|
-
)
|
|
120
|
-
if total_demoted > 0:
|
|
121
|
-
logger.info(
|
|
122
|
-
"Tier evaluation: %d demoted (warm=%d, cold=%d, archive=%d), %d pinned",
|
|
123
|
-
total_demoted, stats["demoted_to_warm"],
|
|
124
|
-
stats["demoted_to_cold"], stats["demoted_to_archive"],
|
|
125
|
-
stats["pinned_protected"],
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
return stats
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def promote_on_access_batch(db: DatabaseManager, fact_ids: list[str]) -> int:
|
|
132
|
-
"""Batch-promote facts back to 'active' when accessed during recall.
|
|
133
|
-
|
|
134
|
-
Single UPDATE for all fact IDs — avoids N sequential writes on hot path.
|
|
135
|
-
"""
|
|
136
|
-
if not fact_ids:
|
|
137
|
-
return 0
|
|
138
|
-
return set_fact_lifecycle_zone(
|
|
139
|
-
db,
|
|
140
|
-
fact_ids,
|
|
141
|
-
"active",
|
|
142
|
-
from_atomic=("warm", "cold"),
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def promote_on_access(db: DatabaseManager, fact_id: str) -> None:
|
|
147
|
-
"""Promote a single fact back to 'active' when accessed during recall.
|
|
148
|
-
|
|
149
|
-
Kept for backward compatibility. Prefer promote_on_access_batch.
|
|
150
|
-
"""
|
|
151
|
-
set_fact_lifecycle_zone(
|
|
152
|
-
db,
|
|
153
|
-
[fact_id],
|
|
154
|
-
"active",
|
|
155
|
-
from_atomic=("warm", "cold"),
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def pin_fact(
|
|
160
|
-
db: DatabaseManager,
|
|
161
|
-
fact_id: str,
|
|
162
|
-
profile_id: str,
|
|
163
|
-
reason: str = "",
|
|
164
|
-
) -> bool:
|
|
165
|
-
"""Pin a fact to stay in active tier forever.
|
|
166
|
-
|
|
167
|
-
Both the pin record and lifecycle update are scoped to profile_id.
|
|
168
|
-
"""
|
|
169
|
-
now = datetime.now(UTC).isoformat()
|
|
170
|
-
try:
|
|
171
|
-
db.execute(
|
|
172
|
-
"INSERT OR REPLACE INTO pinned_facts "
|
|
173
|
-
"(fact_id, profile_id, pinned_at, reason) VALUES (?, ?, ?, ?)",
|
|
174
|
-
(fact_id, profile_id, now, reason),
|
|
175
|
-
)
|
|
176
|
-
set_fact_lifecycle_zone(
|
|
177
|
-
db, [fact_id], "active", profile_id=profile_id,
|
|
178
|
-
)
|
|
179
|
-
return True
|
|
180
|
-
except Exception as exc:
|
|
181
|
-
logger.warning("Failed to pin fact %s: %s", fact_id, exc, exc_info=True)
|
|
182
|
-
return False
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def unpin_fact(db: DatabaseManager, fact_id: str) -> bool:
|
|
186
|
-
"""Unpin a fact, allowing normal tier demotion to resume."""
|
|
187
|
-
try:
|
|
188
|
-
db.execute("DELETE FROM pinned_facts WHERE fact_id = ?", (fact_id,))
|
|
189
|
-
return True
|
|
190
|
-
except Exception as exc:
|
|
191
|
-
logger.warning("Failed to unpin fact %s: %s", fact_id, exc, exc_info=True)
|
|
192
|
-
return False
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
def get_tier_stats(db: DatabaseManager, profile_id: str = "default") -> dict:
|
|
196
|
-
"""Get tier distribution stats for the dashboard."""
|
|
197
|
-
rows = db.execute(
|
|
198
|
-
"SELECT lifecycle, COUNT(*) as cnt FROM atomic_facts "
|
|
199
|
-
"WHERE profile_id = ? GROUP BY lifecycle",
|
|
200
|
-
(profile_id,),
|
|
201
|
-
)
|
|
202
|
-
dist = {r["lifecycle"]: r["cnt"] for r in rows}
|
|
203
|
-
|
|
204
|
-
pinned_rows = db.execute(
|
|
205
|
-
"SELECT COUNT(*) as c FROM pinned_facts WHERE profile_id = ?",
|
|
206
|
-
(profile_id,),
|
|
207
|
-
)
|
|
208
|
-
pinned = pinned_rows[0]["c"] if pinned_rows else 0
|
|
209
|
-
|
|
210
|
-
total = sum(dist.values())
|
|
211
|
-
return {
|
|
212
|
-
"active": dist.get("active", 0),
|
|
213
|
-
"warm": dist.get("warm", 0),
|
|
214
|
-
"cold": dist.get("cold", 0),
|
|
215
|
-
"archived": dist.get("archived", 0),
|
|
216
|
-
"total": total,
|
|
217
|
-
"pinned": pinned,
|
|
218
|
-
"active_pct": round(dist.get("active", 0) / max(total, 1) * 100, 1),
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
# ---------------------------------------------------------------------------
|
|
223
|
-
# Internal helpers
|
|
224
|
-
# ---------------------------------------------------------------------------
|
|
225
|
-
|
|
226
|
-
def _get_pinned_fact_ids(db: DatabaseManager, profile_id: str) -> frozenset[str]:
|
|
227
|
-
"""Load all pinned fact IDs for a profile."""
|
|
228
|
-
try:
|
|
229
|
-
rows = db.execute(
|
|
230
|
-
"SELECT fact_id FROM pinned_facts WHERE profile_id = ?",
|
|
231
|
-
(profile_id,),
|
|
232
|
-
)
|
|
233
|
-
return frozenset(r["fact_id"] for r in rows)
|
|
234
|
-
except Exception as exc:
|
|
235
|
-
logger.warning(
|
|
236
|
-
"Failed to load pinned facts for profile %s: %s",
|
|
237
|
-
profile_id, exc, exc_info=True,
|
|
238
|
-
)
|
|
239
|
-
return frozenset()
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def _demote_tier(
|
|
243
|
-
db: DatabaseManager,
|
|
244
|
-
profile_id: str,
|
|
245
|
-
from_tier: str,
|
|
246
|
-
to_tier: str,
|
|
247
|
-
base_days: int,
|
|
248
|
-
pinned_ids: frozenset[str],
|
|
249
|
-
now: datetime,
|
|
250
|
-
dry_run: bool,
|
|
251
|
-
) -> int:
|
|
252
|
-
"""Demote facts from one tier to the next based on idle time.
|
|
253
|
-
|
|
254
|
-
Uses last_accessed_at from fact_retention as the reference date
|
|
255
|
-
(time since last access). Falls back to created_at if no access record.
|
|
256
|
-
Processes in batches of _BATCH_SIZE to prevent OOM at scale.
|
|
257
|
-
"""
|
|
258
|
-
demoted_ids: list[str] = []
|
|
259
|
-
offset = 0
|
|
260
|
-
|
|
261
|
-
while True:
|
|
262
|
-
rows = db.execute(
|
|
263
|
-
"SELECT af.fact_id, af.access_count, af.importance, "
|
|
264
|
-
" af.created_at, fr.last_accessed_at "
|
|
265
|
-
"FROM atomic_facts af "
|
|
266
|
-
"LEFT JOIN fact_retention fr ON af.fact_id = fr.fact_id "
|
|
267
|
-
"WHERE af.profile_id = ? AND af.lifecycle = ? "
|
|
268
|
-
"LIMIT ? OFFSET ?",
|
|
269
|
-
(profile_id, from_tier, _BATCH_SIZE, offset),
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
if not rows:
|
|
273
|
-
break
|
|
274
|
-
|
|
275
|
-
for row in rows:
|
|
276
|
-
fid = row["fact_id"]
|
|
277
|
-
|
|
278
|
-
if fid in pinned_ids:
|
|
279
|
-
continue
|
|
280
|
-
|
|
281
|
-
effective_days = float(base_days)
|
|
282
|
-
|
|
283
|
-
access_count = row["access_count"] or 0
|
|
284
|
-
access_mult = (
|
|
285
|
-
ACCESS_BOOST_MULTIPLIER
|
|
286
|
-
if access_count >= ACCESS_BOOST_THRESHOLD
|
|
287
|
-
else 1.0
|
|
288
|
-
)
|
|
289
|
-
|
|
290
|
-
importance = row["importance"] or 0.5
|
|
291
|
-
importance_mult = (
|
|
292
|
-
IMPORTANCE_RESIST_MULTIPLIER
|
|
293
|
-
if importance >= IMPORTANCE_RESIST_THRESHOLD
|
|
294
|
-
else 1.0
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
# Cap: use max of the two boosts, not multiplicative
|
|
298
|
-
effective_days *= min(max(access_mult, importance_mult), MAX_COMBINED_MULTIPLIER)
|
|
299
|
-
|
|
300
|
-
# Reference: last access time, fallback to created_at
|
|
301
|
-
ref_str = row["last_accessed_at"] or row["created_at"] or ""
|
|
302
|
-
if not ref_str:
|
|
303
|
-
continue
|
|
304
|
-
|
|
305
|
-
try:
|
|
306
|
-
ref_date = datetime.fromisoformat(ref_str.replace("Z", "+00:00"))
|
|
307
|
-
if ref_date.tzinfo is None:
|
|
308
|
-
ref_date = ref_date.replace(tzinfo=UTC)
|
|
309
|
-
idle_time = now - ref_date
|
|
310
|
-
if idle_time < timedelta(days=effective_days):
|
|
311
|
-
continue
|
|
312
|
-
except (ValueError, TypeError):
|
|
313
|
-
continue
|
|
314
|
-
|
|
315
|
-
demoted_ids.append(fid)
|
|
316
|
-
|
|
317
|
-
if len(rows) < _BATCH_SIZE:
|
|
318
|
-
break
|
|
319
|
-
offset += _BATCH_SIZE
|
|
320
|
-
|
|
321
|
-
if demoted_ids and not dry_run:
|
|
322
|
-
# Batch UPDATE in chunks of 500
|
|
323
|
-
for i in range(0, len(demoted_ids), 500):
|
|
324
|
-
batch = demoted_ids[i:i + 500]
|
|
325
|
-
set_fact_lifecycle_zone(
|
|
326
|
-
db,
|
|
327
|
-
batch,
|
|
328
|
-
to_tier,
|
|
329
|
-
profile_id=profile_id,
|
|
330
|
-
from_atomic=(from_tier,),
|
|
331
|
-
)
|
|
332
|
-
|
|
333
|
-
return len(demoted_ids)
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
# ---------------------------------------------------------------------------
|
|
337
|
-
# Hot-path access recording (v3.4.5 — Sprint 1)
|
|
338
|
-
# ---------------------------------------------------------------------------
|
|
339
|
-
|
|
340
|
-
# In-memory counter for batch-flush access recording.
|
|
341
|
-
# Thread-safe. Flushed to SQLite every _ACCESS_FLUSH_THRESHOLD records
|
|
342
|
-
# or _ACCESS_FLUSH_SECONDS, whichever comes first.
|
|
343
|
-
import threading as _threading
|
|
344
|
-
from datetime import datetime as _datetime, timedelta as _timedelta
|
|
345
|
-
|
|
346
|
-
_pending_accesses: dict[str, int] = {}
|
|
347
|
-
_access_lock = _threading.Lock()
|
|
348
|
-
_last_access_flush = _datetime.now()
|
|
349
|
-
|
|
350
|
-
_ACCESS_FLUSH_THRESHOLD = 100
|
|
351
|
-
_ACCESS_FLUSH_SECONDS = 60
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def record_access_batch(db: DatabaseManager, fact_ids: list[str]) -> None:
|
|
355
|
-
"""Hot-path access recording for recall. Must be < 1ms average.
|
|
356
|
-
|
|
357
|
-
Uses in-memory counter, batch-flushes to SQLite every
|
|
358
|
-
_ACCESS_FLUSH_THRESHOLD accesses or _ACCESS_FLUSH_SECONDS.
|
|
359
|
-
Promotes cold/archived facts on access.
|
|
360
|
-
|
|
361
|
-
Thread-safe — called from multiple MCP connections.
|
|
362
|
-
"""
|
|
363
|
-
global _last_access_flush
|
|
364
|
-
if not fact_ids:
|
|
365
|
-
return
|
|
366
|
-
|
|
367
|
-
with _access_lock:
|
|
368
|
-
for fid in fact_ids:
|
|
369
|
-
_pending_accesses[fid] = _pending_accesses.get(fid, 0) + 1
|
|
370
|
-
|
|
371
|
-
now = _datetime.now()
|
|
372
|
-
should_flush = (
|
|
373
|
-
len(_pending_accesses) >= _ACCESS_FLUSH_THRESHOLD
|
|
374
|
-
or (now - _last_access_flush).total_seconds() > _ACCESS_FLUSH_SECONDS
|
|
375
|
-
)
|
|
376
|
-
if should_flush:
|
|
377
|
-
_flush_access_batch(db)
|
|
378
|
-
_last_access_flush = now
|
|
379
|
-
|
|
380
|
-
# Promote cold/archived facts on access (F-13: promote to warm)
|
|
381
|
-
try:
|
|
382
|
-
promote_on_access_batch(db, fact_ids)
|
|
383
|
-
except Exception:
|
|
384
|
-
pass
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
def _flush_access_batch(db: DatabaseManager) -> None:
|
|
388
|
-
"""Batch UPDATE access_count_30d and access_count in SQLite."""
|
|
389
|
-
if not _pending_accesses:
|
|
390
|
-
return
|
|
391
|
-
try:
|
|
392
|
-
for fid, count in list(_pending_accesses.items()):
|
|
393
|
-
db.execute(
|
|
394
|
-
"UPDATE atomic_facts SET access_count_30d = access_count_30d + ?, "
|
|
395
|
-
"access_count = access_count + ? WHERE fact_id = ?",
|
|
396
|
-
(count, count, fid),
|
|
397
|
-
)
|
|
398
|
-
_pending_accesses.clear()
|
|
399
|
-
except Exception as exc:
|
|
400
|
-
logger.warning("Failed to flush access counts: %s", exc)
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
# ---------------------------------------------------------------------------
|
|
404
|
-
# 30-day access window reset (F-14)
|
|
405
|
-
# ---------------------------------------------------------------------------
|
|
406
|
-
|
|
407
|
-
def reset_access_count_30d(db: DatabaseManager, profile_id: str = "default") -> int:
|
|
408
|
-
"""Reset access_count_30d using actual 30-day window from fact_access_log.
|
|
409
|
-
|
|
410
|
-
Called during nightly rebalance. Returns number of facts updated.
|
|
411
|
-
"""
|
|
412
|
-
try:
|
|
413
|
-
db.execute(
|
|
414
|
-
"UPDATE atomic_facts SET access_count_30d = COALESCE(("
|
|
415
|
-
" SELECT COUNT(*) FROM fact_access_log "
|
|
416
|
-
" WHERE fact_id = atomic_facts.fact_id "
|
|
417
|
-
" AND accessed_at >= datetime('now', '-30 days')"
|
|
418
|
-
"), 0) WHERE profile_id = ?",
|
|
419
|
-
(profile_id,),
|
|
420
|
-
)
|
|
421
|
-
# Can't get rowcount reliably after subquery UPDATE
|
|
422
|
-
return -1
|
|
423
|
-
except Exception as exc:
|
|
424
|
-
logger.warning("Failed to reset access_count_30d: %s", exc)
|
|
425
|
-
return 0
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
# ---------------------------------------------------------------------------
|
|
429
|
-
# Backend sync stubs (v3.4.5 — Sprint 2+)
|
|
430
|
-
# ---------------------------------------------------------------------------
|
|
431
|
-
|
|
432
|
-
_cozo_backend: object | None = None
|
|
433
|
-
_lancedb_backend: object | None = None
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
def set_backends(cozo: object | None = None, lancedb: object | None = None) -> None:
|
|
437
|
-
"""Register CozoDB/LanceDB backends for tier sync. Called by BackendOrchestrator."""
|
|
438
|
-
global _cozo_backend, _lancedb_backend
|
|
439
|
-
_cozo_backend = cozo
|
|
440
|
-
_lancedb_backend = lancedb
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
def _sync_tiers_to_backends(
|
|
444
|
-
added: list[str], removed: list[str], db: DatabaseManager,
|
|
445
|
-
) -> None:
|
|
446
|
-
"""Sync tier changes to CozoDB/LanceDB. Non-fatal on failure."""
|
|
447
|
-
if _cozo_backend and hasattr(_cozo_backend, "sync_tier_changes"):
|
|
448
|
-
try:
|
|
449
|
-
_cozo_backend.sync_tier_changes(added=added, removed=removed)
|
|
450
|
-
except Exception as exc:
|
|
451
|
-
logger.warning("CozoDB tier sync failed: %s", exc)
|
|
452
|
-
|
|
453
|
-
if _lancedb_backend and hasattr(_lancedb_backend, "bulk_update_tiers_from_sqlite"):
|
|
454
|
-
try:
|
|
455
|
-
# DatabaseManager intentionally has no public `.conn`; use its
|
|
456
|
-
# transaction boundary so tier synchronization cannot silently
|
|
457
|
-
# fail after a scale projection has been promoted.
|
|
458
|
-
with db.raw_connection() as conn:
|
|
459
|
-
_lancedb_backend.bulk_update_tiers_from_sqlite(conn)
|
|
460
|
-
except Exception as exc:
|
|
461
|
-
logger.warning("LanceDB tier sync failed: %s", exc)
|