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,131 +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.4.22 — LLD-03 §5.2
|
|
4
|
-
|
|
5
|
-
"""Per-(profile, stratum) posterior LRU cache for the contextual bandit.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Key design:
|
|
9
|
-
- Loader runs OUTSIDE the lock so DB reads never serialise across strata.
|
|
10
|
-
- ``get`` is thread-safe; concurrent misses may double-load for the same
|
|
11
|
-
key (acceptable because DB read is idempotent and cheap).
|
|
12
|
-
- ``invalidate`` drops a single key — called on every successful bandit
|
|
13
|
-
``update`` for that stratum (hard rule B5).
|
|
14
|
-
- Max ~256 (profile, stratum) entries ≈ 80 KB RAM steady state.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import threading
|
|
20
|
-
from typing import Callable
|
|
21
|
-
|
|
22
|
-
_PosteriorMap = dict[str, tuple[float, float]]
|
|
23
|
-
_CacheKey = tuple[str, str]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class _BanditCache:
|
|
27
|
-
"""Thread-safe LRU keyed by ``(profile_id, stratum)``.
|
|
28
|
-
|
|
29
|
-
Values are ``{arm_id: (alpha, beta)}`` dicts. Entries are loaded on demand
|
|
30
|
-
via the caller-supplied ``loader`` and evicted LRU-style once size > max.
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def __init__(self, max_entries: int = 256) -> None:
|
|
34
|
-
if max_entries < 1:
|
|
35
|
-
raise ValueError("max_entries must be >= 1")
|
|
36
|
-
self._store: dict[_CacheKey, _PosteriorMap] = {}
|
|
37
|
-
self._order: list[_CacheKey] = []
|
|
38
|
-
self._lock = threading.Lock()
|
|
39
|
-
self._max = int(max_entries)
|
|
40
|
-
|
|
41
|
-
def get(
|
|
42
|
-
self,
|
|
43
|
-
profile_id: str,
|
|
44
|
-
stratum: str,
|
|
45
|
-
loader: Callable[[str, str], _PosteriorMap],
|
|
46
|
-
) -> _PosteriorMap:
|
|
47
|
-
"""Return the posterior map for the key, loading if absent.
|
|
48
|
-
|
|
49
|
-
The loader is called exactly once per cache-miss path; the DB read
|
|
50
|
-
runs outside the lock to keep contention bounded.
|
|
51
|
-
"""
|
|
52
|
-
key = (profile_id, stratum)
|
|
53
|
-
with self._lock:
|
|
54
|
-
if key in self._store:
|
|
55
|
-
self._touch_locked(key)
|
|
56
|
-
return self._store[key]
|
|
57
|
-
|
|
58
|
-
# Miss — load outside the lock.
|
|
59
|
-
data = loader(profile_id, stratum) or {}
|
|
60
|
-
|
|
61
|
-
with self._lock:
|
|
62
|
-
# Another thread may have populated in the meantime.
|
|
63
|
-
if key in self._store:
|
|
64
|
-
self._touch_locked(key)
|
|
65
|
-
return self._store[key]
|
|
66
|
-
self._store[key] = data
|
|
67
|
-
self._order.append(key)
|
|
68
|
-
self._evict_if_needed_locked()
|
|
69
|
-
return data
|
|
70
|
-
|
|
71
|
-
def invalidate(self, profile_id: str, stratum: str) -> None:
|
|
72
|
-
"""Drop a single (profile, stratum) entry. Safe when absent."""
|
|
73
|
-
key = (profile_id, stratum)
|
|
74
|
-
with self._lock:
|
|
75
|
-
self._store.pop(key, None)
|
|
76
|
-
try:
|
|
77
|
-
self._order.remove(key)
|
|
78
|
-
except ValueError:
|
|
79
|
-
pass
|
|
80
|
-
|
|
81
|
-
def clear(self) -> None:
|
|
82
|
-
"""Drop all entries — used in tests + daemon shutdown."""
|
|
83
|
-
with self._lock:
|
|
84
|
-
self._store.clear()
|
|
85
|
-
self._order.clear()
|
|
86
|
-
|
|
87
|
-
def size(self) -> int:
|
|
88
|
-
"""Current entry count — primarily for tests / introspection."""
|
|
89
|
-
with self._lock:
|
|
90
|
-
return len(self._store)
|
|
91
|
-
|
|
92
|
-
# ------------------------------------------------------------------
|
|
93
|
-
# Internal (lock-held) helpers
|
|
94
|
-
# ------------------------------------------------------------------
|
|
95
|
-
|
|
96
|
-
def _touch_locked(self, key: _CacheKey) -> None:
|
|
97
|
-
try:
|
|
98
|
-
self._order.remove(key)
|
|
99
|
-
except ValueError: # pragma: no cover — invariant: in store => in order
|
|
100
|
-
pass
|
|
101
|
-
self._order.append(key)
|
|
102
|
-
|
|
103
|
-
def _evict_if_needed_locked(self) -> None:
|
|
104
|
-
while len(self._order) > self._max:
|
|
105
|
-
oldest = self._order.pop(0)
|
|
106
|
-
self._store.pop(oldest, None)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
# Module-level shared cache instance — the bandit module pulls this via
|
|
110
|
-
# ``get_shared_cache`` so tests can clear between runs.
|
|
111
|
-
_SHARED: _BanditCache | None = None
|
|
112
|
-
_SHARED_LOCK = threading.Lock()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def get_shared_cache(max_entries: int = 256) -> _BanditCache:
|
|
116
|
-
"""Return the process-wide bandit cache, creating it on first call."""
|
|
117
|
-
global _SHARED
|
|
118
|
-
with _SHARED_LOCK:
|
|
119
|
-
if _SHARED is None:
|
|
120
|
-
_SHARED = _BanditCache(max_entries=max_entries)
|
|
121
|
-
return _SHARED
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def reset_shared_cache() -> None:
|
|
125
|
-
"""Drop the shared cache — TEST-ONLY helper."""
|
|
126
|
-
global _SHARED
|
|
127
|
-
with _SHARED_LOCK:
|
|
128
|
-
_SHARED = None
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
__all__ = ("_BanditCache", "get_shared_cache", "reset_shared_cache")
|
|
@@ -1,542 +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 — Behavioral Pattern Store.
|
|
6
|
-
|
|
7
|
-
Stores, retrieves, and transfers behavioral patterns per profile.
|
|
8
|
-
Ported from V2's _store_patterns.py + cross_project_transfer.py
|
|
9
|
-
into a single unified module with direct sqlite3 access.
|
|
10
|
-
|
|
11
|
-
Key features:
|
|
12
|
-
- Record detected patterns (refinement, interest, archival, etc.)
|
|
13
|
-
- Query patterns by profile and type
|
|
14
|
-
- Summarize pattern counts by type
|
|
15
|
-
- Transfer patterns across profiles (cross-project learning)
|
|
16
|
-
- Confidence scoring: min(evidence/10, 1.0) * abs(rate - 0.5) * 2
|
|
17
|
-
|
|
18
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
from __future__ import annotations
|
|
22
|
-
|
|
23
|
-
import json
|
|
24
|
-
import logging
|
|
25
|
-
import re
|
|
26
|
-
import sqlite3
|
|
27
|
-
import threading
|
|
28
|
-
from datetime import datetime, timezone
|
|
29
|
-
from pathlib import Path
|
|
30
|
-
from typing import Any, Dict, List, Optional
|
|
31
|
-
|
|
32
|
-
logger = logging.getLogger(__name__)
|
|
33
|
-
|
|
34
|
-
# Minimum observations before emitting a pattern
|
|
35
|
-
MIN_EVIDENCE = 3
|
|
36
|
-
|
|
37
|
-
# S9-DASH-01: filter orphan entity_ids that leak into patterns. The
|
|
38
|
-
# canonical_entities primary key is 16 hex chars; some historic rows
|
|
39
|
-
# also carry 17 (off-by-one). Any pattern value matching this shape
|
|
40
|
-
# with no accompanying ``metadata.value`` is skipped at read time so
|
|
41
|
-
# the dashboard no longer shows raw ids as "preferences".
|
|
42
|
-
_HEX_ID_RE = re.compile(r"^[0-9a-f]{15,20}$")
|
|
43
|
-
|
|
44
|
-
# Transfer eligibility thresholds
|
|
45
|
-
TRANSFER_MIN_CONFIDENCE = 0.3
|
|
46
|
-
TRANSFER_MIN_EVIDENCE = 2
|
|
47
|
-
|
|
48
|
-
_CREATE_TABLE = """
|
|
49
|
-
CREATE TABLE IF NOT EXISTS _store_patterns (
|
|
50
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
51
|
-
profile_id TEXT NOT NULL,
|
|
52
|
-
pattern_type TEXT NOT NULL,
|
|
53
|
-
pattern_key TEXT DEFAULT '',
|
|
54
|
-
success_rate REAL DEFAULT 0.0,
|
|
55
|
-
evidence_count INTEGER DEFAULT 1,
|
|
56
|
-
confidence REAL DEFAULT 0.0,
|
|
57
|
-
metadata TEXT DEFAULT '{}',
|
|
58
|
-
created_at TEXT NOT NULL,
|
|
59
|
-
updated_at TEXT NOT NULL
|
|
60
|
-
)
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
_CREATE_INDEX = """
|
|
64
|
-
CREATE INDEX IF NOT EXISTS idx_sp_profile_type
|
|
65
|
-
ON _store_patterns(profile_id, pattern_type)
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class BehavioralPatternStore:
|
|
70
|
-
"""Store and query behavioral patterns per profile.
|
|
71
|
-
|
|
72
|
-
Uses direct sqlite3 for storage. Thread-safe via a lock.
|
|
73
|
-
Creates the _store_patterns table on first use.
|
|
74
|
-
|
|
75
|
-
Ported from V2's BehavioralPatternExtractor + CrossProjectTransfer,
|
|
76
|
-
unified into a single class with profile-scoped operations.
|
|
77
|
-
"""
|
|
78
|
-
|
|
79
|
-
def __init__(self, db_path: str | Path) -> None:
|
|
80
|
-
self._db_path = str(db_path)
|
|
81
|
-
self._lock = threading.Lock()
|
|
82
|
-
self._ensure_table()
|
|
83
|
-
|
|
84
|
-
# ------------------------------------------------------------------
|
|
85
|
-
# Public API
|
|
86
|
-
# ------------------------------------------------------------------
|
|
87
|
-
|
|
88
|
-
def record_pattern(
|
|
89
|
-
self,
|
|
90
|
-
profile_id: str,
|
|
91
|
-
pattern_type: str,
|
|
92
|
-
data: Optional[Dict[str, Any]] = None,
|
|
93
|
-
success_rate: float = 0.0,
|
|
94
|
-
confidence: float = 0.0,
|
|
95
|
-
) -> int:
|
|
96
|
-
"""Store a detected behavioral pattern.
|
|
97
|
-
|
|
98
|
-
Args:
|
|
99
|
-
profile_id: Profile scope for the pattern.
|
|
100
|
-
pattern_type: Category (e.g. "refinement", "interest", "archival").
|
|
101
|
-
data: Arbitrary metadata dict (stored as JSON).
|
|
102
|
-
success_rate: Success rate if applicable (0.0-1.0).
|
|
103
|
-
confidence: Confidence score (0.0-1.0).
|
|
104
|
-
|
|
105
|
-
Returns:
|
|
106
|
-
The row ID of the inserted pattern.
|
|
107
|
-
"""
|
|
108
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
109
|
-
metadata_json = json.dumps(data or {})
|
|
110
|
-
pattern_key = (data or {}).get("topic", (data or {}).get("pattern_key", ""))
|
|
111
|
-
|
|
112
|
-
with self._lock:
|
|
113
|
-
conn = self._connect()
|
|
114
|
-
try:
|
|
115
|
-
# Check for existing pattern of same type+key for this profile
|
|
116
|
-
existing = conn.execute(
|
|
117
|
-
"SELECT id, evidence_count FROM _store_patterns "
|
|
118
|
-
"WHERE profile_id = ? AND pattern_type = ? AND pattern_key = ?",
|
|
119
|
-
(profile_id, pattern_type, pattern_key),
|
|
120
|
-
).fetchone()
|
|
121
|
-
|
|
122
|
-
if existing:
|
|
123
|
-
new_count = existing[1] + 1
|
|
124
|
-
new_confidence = self._compute_confidence(
|
|
125
|
-
new_count, success_rate
|
|
126
|
-
) if success_rate > 0 else min(1.0, new_count / 100.0)
|
|
127
|
-
conn.execute(
|
|
128
|
-
"UPDATE _store_patterns "
|
|
129
|
-
"SET evidence_count = ?, confidence = ?, "
|
|
130
|
-
" success_rate = ?, metadata = ?, updated_at = ? "
|
|
131
|
-
"WHERE id = ?",
|
|
132
|
-
(new_count, new_confidence, success_rate,
|
|
133
|
-
metadata_json, now, existing[0]),
|
|
134
|
-
)
|
|
135
|
-
conn.commit()
|
|
136
|
-
return existing[0]
|
|
137
|
-
|
|
138
|
-
initial_confidence = confidence or 0.01
|
|
139
|
-
cur = conn.execute(
|
|
140
|
-
"INSERT INTO _store_patterns "
|
|
141
|
-
"(profile_id, pattern_type, pattern_key, success_rate, "
|
|
142
|
-
" evidence_count, confidence, metadata, created_at, updated_at) "
|
|
143
|
-
"VALUES (?, ?, ?, ?, 1, ?, ?, ?, ?)",
|
|
144
|
-
(profile_id, pattern_type, pattern_key, success_rate,
|
|
145
|
-
initial_confidence, metadata_json, now, now),
|
|
146
|
-
)
|
|
147
|
-
conn.commit()
|
|
148
|
-
return cur.lastrowid
|
|
149
|
-
finally:
|
|
150
|
-
conn.close()
|
|
151
|
-
|
|
152
|
-
def get_patterns(
|
|
153
|
-
self,
|
|
154
|
-
profile_id: str,
|
|
155
|
-
pattern_type: Optional[str] = None,
|
|
156
|
-
limit: int = 50,
|
|
157
|
-
min_confidence: float = 0.0,
|
|
158
|
-
) -> List[Dict[str, Any]]:
|
|
159
|
-
"""Get stored patterns for a profile.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
profile_id: Profile to query.
|
|
163
|
-
pattern_type: If given, filter by type.
|
|
164
|
-
limit: Max rows to return.
|
|
165
|
-
min_confidence: Minimum confidence threshold.
|
|
166
|
-
|
|
167
|
-
Returns:
|
|
168
|
-
List of pattern dicts with deserialized metadata.
|
|
169
|
-
"""
|
|
170
|
-
with self._lock:
|
|
171
|
-
conn = self._connect()
|
|
172
|
-
try:
|
|
173
|
-
query = (
|
|
174
|
-
"SELECT * FROM _store_patterns "
|
|
175
|
-
"WHERE profile_id = ? AND confidence >= ?"
|
|
176
|
-
)
|
|
177
|
-
params: List[Any] = [profile_id, min_confidence]
|
|
178
|
-
|
|
179
|
-
if pattern_type is not None:
|
|
180
|
-
query += " AND pattern_type = ?"
|
|
181
|
-
params.append(pattern_type)
|
|
182
|
-
|
|
183
|
-
query += " ORDER BY confidence DESC, updated_at DESC LIMIT ?"
|
|
184
|
-
params.append(limit)
|
|
185
|
-
|
|
186
|
-
rows = conn.execute(query, params).fetchall()
|
|
187
|
-
out: List[Dict[str, Any]] = []
|
|
188
|
-
for r in rows:
|
|
189
|
-
d = self._row_to_dict(r)
|
|
190
|
-
# S9-DASH-01: historic rows wrote raw hex entity_ids
|
|
191
|
-
# (16-20 hex chars, no row in canonical_entities) into
|
|
192
|
-
# ``pattern_key``/``metadata.value``. They surface as
|
|
193
|
-
# "entity_preferences: ea701bf01f1ff4df8" on the
|
|
194
|
-
# dashboard, which is noise. Skip them at read time so
|
|
195
|
-
# existing installs don't require a destructive DB
|
|
196
|
-
# cleanup migration.
|
|
197
|
-
key = d.get("pattern_key") or ""
|
|
198
|
-
meta_val = (d.get("metadata") or {}).get("value") or ""
|
|
199
|
-
if _HEX_ID_RE.match(str(key).split(":", 1)[-1]):
|
|
200
|
-
continue
|
|
201
|
-
if _HEX_ID_RE.match(str(meta_val)):
|
|
202
|
-
continue
|
|
203
|
-
out.append(d)
|
|
204
|
-
return out
|
|
205
|
-
finally:
|
|
206
|
-
conn.close()
|
|
207
|
-
|
|
208
|
-
def get_summary(self, profile_id: str) -> Dict[str, int]:
|
|
209
|
-
"""Get pattern counts by type for a profile.
|
|
210
|
-
|
|
211
|
-
Returns:
|
|
212
|
-
Dict mapping pattern_type -> count.
|
|
213
|
-
"""
|
|
214
|
-
with self._lock:
|
|
215
|
-
conn = self._connect()
|
|
216
|
-
try:
|
|
217
|
-
rows = conn.execute(
|
|
218
|
-
"SELECT pattern_type, COUNT(*) as cnt "
|
|
219
|
-
"FROM _store_patterns "
|
|
220
|
-
"WHERE profile_id = ? "
|
|
221
|
-
"GROUP BY pattern_type",
|
|
222
|
-
(profile_id,),
|
|
223
|
-
).fetchall()
|
|
224
|
-
return {row[0]: row[1] for row in rows}
|
|
225
|
-
finally:
|
|
226
|
-
conn.close()
|
|
227
|
-
|
|
228
|
-
def transfer_patterns(
|
|
229
|
-
self,
|
|
230
|
-
source_profile: str,
|
|
231
|
-
target_profile: str,
|
|
232
|
-
min_confidence: float = 0.0,
|
|
233
|
-
) -> int:
|
|
234
|
-
"""Copy eligible patterns from source to target profile.
|
|
235
|
-
|
|
236
|
-
Only metadata (type, key, success_rate, confidence) is transferred.
|
|
237
|
-
Memory content is never transferred. Creates new rows in the target
|
|
238
|
-
profile scope.
|
|
239
|
-
|
|
240
|
-
Args:
|
|
241
|
-
source_profile: Profile to copy patterns from.
|
|
242
|
-
target_profile: Profile to copy patterns to.
|
|
243
|
-
min_confidence: Only transfer patterns above this threshold.
|
|
244
|
-
|
|
245
|
-
Returns:
|
|
246
|
-
Number of patterns transferred.
|
|
247
|
-
"""
|
|
248
|
-
if source_profile == target_profile:
|
|
249
|
-
return 0
|
|
250
|
-
|
|
251
|
-
source_patterns = self.get_patterns(
|
|
252
|
-
source_profile, min_confidence=min_confidence
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
transferred = 0
|
|
256
|
-
for pattern in source_patterns:
|
|
257
|
-
# Skip if target already has this pattern
|
|
258
|
-
existing = self.get_patterns(
|
|
259
|
-
target_profile,
|
|
260
|
-
pattern_type=pattern["pattern_type"],
|
|
261
|
-
)
|
|
262
|
-
already_exists = any(
|
|
263
|
-
p["pattern_key"] == pattern.get("pattern_key", "")
|
|
264
|
-
for p in existing
|
|
265
|
-
)
|
|
266
|
-
if already_exists:
|
|
267
|
-
continue
|
|
268
|
-
|
|
269
|
-
self.record_pattern(
|
|
270
|
-
profile_id=target_profile,
|
|
271
|
-
pattern_type=pattern["pattern_type"],
|
|
272
|
-
data={
|
|
273
|
-
"topic": pattern.get("pattern_key", ""),
|
|
274
|
-
"transferred_from": source_profile,
|
|
275
|
-
"original_confidence": pattern.get("confidence", 0.0),
|
|
276
|
-
},
|
|
277
|
-
success_rate=pattern.get("success_rate", 0.0),
|
|
278
|
-
confidence=pattern.get("confidence", 0.0) * 0.8,
|
|
279
|
-
)
|
|
280
|
-
transferred += 1
|
|
281
|
-
|
|
282
|
-
return transferred
|
|
283
|
-
|
|
284
|
-
def delete_patterns(
|
|
285
|
-
self,
|
|
286
|
-
profile_id: str,
|
|
287
|
-
pattern_type: Optional[str] = None,
|
|
288
|
-
) -> int:
|
|
289
|
-
"""Delete patterns for a profile. Optionally filter by type.
|
|
290
|
-
|
|
291
|
-
Returns:
|
|
292
|
-
Number of patterns deleted.
|
|
293
|
-
"""
|
|
294
|
-
with self._lock:
|
|
295
|
-
conn = self._connect()
|
|
296
|
-
try:
|
|
297
|
-
if pattern_type:
|
|
298
|
-
cur = conn.execute(
|
|
299
|
-
"DELETE FROM _store_patterns "
|
|
300
|
-
"WHERE profile_id = ? AND pattern_type = ?",
|
|
301
|
-
(profile_id, pattern_type),
|
|
302
|
-
)
|
|
303
|
-
else:
|
|
304
|
-
cur = conn.execute(
|
|
305
|
-
"DELETE FROM _store_patterns WHERE profile_id = ?",
|
|
306
|
-
(profile_id,),
|
|
307
|
-
)
|
|
308
|
-
conn.commit()
|
|
309
|
-
return cur.rowcount
|
|
310
|
-
finally:
|
|
311
|
-
conn.close()
|
|
312
|
-
|
|
313
|
-
def delete_pattern_by_key(
|
|
314
|
-
self,
|
|
315
|
-
profile_id: str,
|
|
316
|
-
pattern_type: str,
|
|
317
|
-
pattern_key: str,
|
|
318
|
-
) -> int:
|
|
319
|
-
"""S9-DASH-04: delete a single pattern row by its user-visible
|
|
320
|
-
identity ``(profile_id, pattern_type, pattern_key)``.
|
|
321
|
-
|
|
322
|
-
Used by the dashboard "Delete pattern" button so an operator
|
|
323
|
-
can kill a wrong auto-detected pattern without wiping the full
|
|
324
|
-
table. Returns 1 if a row was deleted, 0 if no match.
|
|
325
|
-
"""
|
|
326
|
-
with self._lock:
|
|
327
|
-
conn = self._connect()
|
|
328
|
-
try:
|
|
329
|
-
cur = conn.execute(
|
|
330
|
-
"DELETE FROM _store_patterns "
|
|
331
|
-
"WHERE profile_id = ? AND pattern_type = ? "
|
|
332
|
-
"AND pattern_key = ?",
|
|
333
|
-
(profile_id, pattern_type, pattern_key),
|
|
334
|
-
)
|
|
335
|
-
conn.commit()
|
|
336
|
-
return cur.rowcount
|
|
337
|
-
finally:
|
|
338
|
-
conn.close()
|
|
339
|
-
|
|
340
|
-
# ------------------------------------------------------------------
|
|
341
|
-
# Internal helpers
|
|
342
|
-
# ------------------------------------------------------------------
|
|
343
|
-
|
|
344
|
-
@staticmethod
|
|
345
|
-
def _compute_confidence(evidence_count: int, success_rate: float) -> float:
|
|
346
|
-
"""Confidence = min(evidence/10, 1.0) * abs(rate - 0.5) * 2.
|
|
347
|
-
|
|
348
|
-
High confidence requires both sufficient evidence AND a success
|
|
349
|
-
rate that deviates significantly from the 50% baseline.
|
|
350
|
-
"""
|
|
351
|
-
evidence_factor = min(evidence_count / 10.0, 1.0)
|
|
352
|
-
deviation_factor = abs(success_rate - 0.5) * 2.0
|
|
353
|
-
return round(evidence_factor * deviation_factor, 4)
|
|
354
|
-
|
|
355
|
-
def _connect(self) -> sqlite3.Connection:
|
|
356
|
-
"""Open a connection with row factory enabled."""
|
|
357
|
-
conn = sqlite3.connect(self._db_path)
|
|
358
|
-
conn.row_factory = sqlite3.Row
|
|
359
|
-
return conn
|
|
360
|
-
|
|
361
|
-
def _ensure_table(self) -> None:
|
|
362
|
-
"""Create the _store_patterns table if it does not exist."""
|
|
363
|
-
conn = self._connect()
|
|
364
|
-
try:
|
|
365
|
-
conn.execute(_CREATE_TABLE)
|
|
366
|
-
conn.execute(_CREATE_INDEX)
|
|
367
|
-
conn.commit()
|
|
368
|
-
finally:
|
|
369
|
-
conn.close()
|
|
370
|
-
|
|
371
|
-
@staticmethod
|
|
372
|
-
def _row_to_dict(row: sqlite3.Row) -> Dict[str, Any]:
|
|
373
|
-
"""Convert a sqlite3.Row into a plain dict with parsed JSON."""
|
|
374
|
-
d = dict(row)
|
|
375
|
-
meta = d.get("metadata", "{}")
|
|
376
|
-
d["metadata"] = json.loads(meta) if isinstance(meta, str) else meta
|
|
377
|
-
return d
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
# ---------------------------------------------------------------------------
|
|
381
|
-
# V3 API — BehavioralTracker (uses DatabaseManager + V3 schema)
|
|
382
|
-
# ---------------------------------------------------------------------------
|
|
383
|
-
|
|
384
|
-
from superlocalmemory.storage.models import BehavioralPattern # noqa: E402
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
class BehavioralTracker:
|
|
388
|
-
"""V3 behavioral pattern tracker using DatabaseManager.
|
|
389
|
-
|
|
390
|
-
Records query patterns (time of day, query type, entity preferences)
|
|
391
|
-
and provides analytics (active hours, type distribution, preferences).
|
|
392
|
-
|
|
393
|
-
Uses the ``behavioral_patterns`` table from the V3 schema.
|
|
394
|
-
"""
|
|
395
|
-
|
|
396
|
-
def __init__(self, db) -> None:
|
|
397
|
-
self._db = db
|
|
398
|
-
|
|
399
|
-
# ------------------------------------------------------------------
|
|
400
|
-
# Recording
|
|
401
|
-
# ------------------------------------------------------------------
|
|
402
|
-
|
|
403
|
-
def record_query(
|
|
404
|
-
self,
|
|
405
|
-
query: str,
|
|
406
|
-
query_type: str,
|
|
407
|
-
entities: list[str],
|
|
408
|
-
profile_id: str,
|
|
409
|
-
) -> None:
|
|
410
|
-
"""Record a query and extract behavioral patterns.
|
|
411
|
-
|
|
412
|
-
Creates up to 3 pattern types per call:
|
|
413
|
-
- ``time_of_day``: hour_N for current hour
|
|
414
|
-
- ``query_type``: keyed by the query_type string
|
|
415
|
-
- ``entity_pref``: one per entity (max 5, lowercased)
|
|
416
|
-
"""
|
|
417
|
-
# 1. Time of day
|
|
418
|
-
hour = datetime.now(timezone.utc).hour
|
|
419
|
-
self._upsert_pattern(profile_id, "time_of_day", f"hour_{hour}")
|
|
420
|
-
|
|
421
|
-
# 2. Query type
|
|
422
|
-
if query_type:
|
|
423
|
-
self._upsert_pattern(profile_id, "query_type", query_type)
|
|
424
|
-
|
|
425
|
-
# 3. Entity preferences (max 5, lowercased)
|
|
426
|
-
for entity in entities[:5]:
|
|
427
|
-
self._upsert_pattern(profile_id, "entity_pref", entity.lower())
|
|
428
|
-
|
|
429
|
-
# ------------------------------------------------------------------
|
|
430
|
-
# Querying
|
|
431
|
-
# ------------------------------------------------------------------
|
|
432
|
-
|
|
433
|
-
def get_patterns(
|
|
434
|
-
self,
|
|
435
|
-
pattern_type: str,
|
|
436
|
-
profile_id: str,
|
|
437
|
-
min_confidence: float = 0.0,
|
|
438
|
-
) -> list[BehavioralPattern]:
|
|
439
|
-
"""Get patterns filtered by type, profile, and min confidence."""
|
|
440
|
-
rows = self._db.execute(
|
|
441
|
-
"SELECT * FROM behavioral_patterns "
|
|
442
|
-
"WHERE profile_id = ? AND pattern_type = ? AND confidence >= ? "
|
|
443
|
-
"ORDER BY confidence DESC",
|
|
444
|
-
(profile_id, pattern_type, min_confidence),
|
|
445
|
-
)
|
|
446
|
-
return [self._row_to_pattern(r) for r in rows]
|
|
447
|
-
|
|
448
|
-
def get_entity_preferences(
|
|
449
|
-
self, profile_id: str, top_k: int = 10
|
|
450
|
-
) -> list[str]:
|
|
451
|
-
"""Top-K preferred entities by confidence, highest first."""
|
|
452
|
-
rows = self._db.execute(
|
|
453
|
-
"SELECT pattern_key FROM behavioral_patterns "
|
|
454
|
-
"WHERE profile_id = ? AND pattern_type = 'entity_pref' "
|
|
455
|
-
"ORDER BY confidence DESC, observation_count DESC LIMIT ?",
|
|
456
|
-
(profile_id, top_k),
|
|
457
|
-
)
|
|
458
|
-
return [dict(r)["pattern_key"] for r in rows]
|
|
459
|
-
|
|
460
|
-
def get_active_hours(self, profile_id: str) -> list[int]:
|
|
461
|
-
"""Top 5 active hours by observation count."""
|
|
462
|
-
rows = self._db.execute(
|
|
463
|
-
"SELECT pattern_key FROM behavioral_patterns "
|
|
464
|
-
"WHERE profile_id = ? AND pattern_type = 'time_of_day' "
|
|
465
|
-
"ORDER BY observation_count DESC LIMIT 5",
|
|
466
|
-
(profile_id,),
|
|
467
|
-
)
|
|
468
|
-
result: list[int] = []
|
|
469
|
-
for r in rows:
|
|
470
|
-
key = dict(r)["pattern_key"]
|
|
471
|
-
if key.startswith("hour_"):
|
|
472
|
-
try:
|
|
473
|
-
result.append(int(key[5:]))
|
|
474
|
-
except ValueError:
|
|
475
|
-
pass
|
|
476
|
-
return result
|
|
477
|
-
|
|
478
|
-
def get_query_type_distribution(self, profile_id: str) -> dict[str, float]:
|
|
479
|
-
"""Proportional distribution of query types."""
|
|
480
|
-
rows = self._db.execute(
|
|
481
|
-
"SELECT pattern_key, observation_count FROM behavioral_patterns "
|
|
482
|
-
"WHERE profile_id = ? AND pattern_type = 'query_type'",
|
|
483
|
-
(profile_id,),
|
|
484
|
-
)
|
|
485
|
-
counts: dict[str, int] = {}
|
|
486
|
-
for r in rows:
|
|
487
|
-
d = dict(r)
|
|
488
|
-
counts[d["pattern_key"]] = d["observation_count"]
|
|
489
|
-
|
|
490
|
-
total = sum(counts.values())
|
|
491
|
-
if total == 0:
|
|
492
|
-
return {}
|
|
493
|
-
return {k: round(v / total, 4) for k, v in counts.items()}
|
|
494
|
-
|
|
495
|
-
# ------------------------------------------------------------------
|
|
496
|
-
# Internal
|
|
497
|
-
# ------------------------------------------------------------------
|
|
498
|
-
|
|
499
|
-
def _upsert_pattern(
|
|
500
|
-
self, profile_id: str, pattern_type: str, pattern_key: str
|
|
501
|
-
) -> None:
|
|
502
|
-
"""Insert or increment a pattern. Confidence = min(count/100, 1.0)."""
|
|
503
|
-
from superlocalmemory.storage.models import _new_id, _now
|
|
504
|
-
|
|
505
|
-
rows = self._db.execute(
|
|
506
|
-
"SELECT pattern_id, observation_count FROM behavioral_patterns "
|
|
507
|
-
"WHERE profile_id = ? AND pattern_type = ? AND pattern_key = ?",
|
|
508
|
-
(profile_id, pattern_type, pattern_key),
|
|
509
|
-
)
|
|
510
|
-
if rows:
|
|
511
|
-
d = dict(rows[0])
|
|
512
|
-
new_count = d["observation_count"] + 1
|
|
513
|
-
new_conf = min(new_count / 100.0, 1.0)
|
|
514
|
-
self._db.execute(
|
|
515
|
-
"UPDATE behavioral_patterns "
|
|
516
|
-
"SET observation_count = ?, confidence = ?, last_updated = ? "
|
|
517
|
-
"WHERE pattern_id = ?",
|
|
518
|
-
(new_count, new_conf, _now(), d["pattern_id"]),
|
|
519
|
-
)
|
|
520
|
-
else:
|
|
521
|
-
self._db.execute(
|
|
522
|
-
"INSERT INTO behavioral_patterns "
|
|
523
|
-
"(pattern_id, profile_id, pattern_type, pattern_key, "
|
|
524
|
-
" pattern_value, confidence, observation_count, last_updated) "
|
|
525
|
-
"VALUES (?, ?, ?, ?, '', ?, 1, ?)",
|
|
526
|
-
(_new_id(), profile_id, pattern_type, pattern_key, 0.01, _now()),
|
|
527
|
-
)
|
|
528
|
-
|
|
529
|
-
@staticmethod
|
|
530
|
-
def _row_to_pattern(row) -> BehavioralPattern:
|
|
531
|
-
"""Convert a DB row to BehavioralPattern."""
|
|
532
|
-
d = dict(row)
|
|
533
|
-
return BehavioralPattern(
|
|
534
|
-
pattern_id=d["pattern_id"],
|
|
535
|
-
profile_id=d["profile_id"],
|
|
536
|
-
pattern_type=d.get("pattern_type", ""),
|
|
537
|
-
pattern_key=d.get("pattern_key", ""),
|
|
538
|
-
pattern_value=d.get("pattern_value", ""),
|
|
539
|
-
confidence=d.get("confidence", 0.0),
|
|
540
|
-
observation_count=d.get("observation_count", 0),
|
|
541
|
-
last_updated=d.get("last_updated", ""),
|
|
542
|
-
)
|