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,737 +0,0 @@
|
|
|
1
|
-
"""manager.py — CacheManager orchestrator (singleton, fail-open, stampede-shielded)."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import hashlib as _hashlib
|
|
6
|
-
import json as _json_mod
|
|
7
|
-
import logging
|
|
8
|
-
import threading
|
|
9
|
-
import time
|
|
10
|
-
from abc import ABC, abstractmethod
|
|
11
|
-
from typing import Any, Callable
|
|
12
|
-
|
|
13
|
-
# C-08: precomputed hash for the common "default" tenant — avoids sha256 on every request
|
|
14
|
-
_DEFAULT_TENANT_HASH: str = _hashlib.sha256(b"default").hexdigest()
|
|
15
|
-
|
|
16
|
-
from superlocalmemory.optimize.cache.exact import ExactCache
|
|
17
|
-
from superlocalmemory.optimize.cache.invalidation import InvalidationEngine
|
|
18
|
-
from superlocalmemory.optimize.cache.key_builder import CacheConfig, KeyBuilder
|
|
19
|
-
from superlocalmemory.optimize.cache.stampede import StampedeShield
|
|
20
|
-
from superlocalmemory.optimize.metrics.counters import MetricsCollector
|
|
21
|
-
from superlocalmemory.optimize.proxy.lifecycle import (
|
|
22
|
-
CachedResponse,
|
|
23
|
-
ProxyRequest,
|
|
24
|
-
ProviderResponse,
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
logger = logging.getLogger(__name__)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# ---------------------------------------------------------------------------
|
|
31
|
-
# SemanticTier interface seam
|
|
32
|
-
# ---------------------------------------------------------------------------
|
|
33
|
-
|
|
34
|
-
class SemanticTier(ABC):
|
|
35
|
-
"""Abstract interface for the semantic cache tier (Phase 3).
|
|
36
|
-
|
|
37
|
-
INTERFACE-CONTRACT §4 conformance: lookup/learn/index_entry/is_enabled.
|
|
38
|
-
Phase 3 (LLD-03) implements VCacheSemantic.
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
@abstractmethod
|
|
42
|
-
def lookup(self, req, tenant_id: str, embed):
|
|
43
|
-
"""Return semantically similar cached response or None. Fail-open."""
|
|
44
|
-
...
|
|
45
|
-
|
|
46
|
-
@abstractmethod
|
|
47
|
-
def learn(self, entry_id: str, similarity: float, was_correct: bool) -> None:
|
|
48
|
-
"""Update per-item MLE model with feedback. Fail-open."""
|
|
49
|
-
...
|
|
50
|
-
|
|
51
|
-
@abstractmethod
|
|
52
|
-
def index_entry(
|
|
53
|
-
self, req, tenant_id: str, embed, resp
|
|
54
|
-
) -> None:
|
|
55
|
-
"""Index a new response vector in the ANN index. Fail-open.
|
|
56
|
-
|
|
57
|
-
INTERFACE-CONTRACT v2 §4: canonical signature
|
|
58
|
-
(self, req, tenant_id, embed, resp).
|
|
59
|
-
"""
|
|
60
|
-
...
|
|
61
|
-
|
|
62
|
-
@abstractmethod
|
|
63
|
-
def is_enabled(self) -> bool: ...
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class NoOpSemantic(SemanticTier):
|
|
67
|
-
"""Phase 1 placeholder (also used when semantic_enabled=False)."""
|
|
68
|
-
|
|
69
|
-
def lookup(self, req, tenant_id: str, embed):
|
|
70
|
-
return None
|
|
71
|
-
|
|
72
|
-
def learn(self, entry_id: str, similarity: float, was_correct: bool) -> None:
|
|
73
|
-
return None
|
|
74
|
-
|
|
75
|
-
def index_entry(self, req, tenant_id: str, embed, resp) -> None:
|
|
76
|
-
return None
|
|
77
|
-
|
|
78
|
-
def is_enabled(self) -> bool:
|
|
79
|
-
return False
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class _LazySemanticEmbedder:
|
|
83
|
-
"""Start the canonical embedding service only after an opted-in lookup."""
|
|
84
|
-
|
|
85
|
-
def __init__(self) -> None:
|
|
86
|
-
self._lock = threading.Lock()
|
|
87
|
-
self._service = None
|
|
88
|
-
|
|
89
|
-
def __call__(self, text: str) -> list[float] | None:
|
|
90
|
-
if self._service is None:
|
|
91
|
-
with self._lock:
|
|
92
|
-
if self._service is None:
|
|
93
|
-
from superlocalmemory.core.config import SLMConfig
|
|
94
|
-
from superlocalmemory.core.embeddings import EmbeddingService
|
|
95
|
-
|
|
96
|
-
self._service = EmbeddingService(SLMConfig.load().embedding)
|
|
97
|
-
return self._service.embed(text)
|
|
98
|
-
|
|
99
|
-
@property
|
|
100
|
-
def dimension(self) -> int:
|
|
101
|
-
from superlocalmemory.core.config import SLMConfig
|
|
102
|
-
|
|
103
|
-
return int(SLMConfig.load().embedding.dimension)
|
|
104
|
-
|
|
105
|
-
def close(self) -> None:
|
|
106
|
-
service = self._service
|
|
107
|
-
self._service = None
|
|
108
|
-
if service is not None:
|
|
109
|
-
try:
|
|
110
|
-
service.unload()
|
|
111
|
-
except Exception:
|
|
112
|
-
pass
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
# ---------------------------------------------------------------------------
|
|
116
|
-
# Metrics
|
|
117
|
-
# ---------------------------------------------------------------------------
|
|
118
|
-
|
|
119
|
-
class CacheMetrics:
|
|
120
|
-
"""Thread-safe counters. A-20 fix: lock guards the two-counter read."""
|
|
121
|
-
|
|
122
|
-
def __init__(self) -> None:
|
|
123
|
-
self._lock = threading.Lock()
|
|
124
|
-
self.exact_hits: int = 0
|
|
125
|
-
self.exact_misses: int = 0
|
|
126
|
-
self.semantic_hits: int = 0
|
|
127
|
-
self.semantic_misses: int = 0
|
|
128
|
-
self.sets: int = 0
|
|
129
|
-
self.skipped_non_cacheable: int = 0
|
|
130
|
-
self.invalidations: int = 0
|
|
131
|
-
self.stampede_contentions: int = 0
|
|
132
|
-
self.errors: int = 0
|
|
133
|
-
|
|
134
|
-
def hit_rate(self) -> float:
|
|
135
|
-
with self._lock:
|
|
136
|
-
total = self.exact_hits + self.exact_misses
|
|
137
|
-
return self.exact_hits / total if total > 0 else 0.0
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
# ---------------------------------------------------------------------------
|
|
141
|
-
# CacheManager
|
|
142
|
-
# ---------------------------------------------------------------------------
|
|
143
|
-
|
|
144
|
-
class CacheManager:
|
|
145
|
-
"""Central orchestrator for the SLM Optimize exact cache."""
|
|
146
|
-
|
|
147
|
-
_instance: "CacheManager | None" = None
|
|
148
|
-
_instance_lock: threading.Lock = threading.Lock()
|
|
149
|
-
|
|
150
|
-
def __init__(
|
|
151
|
-
self,
|
|
152
|
-
db: Any,
|
|
153
|
-
config: CacheConfig | None = None,
|
|
154
|
-
semantic_tier: SemanticTier | None = None,
|
|
155
|
-
) -> None:
|
|
156
|
-
self._db = db
|
|
157
|
-
self._config = config or CacheConfig()
|
|
158
|
-
self._key_builder = KeyBuilder(self._config)
|
|
159
|
-
self._exact = ExactCache(db, self._config)
|
|
160
|
-
self._stampede = StampedeShield(timeout=self._config.stampede_timeout_seconds)
|
|
161
|
-
self._invalidation = InvalidationEngine(db)
|
|
162
|
-
self._semantic = semantic_tier or NoOpSemantic()
|
|
163
|
-
self._metrics = CacheMetrics()
|
|
164
|
-
|
|
165
|
-
@classmethod
|
|
166
|
-
def get_instance(
|
|
167
|
-
cls,
|
|
168
|
-
*,
|
|
169
|
-
optimize_config: Any | None = None,
|
|
170
|
-
semantic_embedder: Callable[[str], list[float] | None] | None = None,
|
|
171
|
-
) -> "CacheManager":
|
|
172
|
-
if cls._instance is None:
|
|
173
|
-
with cls._instance_lock:
|
|
174
|
-
if cls._instance is None:
|
|
175
|
-
from superlocalmemory.optimize.storage.db import CacheDB as _CacheDB
|
|
176
|
-
_db = _CacheDB.get_default()
|
|
177
|
-
cls._instance = cls(db=_db)
|
|
178
|
-
if optimize_config is not None:
|
|
179
|
-
cls._instance.configure_semantic(
|
|
180
|
-
optimize_config,
|
|
181
|
-
embedder=semantic_embedder,
|
|
182
|
-
)
|
|
183
|
-
return cls._instance
|
|
184
|
-
|
|
185
|
-
@classmethod
|
|
186
|
-
def set_instance(cls, instance: "CacheManager") -> None:
|
|
187
|
-
with cls._instance_lock:
|
|
188
|
-
cls._instance = instance
|
|
189
|
-
|
|
190
|
-
@classmethod
|
|
191
|
-
def reset_instance(cls) -> None:
|
|
192
|
-
"""Reset the singleton (testing only)."""
|
|
193
|
-
with cls._instance_lock:
|
|
194
|
-
if cls._instance is not None:
|
|
195
|
-
cls._instance._close_semantic()
|
|
196
|
-
try:
|
|
197
|
-
cls._instance._db.close() # type: ignore[attr-defined]
|
|
198
|
-
except Exception:
|
|
199
|
-
pass
|
|
200
|
-
cls._instance = None
|
|
201
|
-
|
|
202
|
-
# ---- INTERFACE-CONTRACT §4 public methods ----
|
|
203
|
-
|
|
204
|
-
def build_key(self, req: Any, tenant_id: str) -> str | None:
|
|
205
|
-
"""Build a deterministic cache key for req + tenant_id.
|
|
206
|
-
|
|
207
|
-
BUG-FIX (v3.6.3): Two bugs repaired here:
|
|
208
|
-
1. tenant_id="default" failed KeyBuilder's 64-char hex SHA-256 validation,
|
|
209
|
-
silently raising ValueError caught by fail-open wrappers → cache never
|
|
210
|
-
stored or retrieved anything via the proxy path. Fix: normalize any
|
|
211
|
-
non-hex tenant_id to its SHA-256 digest before passing to KeyBuilder.
|
|
212
|
-
2. ProxyRequest objects have a `body` dict, not model_id/messages/system
|
|
213
|
-
attributes. The old `getattr(req, "model_id", "")` path silently
|
|
214
|
-
returned empty strings → all proxy requests got the same (invalid) key.
|
|
215
|
-
Fix: detect ProxyRequest and extract fields from .body.
|
|
216
|
-
"""
|
|
217
|
-
import hashlib as _hashlib
|
|
218
|
-
import json as _json
|
|
219
|
-
import re as _re
|
|
220
|
-
_HEX64 = _re.compile(r"[0-9a-f]{64}")
|
|
221
|
-
# Normalize tenant_id: KeyBuilder requires a 64-char lowercase hex SHA-256.
|
|
222
|
-
if not _HEX64.fullmatch(tenant_id or ""):
|
|
223
|
-
tenant_id = _hashlib.sha256(tenant_id.encode()).hexdigest()
|
|
224
|
-
|
|
225
|
-
if isinstance(req, ProxyRequest) and req.provider == "vertex":
|
|
226
|
-
# LOCKED: Vertex bodies have NO model/messages/system.
|
|
227
|
-
# Model is in the PATH; prompts are under 'contents'; system under
|
|
228
|
-
# 'systemInstruction'. Without this branch ALL Vertex requests hash to
|
|
229
|
-
# ONE key → first response poisons every subsequent prompt.
|
|
230
|
-
body = req.body or {}
|
|
231
|
-
model_id = _vertex_model_from_path(req.path)
|
|
232
|
-
# SECURITY (Stage-8 audit): fold project + region into the model
|
|
233
|
-
# identity so two GCP projects (or regions) issuing the same prompt
|
|
234
|
-
# never collide to one cache entry → no cross-tenant response leakage.
|
|
235
|
-
# Model name alone is insufficient (the same model exists in every
|
|
236
|
-
# project). key_builder whitelist-filters raw_params, so extra param
|
|
237
|
-
# keys would be dropped — model_id IS hashed. _KEY_SCHEMA_VERSION
|
|
238
|
-
# unchanged (vertex is a new provider; no live vertex cache; the
|
|
239
|
-
# non-vertex branches are untouched).
|
|
240
|
-
_vproj, _vloc = _vertex_project_location_from_path(req.path)
|
|
241
|
-
if _vproj or _vloc:
|
|
242
|
-
model_id = f"vertex:{_vproj}:{_vloc}:{model_id}"
|
|
243
|
-
messages = body.get("contents", []) or []
|
|
244
|
-
system_raw = body.get("systemInstruction", "") or ""
|
|
245
|
-
if isinstance(system_raw, (dict, list)):
|
|
246
|
-
system = _json.dumps(system_raw, sort_keys=True, separators=(",", ":"))
|
|
247
|
-
else:
|
|
248
|
-
system = str(system_raw)
|
|
249
|
-
# params: everything except the fields extracted above and stream flag.
|
|
250
|
-
_SKIP_VERTEX = frozenset({"contents", "systemInstruction", "stream"})
|
|
251
|
-
params = {k: v for k, v in body.items() if k not in _SKIP_VERTEX}
|
|
252
|
-
elif isinstance(req, ProxyRequest):
|
|
253
|
-
# Extract semantic fields from the parsed JSON body.
|
|
254
|
-
body = req.body or {}
|
|
255
|
-
model_id = body.get("model", "") or ""
|
|
256
|
-
messages = body.get("messages", []) or []
|
|
257
|
-
system_raw = body.get("system", "") or ""
|
|
258
|
-
# Anthropic allows system as a list of content blocks — normalise to str.
|
|
259
|
-
if isinstance(system_raw, list):
|
|
260
|
-
system = _json.dumps(system_raw, sort_keys=True, separators=(",", ":"))
|
|
261
|
-
else:
|
|
262
|
-
system = str(system_raw)
|
|
263
|
-
# params: everything except fields extracted above and stream flag.
|
|
264
|
-
_SKIP = frozenset({"model", "messages", "system", "stream"})
|
|
265
|
-
params = {k: v for k, v in body.items() if k not in _SKIP}
|
|
266
|
-
elif isinstance(req, dict):
|
|
267
|
-
model_id = req.get("model", "") or ""
|
|
268
|
-
messages = req.get("messages", []) or []
|
|
269
|
-
params = req.get("params", {}) or {}
|
|
270
|
-
system = req.get("system", "") or ""
|
|
271
|
-
else:
|
|
272
|
-
model_id = getattr(req, "model_id", "") or ""
|
|
273
|
-
messages = getattr(req, "messages", []) or []
|
|
274
|
-
params = getattr(req, "params", {}) or {}
|
|
275
|
-
system = getattr(req, "system", "") or ""
|
|
276
|
-
return self._key_builder.build(
|
|
277
|
-
tenant_id=tenant_id,
|
|
278
|
-
model_id=model_id,
|
|
279
|
-
model_version="",
|
|
280
|
-
system=system,
|
|
281
|
-
messages=messages,
|
|
282
|
-
raw_params=params,
|
|
283
|
-
)
|
|
284
|
-
|
|
285
|
-
def get(self, req: Any, tenant_id: str) -> "CachedResponse | None":
|
|
286
|
-
"""CacheHook.check() entry point.
|
|
287
|
-
|
|
288
|
-
BUG-FIX (v3.6.3): Previously returned None on cache miss, which caused
|
|
289
|
-
_safe_cache_check to return CachedResponse(cache_key=""). The empty
|
|
290
|
-
cache_key is falsy, so the store condition in handle_messages
|
|
291
|
-
(``cache_result.cache_key``) was always False → cache was NEVER
|
|
292
|
-
populated. Fix: return a miss CachedResponse that carries the computed
|
|
293
|
-
key so the store path can proceed.
|
|
294
|
-
"""
|
|
295
|
-
key = self.build_key(req, tenant_id)
|
|
296
|
-
if key is None:
|
|
297
|
-
# Uncacheable (non-zero temperature, etc.) — signal with None.
|
|
298
|
-
return None
|
|
299
|
-
row = self._exact.get(key, tenant_id)
|
|
300
|
-
if row is not None:
|
|
301
|
-
self._metrics.exact_hits += 1
|
|
302
|
-
return CachedResponse(
|
|
303
|
-
hit=True,
|
|
304
|
-
data=json_dumps_bytes(row),
|
|
305
|
-
cache_key=key,
|
|
306
|
-
ttl_seconds=0,
|
|
307
|
-
)
|
|
308
|
-
self._metrics.exact_misses += 1
|
|
309
|
-
|
|
310
|
-
# C-01: semantic fallback on exact miss (only when explicitly enabled)
|
|
311
|
-
if self._semantic.is_enabled():
|
|
312
|
-
try:
|
|
313
|
-
sem_result = self._semantic.lookup(req, tenant_id, None)
|
|
314
|
-
if sem_result is not None:
|
|
315
|
-
self._metrics.semantic_hits += 1
|
|
316
|
-
if isinstance(sem_result, CachedResponse):
|
|
317
|
-
return sem_result
|
|
318
|
-
# VCacheSemantic may return a response dict — wrap it
|
|
319
|
-
return CachedResponse(
|
|
320
|
-
hit=True,
|
|
321
|
-
data=_json_mod.dumps(sem_result, ensure_ascii=False).encode(),
|
|
322
|
-
cache_key=key,
|
|
323
|
-
ttl_seconds=0,
|
|
324
|
-
)
|
|
325
|
-
except Exception as exc:
|
|
326
|
-
logger.warning("SemanticTier.lookup raised (fail-open): %s", exc)
|
|
327
|
-
self._metrics.semantic_misses += 1
|
|
328
|
-
|
|
329
|
-
# Return miss WITH the key so callers can use it for cache storage.
|
|
330
|
-
return CachedResponse(hit=False, data=None, cache_key=key, ttl_seconds=0)
|
|
331
|
-
|
|
332
|
-
def set(self, req: Any, resp: Any, tenant_id: str) -> None:
|
|
333
|
-
"""CacheHook.store() entry point."""
|
|
334
|
-
import json as _json
|
|
335
|
-
key = self.build_key(req, tenant_id)
|
|
336
|
-
if key is None:
|
|
337
|
-
return
|
|
338
|
-
if isinstance(req, ProxyRequest):
|
|
339
|
-
model_id = (req.body or {}).get("model", "") or ""
|
|
340
|
-
elif isinstance(req, dict):
|
|
341
|
-
model_id = req.get("model", "") or ""
|
|
342
|
-
else:
|
|
343
|
-
model_id = getattr(req, "model_id", "") or ""
|
|
344
|
-
tags = [
|
|
345
|
-
self._key_builder.model_tag(model_id),
|
|
346
|
-
self._key_builder.tenant_tag(tenant_id),
|
|
347
|
-
]
|
|
348
|
-
# resp may be ProviderResponse (proxy) or dict (manager)
|
|
349
|
-
if isinstance(resp, dict):
|
|
350
|
-
response_dict = resp
|
|
351
|
-
else:
|
|
352
|
-
response_dict = _json.loads(resp.body_bytes) if hasattr(resp, "body_bytes") else {}
|
|
353
|
-
self._exact.set(key, tenant_id, response_dict, tags, model_id)
|
|
354
|
-
self._invalidation.register(key, tenant_id, tags)
|
|
355
|
-
self._metrics.sets += 1
|
|
356
|
-
|
|
357
|
-
# C-02: index in semantic tier after exact write (fail-open)
|
|
358
|
-
if self._semantic.is_enabled():
|
|
359
|
-
try:
|
|
360
|
-
self._semantic.index_entry(req, tenant_id, None, response_dict)
|
|
361
|
-
except Exception as exc:
|
|
362
|
-
logger.warning("SemanticTier.index_entry raised (fail-open): %s", exc)
|
|
363
|
-
|
|
364
|
-
# ---- CacheHook protocol implementation (INTERFACE-CONTRACT §3) ----
|
|
365
|
-
|
|
366
|
-
def check(
|
|
367
|
-
self, req: ProxyRequest, tenant_id: "str | None" = _DEFAULT_TENANT_HASH
|
|
368
|
-
) -> "CachedResponse | None":
|
|
369
|
-
"""CacheHook.check() — look up by ProxyRequest; fail-open on error.
|
|
370
|
-
|
|
371
|
-
BUG-FIX (v3.6.3): on_miss() was never called from the proxy path,
|
|
372
|
-
so MetricsCollector.misses stayed at 0 and the dashboard always showed
|
|
373
|
-
0 misses. Fixed by calling on_miss() here whenever get() returns a
|
|
374
|
-
cache-miss result.
|
|
375
|
-
|
|
376
|
-
SECURITY (WP-D): tenant_id is now optional. Surface handlers pass the
|
|
377
|
-
credential-derived tenant so that different API keys never share a cache
|
|
378
|
-
entry. When tenant_id is None (unauthenticated / no credential) the
|
|
379
|
-
cache is SKIPPED entirely — returns None without reading the store.
|
|
380
|
-
The default preserves backward compatibility for callers that do not
|
|
381
|
-
pass a tenant_id.
|
|
382
|
-
"""
|
|
383
|
-
if tenant_id is None:
|
|
384
|
-
# No credential → refuse to serve or populate the cache.
|
|
385
|
-
return None
|
|
386
|
-
try:
|
|
387
|
-
result = self.get(req, tenant_id=tenant_id)
|
|
388
|
-
if result is not None and not result.hit:
|
|
389
|
-
MetricsCollector.get_instance().on_miss()
|
|
390
|
-
return result
|
|
391
|
-
except Exception as exc:
|
|
392
|
-
logger.warning("CacheManager.check raised (fail-open): %s", exc)
|
|
393
|
-
return None
|
|
394
|
-
|
|
395
|
-
def store(
|
|
396
|
-
self, req: ProxyRequest, resp: ProviderResponse,
|
|
397
|
-
tenant_id: "str | None" = _DEFAULT_TENANT_HASH,
|
|
398
|
-
) -> None:
|
|
399
|
-
"""CacheHook.store() — persist response; fail-open on error.
|
|
400
|
-
|
|
401
|
-
SECURITY (WP-D): tenant_id is now optional. When None (unauthenticated)
|
|
402
|
-
the store is silently skipped to prevent anonymous requests from
|
|
403
|
-
populating the cache and leaking responses to other tenants.
|
|
404
|
-
"""
|
|
405
|
-
if tenant_id is None:
|
|
406
|
-
return
|
|
407
|
-
try:
|
|
408
|
-
self.set(req, resp, tenant_id=tenant_id)
|
|
409
|
-
except Exception as exc:
|
|
410
|
-
logger.warning("CacheManager.store raised (fail-open): %s", exc)
|
|
411
|
-
|
|
412
|
-
def on_hit(self, req: ProxyRequest, resp: bytes, tokens_saved: int) -> None:
|
|
413
|
-
"""CacheHook.on_hit() — forward token savings to MetricsCollector.
|
|
414
|
-
|
|
415
|
-
M-01: compute input tokens from request body when caller passes 0.
|
|
416
|
-
M-02: parse real output tokens from cached response usage field.
|
|
417
|
-
All counts are estimates for display — not billing-accurate.
|
|
418
|
-
"""
|
|
419
|
-
import json as _json
|
|
420
|
-
|
|
421
|
-
# M-01: estimate input tokens from message content
|
|
422
|
-
if tokens_saved == 0 and isinstance(req, ProxyRequest):
|
|
423
|
-
try:
|
|
424
|
-
body = req.body or {}
|
|
425
|
-
total_chars = 0
|
|
426
|
-
for m in (body.get("messages") or []):
|
|
427
|
-
c = m.get("content", "")
|
|
428
|
-
if isinstance(c, str):
|
|
429
|
-
total_chars += len(c)
|
|
430
|
-
elif isinstance(c, list):
|
|
431
|
-
for blk in c:
|
|
432
|
-
if isinstance(blk, dict):
|
|
433
|
-
total_chars += len(blk.get("text", "") or "")
|
|
434
|
-
total_chars += len(body.get("system", "") or "")
|
|
435
|
-
tokens_saved = max(0, total_chars // 4)
|
|
436
|
-
except Exception:
|
|
437
|
-
pass
|
|
438
|
-
|
|
439
|
-
# M-02: parse real output tokens from stored response
|
|
440
|
-
output_tokens = 0
|
|
441
|
-
if resp:
|
|
442
|
-
try:
|
|
443
|
-
data = _json.loads(resp)
|
|
444
|
-
usage = data.get("usage") or {}
|
|
445
|
-
output_tokens = (
|
|
446
|
-
usage.get("output_tokens")
|
|
447
|
-
or usage.get("completion_tokens")
|
|
448
|
-
or 0
|
|
449
|
-
)
|
|
450
|
-
except Exception:
|
|
451
|
-
output_tokens = len(resp) // 4 # fallback byte-estimate
|
|
452
|
-
|
|
453
|
-
MetricsCollector.get_instance().on_hit(
|
|
454
|
-
tokens_saved_input=tokens_saved,
|
|
455
|
-
tokens_saved_output=output_tokens,
|
|
456
|
-
)
|
|
457
|
-
|
|
458
|
-
def on_miss(self, req: ProxyRequest) -> None:
|
|
459
|
-
"""CacheHook.on_miss() — forward miss event to MetricsCollector."""
|
|
460
|
-
MetricsCollector.get_instance().on_miss()
|
|
461
|
-
|
|
462
|
-
def set_semantic_tier(self, tier: SemanticTier) -> None:
|
|
463
|
-
self._close_semantic()
|
|
464
|
-
self._semantic = tier
|
|
465
|
-
|
|
466
|
-
def _close_semantic(self) -> None:
|
|
467
|
-
close = getattr(self._semantic, "close", None)
|
|
468
|
-
if callable(close):
|
|
469
|
-
try:
|
|
470
|
-
close()
|
|
471
|
-
except Exception:
|
|
472
|
-
pass
|
|
473
|
-
|
|
474
|
-
def configure_semantic(
|
|
475
|
-
self,
|
|
476
|
-
optimize_config: Any,
|
|
477
|
-
*,
|
|
478
|
-
embedder: Callable[[str], list[float] | None] | None = None,
|
|
479
|
-
) -> None:
|
|
480
|
-
"""Wire or disable the real semantic tier from live proxy config."""
|
|
481
|
-
enabled = bool(getattr(optimize_config, "semantic_enabled", False))
|
|
482
|
-
if not enabled:
|
|
483
|
-
if not isinstance(self._semantic, NoOpSemantic):
|
|
484
|
-
self.set_semantic_tier(NoOpSemantic())
|
|
485
|
-
return
|
|
486
|
-
|
|
487
|
-
from superlocalmemory.optimize.cache.semantic import VCacheSemantic
|
|
488
|
-
|
|
489
|
-
desired_embedder = embedder or _LazySemanticEmbedder()
|
|
490
|
-
current = self._semantic
|
|
491
|
-
if (
|
|
492
|
-
isinstance(current, VCacheSemantic)
|
|
493
|
-
and current._config == optimize_config
|
|
494
|
-
and (embedder is None or current._embedder is embedder)
|
|
495
|
-
):
|
|
496
|
-
return
|
|
497
|
-
self.set_semantic_tier(VCacheSemantic(
|
|
498
|
-
db=self._db,
|
|
499
|
-
config=optimize_config,
|
|
500
|
-
embedder=desired_embedder,
|
|
501
|
-
embedding_dimension=getattr(desired_embedder, "dimension", None),
|
|
502
|
-
))
|
|
503
|
-
|
|
504
|
-
# ---- core request path ----
|
|
505
|
-
|
|
506
|
-
def get_or_call(
|
|
507
|
-
self,
|
|
508
|
-
*,
|
|
509
|
-
tenant_id: str,
|
|
510
|
-
model_id: str,
|
|
511
|
-
model_version: str,
|
|
512
|
-
system: str,
|
|
513
|
-
messages: list,
|
|
514
|
-
raw_params: dict,
|
|
515
|
-
upstream_fn: Callable[[], dict],
|
|
516
|
-
http_status: int = 200,
|
|
517
|
-
ttl: int | None = None,
|
|
518
|
-
extra_tags: list | None = None,
|
|
519
|
-
) -> dict:
|
|
520
|
-
from types import SimpleNamespace as _NS
|
|
521
|
-
_req = _NS(
|
|
522
|
-
model_id=model_id, model_version=model_version,
|
|
523
|
-
system=system, messages=messages, params=raw_params,
|
|
524
|
-
)
|
|
525
|
-
try:
|
|
526
|
-
return self._get_or_call_inner(
|
|
527
|
-
req=_req,
|
|
528
|
-
tenant_id=tenant_id, model_id=model_id, model_version=model_version,
|
|
529
|
-
system=system, messages=messages, raw_params=raw_params,
|
|
530
|
-
upstream_fn=upstream_fn, http_status=http_status,
|
|
531
|
-
ttl=ttl, extra_tags=extra_tags or [],
|
|
532
|
-
)
|
|
533
|
-
except Exception as exc:
|
|
534
|
-
logger.error(
|
|
535
|
-
"CacheManager.get_or_call failed — falling through to upstream: %s", exc,
|
|
536
|
-
exc_info=True,
|
|
537
|
-
)
|
|
538
|
-
self._metrics.errors += 1
|
|
539
|
-
return upstream_fn()
|
|
540
|
-
|
|
541
|
-
def _get_or_call_inner(
|
|
542
|
-
self,
|
|
543
|
-
*,
|
|
544
|
-
req: Any,
|
|
545
|
-
tenant_id: str,
|
|
546
|
-
model_id: str,
|
|
547
|
-
model_version: str,
|
|
548
|
-
system: str,
|
|
549
|
-
messages: list,
|
|
550
|
-
raw_params: dict,
|
|
551
|
-
upstream_fn: Callable[[], dict],
|
|
552
|
-
http_status: int,
|
|
553
|
-
ttl: int | None,
|
|
554
|
-
extra_tags: list,
|
|
555
|
-
) -> dict:
|
|
556
|
-
key = self._key_builder.build(
|
|
557
|
-
tenant_id=tenant_id, model_id=model_id, model_version=model_version,
|
|
558
|
-
system=system, messages=messages, raw_params=raw_params,
|
|
559
|
-
)
|
|
560
|
-
if key is None:
|
|
561
|
-
self._metrics.exact_misses += 1
|
|
562
|
-
return upstream_fn()
|
|
563
|
-
|
|
564
|
-
cached = self._exact.get(key, tenant_id)
|
|
565
|
-
if cached is not None:
|
|
566
|
-
self._metrics.exact_hits += 1
|
|
567
|
-
return cached
|
|
568
|
-
|
|
569
|
-
if self._semantic.is_enabled():
|
|
570
|
-
# vCache path: exact miss → optional semantic hit
|
|
571
|
-
# (CacheManager does not pre-embed; the semantic tier embeds
|
|
572
|
-
# lazily via its injected EmbeddingService. The VCache lookup
|
|
573
|
-
# returns a response dict or None on miss/explore.)
|
|
574
|
-
try:
|
|
575
|
-
sem_hit = self._semantic.lookup(req, tenant_id, None)
|
|
576
|
-
if sem_hit is not None:
|
|
577
|
-
self._metrics.semantic_hits += 1
|
|
578
|
-
return sem_hit
|
|
579
|
-
except Exception as exc:
|
|
580
|
-
logger.warning("SemanticTier.lookup raised (fail-open): %s", exc)
|
|
581
|
-
self._metrics.semantic_misses += 1
|
|
582
|
-
|
|
583
|
-
self._metrics.exact_misses += 1
|
|
584
|
-
|
|
585
|
-
with self._stampede.lock(key):
|
|
586
|
-
cached = self._exact.get(key, tenant_id)
|
|
587
|
-
if cached is not None:
|
|
588
|
-
self._metrics.stampede_contentions += 1
|
|
589
|
-
return cached
|
|
590
|
-
|
|
591
|
-
response = upstream_fn()
|
|
592
|
-
|
|
593
|
-
if 200 <= http_status < 300:
|
|
594
|
-
tags = [
|
|
595
|
-
self._key_builder.model_tag(model_id),
|
|
596
|
-
self._key_builder.tenant_tag(tenant_id),
|
|
597
|
-
*extra_tags,
|
|
598
|
-
]
|
|
599
|
-
stored = self._exact.set(key, tenant_id, response, tags, model_id, ttl)
|
|
600
|
-
if stored:
|
|
601
|
-
self._invalidation.register(key, tenant_id, tags)
|
|
602
|
-
self._metrics.sets += 1
|
|
603
|
-
else:
|
|
604
|
-
self._metrics.skipped_non_cacheable += 1
|
|
605
|
-
|
|
606
|
-
return response
|
|
607
|
-
|
|
608
|
-
# ---- tenant scoping ----
|
|
609
|
-
|
|
610
|
-
def for_tenant(self, tenant_id: str) -> "_TenantScopedManager":
|
|
611
|
-
return _TenantScopedManager(manager=self, tenant_id=tenant_id)
|
|
612
|
-
|
|
613
|
-
# ---- invalidation API ----
|
|
614
|
-
|
|
615
|
-
def invalidate_tag(self, tag: str) -> int:
|
|
616
|
-
count = self._invalidation.invalidate_tag(tag)
|
|
617
|
-
self._metrics.invalidations += count
|
|
618
|
-
return count
|
|
619
|
-
|
|
620
|
-
def invalidate_by_tag(self, tag: str) -> int:
|
|
621
|
-
"""INTERFACE-CONTRACT v2 §4: delegate to invalidation engine by tag."""
|
|
622
|
-
return self.invalidate_tag(tag)
|
|
623
|
-
|
|
624
|
-
def invalidate_model(self, model_id: str) -> int:
|
|
625
|
-
return self.invalidate_tag(f"model:{model_id}")
|
|
626
|
-
|
|
627
|
-
def invalidate_tenant(self, tenant_id: str) -> int:
|
|
628
|
-
return self.invalidate_tag(f"tenant:{tenant_id}")
|
|
629
|
-
|
|
630
|
-
@property
|
|
631
|
-
def metrics(self) -> CacheMetrics:
|
|
632
|
-
return self._metrics
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
class _TenantScopedManager:
|
|
636
|
-
"""Thin view over CacheManager with tenant_id pre-filled."""
|
|
637
|
-
|
|
638
|
-
def __init__(self, manager: CacheManager, tenant_id: str) -> None:
|
|
639
|
-
self._m = manager
|
|
640
|
-
self._tenant_id = tenant_id
|
|
641
|
-
|
|
642
|
-
def get_or_call(
|
|
643
|
-
self,
|
|
644
|
-
*,
|
|
645
|
-
model_id: str,
|
|
646
|
-
model_version: str,
|
|
647
|
-
system: str,
|
|
648
|
-
messages: list,
|
|
649
|
-
raw_params: dict,
|
|
650
|
-
upstream_fn: Callable[[], dict],
|
|
651
|
-
http_status: int = 200,
|
|
652
|
-
ttl: int | None = None,
|
|
653
|
-
extra_tags: list | None = None,
|
|
654
|
-
) -> dict:
|
|
655
|
-
return self._m.get_or_call(
|
|
656
|
-
tenant_id=self._tenant_id,
|
|
657
|
-
model_id=model_id,
|
|
658
|
-
model_version=model_version,
|
|
659
|
-
system=system,
|
|
660
|
-
messages=messages,
|
|
661
|
-
raw_params=raw_params,
|
|
662
|
-
upstream_fn=upstream_fn,
|
|
663
|
-
http_status=http_status,
|
|
664
|
-
ttl=ttl,
|
|
665
|
-
extra_tags=extra_tags,
|
|
666
|
-
)
|
|
667
|
-
|
|
668
|
-
def get(self, key: str) -> bytes | None:
|
|
669
|
-
row = self._m._exact.get(key, self._tenant_id)
|
|
670
|
-
if row is None:
|
|
671
|
-
return None
|
|
672
|
-
import json as _json
|
|
673
|
-
return _json.dumps(row).encode("utf-8")
|
|
674
|
-
|
|
675
|
-
def set(self, key: str, value: bytes) -> None:
|
|
676
|
-
# Adapter-friendly write path: not used in Phase 1.
|
|
677
|
-
import json as _json
|
|
678
|
-
try:
|
|
679
|
-
decoded = _json.loads(value.decode("utf-8"))
|
|
680
|
-
except Exception:
|
|
681
|
-
return
|
|
682
|
-
self._m._exact.set(
|
|
683
|
-
key, self._tenant_id, decoded, [], "", None,
|
|
684
|
-
)
|
|
685
|
-
|
|
686
|
-
def invalidate_all(self) -> int:
|
|
687
|
-
return self._m.invalidate_tenant(self._tenant_id)
|
|
688
|
-
|
|
689
|
-
@property
|
|
690
|
-
def metrics(self) -> CacheMetrics:
|
|
691
|
-
return self._m.metrics
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
# ---------------------------------------------------------------------------
|
|
695
|
-
# Helper
|
|
696
|
-
# ---------------------------------------------------------------------------
|
|
697
|
-
|
|
698
|
-
def json_dumps_bytes(d: dict) -> bytes:
|
|
699
|
-
import json as _json
|
|
700
|
-
return _json.dumps(d, separators=(",", ":"), default=str).encode("utf-8")
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
# ---------------------------------------------------------------------------
|
|
704
|
-
# Vertex helpers
|
|
705
|
-
# ---------------------------------------------------------------------------
|
|
706
|
-
|
|
707
|
-
def _vertex_project_location_from_path(path: str) -> tuple[str, str]:
|
|
708
|
-
"""Extract (project, location) from a Vertex proxy path for cache isolation.
|
|
709
|
-
|
|
710
|
-
Without project+region in the cache key, two GCP projects (or regions)
|
|
711
|
-
issuing an identical prompt collide to one entry → cross-tenant response
|
|
712
|
-
leakage (Stage-8 security finding). Returns ("", "") on parse failure.
|
|
713
|
-
"""
|
|
714
|
-
import re as _re
|
|
715
|
-
m = _re.search(
|
|
716
|
-
r"projects/([a-zA-Z0-9._\-]{1,63})/locations/([a-z0-9\-]{1,40})/",
|
|
717
|
-
path or "",
|
|
718
|
-
)
|
|
719
|
-
return (m.group(1), m.group(2)) if m else ("", "")
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
def _vertex_model_from_path(path: str) -> str:
|
|
723
|
-
"""Extract the model name from a Vertex proxy path.
|
|
724
|
-
|
|
725
|
-
Handles both the FastAPI path parameter form:
|
|
726
|
-
/v1/projects/{project}/locations/{loc}/publishers/google/models/{model}:{method}
|
|
727
|
-
and the raw vertex_path parameter:
|
|
728
|
-
{project}/locations/{loc}/publishers/google/models/{model}:{method}
|
|
729
|
-
|
|
730
|
-
Returns empty string on parse failure (key_builder treats it as uncacheable-neutral).
|
|
731
|
-
"""
|
|
732
|
-
import re as _re
|
|
733
|
-
_MODEL_RE = _re.compile(r"/models/([a-zA-Z0-9._\-]{1,128}):")
|
|
734
|
-
m = _MODEL_RE.search(path)
|
|
735
|
-
if m:
|
|
736
|
-
return m.group(1)
|
|
737
|
-
return ""
|