superlocalmemory 4.1.13 → 4.1.15
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 +103 -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,266 +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
|
-
"""Ollama Embedding Provider — lightweight HTTP-based embeddings.
|
|
6
|
-
|
|
7
|
-
Uses Ollama's /api/embed endpoint for fast local embeddings without
|
|
8
|
-
loading PyTorch or sentence-transformers into the process.
|
|
9
|
-
|
|
10
|
-
Typical latency: <1 second (vs 30s cold start for sentence-transformers).
|
|
11
|
-
Memory: ~0 MB in the SLM process (Ollama manages its own memory).
|
|
12
|
-
|
|
13
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from __future__ import annotations
|
|
17
|
-
|
|
18
|
-
import logging
|
|
19
|
-
from typing import TYPE_CHECKING
|
|
20
|
-
|
|
21
|
-
import numpy as np
|
|
22
|
-
|
|
23
|
-
if TYPE_CHECKING:
|
|
24
|
-
pass
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger(__name__)
|
|
27
|
-
|
|
28
|
-
# Fisher variance constants (must match EmbeddingService)
|
|
29
|
-
_FISHER_VAR_MIN = 0.05
|
|
30
|
-
_FISHER_VAR_MAX = 2.0
|
|
31
|
-
_FISHER_VAR_RANGE = _FISHER_VAR_MAX - _FISHER_VAR_MIN
|
|
32
|
-
|
|
33
|
-
# Ollama connect/response timeouts
|
|
34
|
-
_CONNECT_TIMEOUT = 5.0
|
|
35
|
-
_RESPONSE_TIMEOUT = 30.0
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class OllamaEmbedder:
|
|
39
|
-
"""Embedding service backed by a local Ollama instance.
|
|
40
|
-
|
|
41
|
-
Drop-in replacement for EmbeddingService. Implements the same
|
|
42
|
-
public interface (embed, embed_batch, compute_fisher_params,
|
|
43
|
-
is_available, dimension) so the engine can swap transparently.
|
|
44
|
-
|
|
45
|
-
V3.3.27: Session-scoped LRU cache eliminates redundant HTTP calls.
|
|
46
|
-
The store pipeline calls embed() 200+ times for the same texts
|
|
47
|
-
across different components (type_router, scene_builder, consolidator,
|
|
48
|
-
entropy_gate, sheaf_checker). Caching avoids ~215 Ollama roundtrips
|
|
49
|
-
per remember call, reducing latency from 30s to ~3s on Mode B.
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
_CACHE_MAX_SIZE = 2048 # entries — covers a full store + recall cycle
|
|
53
|
-
|
|
54
|
-
def __init__(
|
|
55
|
-
self,
|
|
56
|
-
model: str = "nomic-embed-text",
|
|
57
|
-
base_url: str = "http://localhost:11434",
|
|
58
|
-
dimension: int = 768,
|
|
59
|
-
) -> None:
|
|
60
|
-
self._model = model
|
|
61
|
-
self._base_url = base_url.rstrip("/")
|
|
62
|
-
self._dimension = dimension
|
|
63
|
-
self._available: bool | None = None # lazy-checked
|
|
64
|
-
# V3.3.27: Session-scoped embedding cache (text -> normalized vector)
|
|
65
|
-
self._embed_cache: dict[str, list[float]] = {}
|
|
66
|
-
self._cache_hits: int = 0
|
|
67
|
-
self._cache_misses: int = 0
|
|
68
|
-
|
|
69
|
-
# ------------------------------------------------------------------
|
|
70
|
-
# Public interface (matches EmbeddingService)
|
|
71
|
-
# ------------------------------------------------------------------
|
|
72
|
-
|
|
73
|
-
@property
|
|
74
|
-
def is_available(self) -> bool:
|
|
75
|
-
"""Check if Ollama is reachable and the model is pulled."""
|
|
76
|
-
if self._available is not None:
|
|
77
|
-
return self._available
|
|
78
|
-
self._available = self._check_availability()
|
|
79
|
-
return self._available
|
|
80
|
-
|
|
81
|
-
@property
|
|
82
|
-
def dimension(self) -> int:
|
|
83
|
-
return self._dimension
|
|
84
|
-
|
|
85
|
-
def embed(self, text: str) -> list[float] | None:
|
|
86
|
-
"""Embed a single text. Returns normalized vector or None on failure.
|
|
87
|
-
|
|
88
|
-
V3.3.27: Returns cached result if the same text was embedded
|
|
89
|
-
earlier in this session, avoiding redundant Ollama HTTP calls.
|
|
90
|
-
"""
|
|
91
|
-
if not text or not text.strip():
|
|
92
|
-
raise ValueError("Cannot embed empty text")
|
|
93
|
-
from superlocalmemory.core.recall_gate import wait_for_foreground_idle
|
|
94
|
-
wait_for_foreground_idle()
|
|
95
|
-
|
|
96
|
-
# V3.3.27: Check cache first
|
|
97
|
-
cache_key = text.strip()
|
|
98
|
-
if cache_key in self._embed_cache:
|
|
99
|
-
self._cache_hits += 1
|
|
100
|
-
return self._embed_cache[cache_key]
|
|
101
|
-
|
|
102
|
-
try:
|
|
103
|
-
result = self._call_ollama_embed(text)
|
|
104
|
-
# Cache the result (evict oldest if over limit)
|
|
105
|
-
if result is not None:
|
|
106
|
-
if len(self._embed_cache) >= self._CACHE_MAX_SIZE:
|
|
107
|
-
# Evict first entry (oldest insertion)
|
|
108
|
-
first_key = next(iter(self._embed_cache))
|
|
109
|
-
del self._embed_cache[first_key]
|
|
110
|
-
self._embed_cache[cache_key] = result
|
|
111
|
-
self._cache_misses += 1
|
|
112
|
-
return result
|
|
113
|
-
except Exception as exc:
|
|
114
|
-
logger.warning("Ollama embed failed: %s", exc)
|
|
115
|
-
return None
|
|
116
|
-
|
|
117
|
-
def embed_batch(self, texts: list[str]) -> list[list[float] | None]:
|
|
118
|
-
"""Embed a batch of texts. Uses the batch API when available.
|
|
119
|
-
|
|
120
|
-
V3.3.27: Skips already-cached texts, only sends uncached to Ollama.
|
|
121
|
-
"""
|
|
122
|
-
if not texts:
|
|
123
|
-
raise ValueError("Cannot embed empty batch")
|
|
124
|
-
from superlocalmemory.core.recall_gate import is_background_work
|
|
125
|
-
if is_background_work():
|
|
126
|
-
return [self.embed(text) for text in texts]
|
|
127
|
-
|
|
128
|
-
# V3.3.27: Split into cached and uncached
|
|
129
|
-
results: list[list[float] | None] = [None] * len(texts)
|
|
130
|
-
uncached_indices: list[int] = []
|
|
131
|
-
uncached_texts: list[str] = []
|
|
132
|
-
|
|
133
|
-
for i, text in enumerate(texts):
|
|
134
|
-
key = text.strip()
|
|
135
|
-
if key in self._embed_cache:
|
|
136
|
-
results[i] = self._embed_cache[key]
|
|
137
|
-
self._cache_hits += 1
|
|
138
|
-
else:
|
|
139
|
-
uncached_indices.append(i)
|
|
140
|
-
uncached_texts.append(text)
|
|
141
|
-
|
|
142
|
-
if not uncached_texts:
|
|
143
|
-
return results # All cached — zero HTTP calls
|
|
144
|
-
|
|
145
|
-
try:
|
|
146
|
-
batch_results = self._call_ollama_embed_batch(uncached_texts)
|
|
147
|
-
for idx, emb in zip(uncached_indices, batch_results):
|
|
148
|
-
results[idx] = emb
|
|
149
|
-
if emb is not None:
|
|
150
|
-
key = texts[idx].strip()
|
|
151
|
-
if len(self._embed_cache) >= self._CACHE_MAX_SIZE:
|
|
152
|
-
first_key = next(iter(self._embed_cache))
|
|
153
|
-
del self._embed_cache[first_key]
|
|
154
|
-
self._embed_cache[key] = emb
|
|
155
|
-
self._cache_misses += 1
|
|
156
|
-
return results
|
|
157
|
-
except Exception as exc:
|
|
158
|
-
logger.warning("Ollama batch embed failed: %s", exc)
|
|
159
|
-
return results # Return whatever was cached + None for rest
|
|
160
|
-
|
|
161
|
-
def compute_fisher_params(
|
|
162
|
-
self, embedding: list[float],
|
|
163
|
-
) -> tuple[list[float], list[float]]:
|
|
164
|
-
"""Compute Fisher-Rao parameters from a raw embedding."""
|
|
165
|
-
arr = np.asarray(embedding, dtype=np.float64)
|
|
166
|
-
norm = float(np.linalg.norm(arr))
|
|
167
|
-
if norm < 1e-10:
|
|
168
|
-
mean = np.zeros(len(arr), dtype=np.float64)
|
|
169
|
-
variance = np.full(len(arr), _FISHER_VAR_MAX, dtype=np.float64)
|
|
170
|
-
return mean.tolist(), variance.tolist()
|
|
171
|
-
mean = arr / norm
|
|
172
|
-
abs_mean = np.abs(mean)
|
|
173
|
-
max_val = float(np.max(abs_mean)) + 1e-10
|
|
174
|
-
signal_strength = abs_mean / max_val
|
|
175
|
-
variance = _FISHER_VAR_MAX - _FISHER_VAR_RANGE * signal_strength
|
|
176
|
-
variance = np.clip(variance, _FISHER_VAR_MIN, _FISHER_VAR_MAX)
|
|
177
|
-
return mean.tolist(), variance.tolist()
|
|
178
|
-
|
|
179
|
-
def unload(self) -> None:
|
|
180
|
-
"""No-op for Ollama (Ollama manages its own model lifecycle)."""
|
|
181
|
-
|
|
182
|
-
# ------------------------------------------------------------------
|
|
183
|
-
# Internal
|
|
184
|
-
# ------------------------------------------------------------------
|
|
185
|
-
|
|
186
|
-
def _check_availability(self) -> bool:
|
|
187
|
-
"""Verify Ollama is running and has the embedding model."""
|
|
188
|
-
import httpx
|
|
189
|
-
|
|
190
|
-
try:
|
|
191
|
-
resp = httpx.get(
|
|
192
|
-
f"{self._base_url}/api/tags",
|
|
193
|
-
timeout=_CONNECT_TIMEOUT,
|
|
194
|
-
)
|
|
195
|
-
if resp.status_code != 200:
|
|
196
|
-
return False
|
|
197
|
-
models = resp.json().get("models", [])
|
|
198
|
-
model_names = [m.get("name", "").split(":")[0] for m in models]
|
|
199
|
-
model_base = self._model.split(":")[0]
|
|
200
|
-
if model_base not in model_names:
|
|
201
|
-
logger.info(
|
|
202
|
-
"Ollama running but model '%s' not found (have: %s)",
|
|
203
|
-
self._model, ", ".join(model_names),
|
|
204
|
-
)
|
|
205
|
-
return False
|
|
206
|
-
return True
|
|
207
|
-
except Exception as exc:
|
|
208
|
-
logger.debug("Ollama not reachable: %s", exc)
|
|
209
|
-
return False
|
|
210
|
-
|
|
211
|
-
def _call_ollama_embed(self, text: str) -> list[float]:
|
|
212
|
-
"""Call Ollama embed endpoint for a single text.
|
|
213
|
-
|
|
214
|
-
v3.4.52: ``keep_alive: -1`` pins the embedding model in VRAM
|
|
215
|
-
forever so subsequent calls have no cold-start latency. Industry
|
|
216
|
-
pattern (Hindsight, Zep, Supermemory) — without this, Ollama
|
|
217
|
-
unloads after 5min idle and the next call takes 20-30s.
|
|
218
|
-
"""
|
|
219
|
-
import httpx
|
|
220
|
-
|
|
221
|
-
resp = httpx.post(
|
|
222
|
-
f"{self._base_url}/api/embed",
|
|
223
|
-
json={"model": self._model, "input": [text], "keep_alive": -1},
|
|
224
|
-
timeout=httpx.Timeout(_RESPONSE_TIMEOUT, connect=_CONNECT_TIMEOUT),
|
|
225
|
-
)
|
|
226
|
-
resp.raise_for_status()
|
|
227
|
-
data = resp.json()
|
|
228
|
-
# Ollama /api/embed returns {"embeddings": [[...]]}
|
|
229
|
-
vec = data["embeddings"][0]
|
|
230
|
-
return self._normalize_checked(vec)
|
|
231
|
-
|
|
232
|
-
def _call_ollama_embed_batch(self, texts: list[str]) -> list[list[float] | None]:
|
|
233
|
-
"""Call Ollama embed endpoint with batch input.
|
|
234
|
-
|
|
235
|
-
v3.4.52: ``keep_alive: -1`` pins the embedding model — see
|
|
236
|
-
``_call_ollama_embed`` docstring for rationale.
|
|
237
|
-
"""
|
|
238
|
-
import httpx
|
|
239
|
-
|
|
240
|
-
resp = httpx.post(
|
|
241
|
-
f"{self._base_url}/api/embed",
|
|
242
|
-
json={"model": self._model, "input": texts, "keep_alive": -1},
|
|
243
|
-
timeout=httpx.Timeout(_RESPONSE_TIMEOUT, connect=_CONNECT_TIMEOUT),
|
|
244
|
-
)
|
|
245
|
-
resp.raise_for_status()
|
|
246
|
-
data = resp.json()
|
|
247
|
-
vectors = data.get("embeddings", [])
|
|
248
|
-
return [self._normalize_checked(v) for v in vectors]
|
|
249
|
-
|
|
250
|
-
def _normalize_checked(self, vec: list[float]) -> list[float]:
|
|
251
|
-
"""Reject provider drift before a vector can enter any durable store."""
|
|
252
|
-
actual = len(vec)
|
|
253
|
-
if actual != self._dimension:
|
|
254
|
-
raise ValueError(
|
|
255
|
-
f"Ollama embedding dimension {actual} != expected {self._dimension}"
|
|
256
|
-
)
|
|
257
|
-
return self._normalize(vec)
|
|
258
|
-
|
|
259
|
-
@staticmethod
|
|
260
|
-
def _normalize(vec: list[float]) -> list[float]:
|
|
261
|
-
"""L2-normalize embedding vector."""
|
|
262
|
-
arr = np.asarray(vec, dtype=np.float32)
|
|
263
|
-
norm = float(np.linalg.norm(arr))
|
|
264
|
-
if norm > 1e-10:
|
|
265
|
-
arr = arr / norm
|
|
266
|
-
return arr.tolist()
|
|
@@ -1,315 +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
|
-
"""Ask the local model server whether a model exists, before trusting it.
|
|
6
|
-
|
|
7
|
-
Mode B runs on Ollama, and a user picking a model there picks it by typing a
|
|
8
|
-
name. Two things then go wrong silently.
|
|
9
|
-
|
|
10
|
-
**The name is wrong.** Nothing happens at the moment of the mistake; the config
|
|
11
|
-
saves, the daemon starts, and every write quietly falls back to a worse path.
|
|
12
|
-
The error a user eventually sees is unrelated to what they did.
|
|
13
|
-
|
|
14
|
-
**The name is right and the shape is different.** Every embedding model emits a
|
|
15
|
-
vector of a fixed width. `nomic-embed-text` emits 768 numbers,
|
|
16
|
-
`mxbai-embed-large` emits 1024. Vectors of different widths cannot be compared,
|
|
17
|
-
so a store holding both answers similarity questions with noise — and it does so
|
|
18
|
-
without failing, because nothing in a similarity search knows the difference
|
|
19
|
-
between a bad answer and a good one. **This is the single silent-and-catastrophic
|
|
20
|
-
change a user can make**, so it is refused rather than warned about, and the
|
|
21
|
-
refusal says the one command that would make it safe.
|
|
22
|
-
|
|
23
|
-
There are two Ollama roles and they are separate models with separate names:
|
|
24
|
-
the embedding model (`embedding.ollama_model`) turns text into vectors, and the
|
|
25
|
-
generation model (`llm.model` when the provider is Ollama) writes summaries.
|
|
26
|
-
They are validated independently because a machine can perfectly well have one
|
|
27
|
-
and not the other.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
from __future__ import annotations
|
|
31
|
-
|
|
32
|
-
import logging
|
|
33
|
-
import sqlite3
|
|
34
|
-
from dataclasses import dataclass
|
|
35
|
-
from pathlib import Path
|
|
36
|
-
|
|
37
|
-
__all__ = [
|
|
38
|
-
"EMBEDDING",
|
|
39
|
-
"GENERATION",
|
|
40
|
-
"OllamaProbe",
|
|
41
|
-
"DimensionChange",
|
|
42
|
-
"validate_ollama_model",
|
|
43
|
-
"stored_embedding_dimension",
|
|
44
|
-
"check_embedding_model_change",
|
|
45
|
-
"same_embedding_model",
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
logger = logging.getLogger(__name__)
|
|
49
|
-
|
|
50
|
-
EMBEDDING = "embedding"
|
|
51
|
-
GENERATION = "generation"
|
|
52
|
-
|
|
53
|
-
DEFAULT_BASE_URL = "http://localhost:11434"
|
|
54
|
-
|
|
55
|
-
#: Long enough for a cold model load, short enough that a wedged server is not
|
|
56
|
-
#: mistaken for a slow one.
|
|
57
|
-
_CONNECT_TIMEOUT = 3.0
|
|
58
|
-
_RESPONSE_TIMEOUT = 60.0
|
|
59
|
-
|
|
60
|
-
_PROBE_TEXT = "superlocalmemory model probe"
|
|
61
|
-
_PROBE_PROMPT = "Reply with the single word: ok"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
@dataclass(frozen=True)
|
|
65
|
-
class OllamaProbe:
|
|
66
|
-
"""What the server said when asked about one model."""
|
|
67
|
-
|
|
68
|
-
ok: bool
|
|
69
|
-
message: str
|
|
70
|
-
dimension: int | None = None
|
|
71
|
-
|
|
72
|
-
def __bool__(self) -> bool: # pragma: no cover - convenience only
|
|
73
|
-
return self.ok
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
@dataclass(frozen=True)
|
|
77
|
-
class DimensionChange:
|
|
78
|
-
"""A model change that would put two vector widths in one store."""
|
|
79
|
-
|
|
80
|
-
allowed: bool
|
|
81
|
-
message: str
|
|
82
|
-
stored_dimension: int | None = None
|
|
83
|
-
new_dimension: int | None = None
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def same_embedding_model(left: str, right: str) -> bool:
|
|
87
|
-
"""True when two names are two spellings of one model.
|
|
88
|
-
|
|
89
|
-
``nomic-ai/nomic-embed-text-v1.5`` is the HuggingFace name and
|
|
90
|
-
``nomic-embed-text`` is the Ollama pull name for the same weights. Warning
|
|
91
|
-
about a dimension change between them would be a false alarm, and a false
|
|
92
|
-
alarm about the one thing that is genuinely dangerous is how a real warning
|
|
93
|
-
gets ignored.
|
|
94
|
-
"""
|
|
95
|
-
def base(name: str) -> str:
|
|
96
|
-
stem = name.strip().lower().rsplit("/", 1)[-1]
|
|
97
|
-
# An Ollama tag is PART OF THE IDENTITY, not packaging.
|
|
98
|
-
# ``qwen3-embedding:0.6b`` emits 1024 numbers and ``qwen3-embedding:8b``
|
|
99
|
-
# emits 4096, and stripping the tag made this function call them the
|
|
100
|
-
# same model — which then skipped the width check that exists to stop
|
|
101
|
-
# exactly that swap. Only ``:latest`` means "whatever the bare name
|
|
102
|
-
# means", so only that one is dropped.
|
|
103
|
-
if stem.endswith(":latest"):
|
|
104
|
-
stem = stem[: -len(":latest")]
|
|
105
|
-
# A HuggingFace revision suffix on an otherwise identical name is
|
|
106
|
-
# packaging; ``nomic-embed-text-v1.5`` and ``nomic-embed-text`` are the
|
|
107
|
-
# same weights under two registries' conventions.
|
|
108
|
-
if ":" not in stem:
|
|
109
|
-
for suffix in ("-v1.5", "-v1", "-v2"):
|
|
110
|
-
if stem.endswith(suffix):
|
|
111
|
-
stem = stem[: -len(suffix)]
|
|
112
|
-
return stem
|
|
113
|
-
|
|
114
|
-
return base(left) == base(right)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
def validate_ollama_model(
|
|
118
|
-
model_name: str,
|
|
119
|
-
role: str = EMBEDDING,
|
|
120
|
-
*,
|
|
121
|
-
base_url: str = DEFAULT_BASE_URL,
|
|
122
|
-
timeout: float = _RESPONSE_TIMEOUT,
|
|
123
|
-
) -> OllamaProbe:
|
|
124
|
-
"""Ask the server to actually use the model, and report what happened.
|
|
125
|
-
|
|
126
|
-
Listing the installed models is not enough: a name can be present and the
|
|
127
|
-
model still fail to load. So this runs the smallest real request for the
|
|
128
|
-
role and reads the answer, which is also the only way to learn an embedding
|
|
129
|
-
model's width.
|
|
130
|
-
"""
|
|
131
|
-
if role not in (EMBEDDING, GENERATION):
|
|
132
|
-
raise ValueError(f"role must be {EMBEDDING!r} or {GENERATION!r}, got {role!r}")
|
|
133
|
-
name = (model_name or "").strip()
|
|
134
|
-
if not name:
|
|
135
|
-
return OllamaProbe(False, "No model name given.")
|
|
136
|
-
|
|
137
|
-
try:
|
|
138
|
-
import httpx
|
|
139
|
-
except ImportError: # pragma: no cover - httpx is a hard dependency
|
|
140
|
-
return OllamaProbe(False, "httpx is not installed, so Ollama cannot be reached.")
|
|
141
|
-
|
|
142
|
-
url = base_url.rstrip("/")
|
|
143
|
-
request_timeout = httpx.Timeout(timeout, connect=_CONNECT_TIMEOUT)
|
|
144
|
-
|
|
145
|
-
try:
|
|
146
|
-
if role == EMBEDDING:
|
|
147
|
-
response = httpx.post(
|
|
148
|
-
f"{url}/api/embed",
|
|
149
|
-
json={"model": name, "input": [_PROBE_TEXT]},
|
|
150
|
-
timeout=request_timeout,
|
|
151
|
-
)
|
|
152
|
-
else:
|
|
153
|
-
response = httpx.post(
|
|
154
|
-
f"{url}/api/generate",
|
|
155
|
-
json={"model": name, "prompt": _PROBE_PROMPT, "stream": False},
|
|
156
|
-
timeout=request_timeout,
|
|
157
|
-
)
|
|
158
|
-
except httpx.ConnectError:
|
|
159
|
-
return OllamaProbe(
|
|
160
|
-
False,
|
|
161
|
-
f"Ollama is not running at {url}. Start it with: ollama serve",
|
|
162
|
-
)
|
|
163
|
-
except httpx.TimeoutException:
|
|
164
|
-
return OllamaProbe(
|
|
165
|
-
False,
|
|
166
|
-
f"Ollama did not answer within {timeout:.0f}s. The model may still be "
|
|
167
|
-
f"downloading — check with: ollama list",
|
|
168
|
-
)
|
|
169
|
-
except Exception as exc: # noqa: BLE001 - the message is the product here
|
|
170
|
-
return OllamaProbe(False, f"Could not reach Ollama at {url}: {exc}")
|
|
171
|
-
|
|
172
|
-
if response.status_code == 404 or _looks_missing(response):
|
|
173
|
-
return OllamaProbe(
|
|
174
|
-
False,
|
|
175
|
-
f"Ollama has no model called {name!r}. Run: ollama pull {name}",
|
|
176
|
-
)
|
|
177
|
-
if role == EMBEDDING and _refuses_embeddings(response):
|
|
178
|
-
return OllamaProbe(
|
|
179
|
-
False,
|
|
180
|
-
f"{name!r} is not an embedding model — the server refused the "
|
|
181
|
-
f"request. Pick a model built for embeddings, such as "
|
|
182
|
-
f"nomic-embed-text.",
|
|
183
|
-
)
|
|
184
|
-
if response.status_code != 200:
|
|
185
|
-
return OllamaProbe(
|
|
186
|
-
False,
|
|
187
|
-
f"Ollama answered {response.status_code} for {name!r}: "
|
|
188
|
-
f"{response.text[:200]}",
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
try:
|
|
192
|
-
payload = response.json()
|
|
193
|
-
except ValueError:
|
|
194
|
-
return OllamaProbe(False, f"Ollama returned something that is not JSON for {name!r}.")
|
|
195
|
-
|
|
196
|
-
if role == EMBEDDING:
|
|
197
|
-
vectors = payload.get("embeddings") or []
|
|
198
|
-
if not vectors or not isinstance(vectors[0], list) or not vectors[0]:
|
|
199
|
-
return OllamaProbe(
|
|
200
|
-
False,
|
|
201
|
-
f"{name!r} answered but returned no vector, so it is not an "
|
|
202
|
-
f"embedding model. Pick one built for embeddings, such as "
|
|
203
|
-
f"nomic-embed-text.",
|
|
204
|
-
)
|
|
205
|
-
width = len(vectors[0])
|
|
206
|
-
return OllamaProbe(True, f"{name} emits {width}-dimensional vectors.", width)
|
|
207
|
-
|
|
208
|
-
text = str(payload.get("response") or "").strip()
|
|
209
|
-
if not text:
|
|
210
|
-
return OllamaProbe(
|
|
211
|
-
False,
|
|
212
|
-
f"{name!r} answered but wrote nothing, so it cannot be used to "
|
|
213
|
-
f"generate summaries.",
|
|
214
|
-
)
|
|
215
|
-
return OllamaProbe(True, f"{name} answered a probe prompt.")
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
def _refuses_embeddings(response: object) -> bool:
|
|
219
|
-
"""A generation-only model answers an embedding request with a refusal.
|
|
220
|
-
|
|
221
|
-
The server's own wording is about its build flags and means nothing to
|
|
222
|
-
somebody who typed a chat model's name into an embedding field.
|
|
223
|
-
"""
|
|
224
|
-
status = getattr(response, "status_code", 0)
|
|
225
|
-
try:
|
|
226
|
-
lowered = response.text.lower() # type: ignore[attr-defined]
|
|
227
|
-
except Exception: # pragma: no cover - defensive
|
|
228
|
-
lowered = ""
|
|
229
|
-
if status == 501:
|
|
230
|
-
return True
|
|
231
|
-
return "does not support embed" in lowered or "not support embeddings" in lowered
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
def _looks_missing(response: object) -> bool:
|
|
235
|
-
"""Ollama reports an unknown model as a 400 with a body that says so."""
|
|
236
|
-
try:
|
|
237
|
-
body = response.text # type: ignore[attr-defined]
|
|
238
|
-
except Exception: # pragma: no cover - defensive
|
|
239
|
-
return False
|
|
240
|
-
lowered = body.lower()
|
|
241
|
-
return "not found" in lowered and "model" in lowered
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def stored_embedding_dimension(db_path: str | Path) -> int | None:
|
|
245
|
-
"""The vector width this store already holds, or None if it holds none."""
|
|
246
|
-
path = Path(db_path)
|
|
247
|
-
if not path.exists():
|
|
248
|
-
return None
|
|
249
|
-
try:
|
|
250
|
-
conn = sqlite3.connect(f"file:{path}?mode=ro", uri=True)
|
|
251
|
-
except sqlite3.Error:
|
|
252
|
-
return None
|
|
253
|
-
try:
|
|
254
|
-
row = conn.execute(
|
|
255
|
-
"SELECT dimension FROM embedding_metadata "
|
|
256
|
-
"WHERE dimension IS NOT NULL AND dimension > 0 LIMIT 1"
|
|
257
|
-
).fetchone()
|
|
258
|
-
except sqlite3.Error:
|
|
259
|
-
return None
|
|
260
|
-
finally:
|
|
261
|
-
conn.close()
|
|
262
|
-
return int(row[0]) if row else None
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
def check_embedding_model_change(
|
|
266
|
-
new_model: str,
|
|
267
|
-
*,
|
|
268
|
-
db_path: str | Path,
|
|
269
|
-
current_model: str = "",
|
|
270
|
-
base_url: str = DEFAULT_BASE_URL,
|
|
271
|
-
) -> DimensionChange:
|
|
272
|
-
"""Decide whether switching the embedding model is safe for this store.
|
|
273
|
-
|
|
274
|
-
Refuses rather than warns. A warning printed into a log is not a decision,
|
|
275
|
-
and the outcome of getting this wrong is a store whose similarity search is
|
|
276
|
-
quietly meaningless.
|
|
277
|
-
"""
|
|
278
|
-
# The width is asked for FIRST, always. Recognising two names as the same
|
|
279
|
-
# model may soften the message, but it must never stand in for measuring —
|
|
280
|
-
# a name that merely looks familiar is exactly how a different-width model
|
|
281
|
-
# would get through.
|
|
282
|
-
probe = validate_ollama_model(new_model, EMBEDDING, base_url=base_url)
|
|
283
|
-
if not probe.ok:
|
|
284
|
-
return DimensionChange(False, probe.message)
|
|
285
|
-
|
|
286
|
-
familiar = bool(current_model) and same_embedding_model(current_model, new_model)
|
|
287
|
-
stored = stored_embedding_dimension(db_path)
|
|
288
|
-
if familiar and (stored is None or stored == probe.dimension):
|
|
289
|
-
return DimensionChange(
|
|
290
|
-
True,
|
|
291
|
-
f"{new_model} is another name for the model already in use, and it "
|
|
292
|
-
f"emits the same {probe.dimension}-dimensional vectors.",
|
|
293
|
-
stored,
|
|
294
|
-
probe.dimension,
|
|
295
|
-
)
|
|
296
|
-
if stored is None:
|
|
297
|
-
return DimensionChange(
|
|
298
|
-
True,
|
|
299
|
-
f"{probe.message} This store holds no vectors yet, so nothing has to "
|
|
300
|
-
f"be rebuilt.",
|
|
301
|
-
None,
|
|
302
|
-
probe.dimension,
|
|
303
|
-
)
|
|
304
|
-
if stored == probe.dimension:
|
|
305
|
-
return DimensionChange(True, probe.message, stored, probe.dimension)
|
|
306
|
-
|
|
307
|
-
return DimensionChange(
|
|
308
|
-
False,
|
|
309
|
-
f"{new_model} emits {probe.dimension}-dimensional vectors and this store "
|
|
310
|
-
f"holds {stored}-dimensional ones. Vectors of different widths cannot be "
|
|
311
|
-
f"compared, so every memory already stored would become unfindable by "
|
|
312
|
-
f"meaning. Rebuild them first with: slm db migrate",
|
|
313
|
-
stored,
|
|
314
|
-
probe.dimension,
|
|
315
|
-
)
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Declarative per-operation policy record for the V4 admission layer.
|
|
5
|
-
|
|
6
|
-
OperationPolicy is a plain frozen dataclass — a pure data declaration with no
|
|
7
|
-
behaviour. The OperationPolicyRegistry owns all evaluation logic. A policy
|
|
8
|
-
declares WHAT is required; the registry decides WHAT to DO when requirements
|
|
9
|
-
are not met.
|
|
10
|
-
|
|
11
|
-
Part of SuperLocalMemory V4 | Phase 4: Admission/Policy Layer
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
from dataclasses import dataclass, field
|
|
17
|
-
from typing import FrozenSet
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.core.actor_context import ActorRole, Transport
|
|
20
|
-
from superlocalmemory.core.operation_request import OperationKind
|
|
21
|
-
|
|
22
|
-
# Pre-compute the frozenset of all transports once; used as the default for
|
|
23
|
-
# policies that allow every transport (most operations).
|
|
24
|
-
_ALL_TRANSPORTS: frozenset[Transport] = frozenset(Transport)
|
|
25
|
-
|
|
26
|
-
# Sensitive/administrative operations that are restricted to fewer transports
|
|
27
|
-
# by default. The registry may override these at construction time.
|
|
28
|
-
_ADMIN_TRANSPORTS: frozenset[Transport] = frozenset({
|
|
29
|
-
Transport.CLI,
|
|
30
|
-
Transport.INTERNAL,
|
|
31
|
-
Transport.DASHBOARD,
|
|
32
|
-
})
|
|
33
|
-
_MESH_TRANSPORTS: frozenset[Transport] = frozenset({
|
|
34
|
-
Transport.MESH,
|
|
35
|
-
Transport.MCP,
|
|
36
|
-
Transport.HTTP,
|
|
37
|
-
Transport.INTERNAL,
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@dataclass(frozen=True, slots=True)
|
|
42
|
-
class OperationPolicy:
|
|
43
|
-
"""Declarative policy for one operation kind.
|
|
44
|
-
|
|
45
|
-
The registry stores one OperationPolicy per OperationKind (and
|
|
46
|
-
optionally per transport when transport-specific overrides are needed,
|
|
47
|
-
though the V4 default table uses one per kind).
|
|
48
|
-
|
|
49
|
-
Field semantics
|
|
50
|
-
---------------
|
|
51
|
-
required_roles Actor must hold at least ONE of these roles.
|
|
52
|
-
Empty frozenset → deny all (explicit deny policy).
|
|
53
|
-
required_authentication Actor.is_authenticated must be True.
|
|
54
|
-
allowed_transports Actor.transport must be in this set.
|
|
55
|
-
requires_schema_capability Non-empty → DB must expose this capability.
|
|
56
|
-
max_payload_bytes Advisory only — payload > this is ANNOTATED, not
|
|
57
|
-
rejected (double-rejection is avoided; the ingest
|
|
58
|
-
gate already enforces the 1 MiB hard cap).
|
|
59
|
-
deadline_budget_ms Advisory request deadline.
|
|
60
|
-
audit_level "none" | "standard" | "full" — governs log detail.
|
|
61
|
-
redaction_policy "none" | "scrub" | "full" — governs PII scrub.
|
|
62
|
-
resource_ownership_check Whether the coordinator must verify ownership.
|
|
63
|
-
allow_cross_profile Whether the actor may target a non-active profile.
|
|
64
|
-
fail_closed_in_company_mode Informational — the registry uses the ``mode``
|
|
65
|
-
argument to evaluate(), not this field, for
|
|
66
|
-
unknown-kind fallback behaviour.
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
kind: OperationKind
|
|
70
|
-
required_roles: FrozenSet[ActorRole] = field(
|
|
71
|
-
default_factory=lambda: frozenset({ActorRole.OWNER})
|
|
72
|
-
)
|
|
73
|
-
required_authentication: bool = True
|
|
74
|
-
allowed_transports: FrozenSet[Transport] = field(
|
|
75
|
-
default_factory=lambda: _ALL_TRANSPORTS
|
|
76
|
-
)
|
|
77
|
-
requires_schema_capability: str = ""
|
|
78
|
-
max_payload_bytes: int = 1_048_576 # 1 MiB — advisory only
|
|
79
|
-
deadline_budget_ms: int = 30_000
|
|
80
|
-
audit_level: str = "standard" # "none" | "standard" | "full"
|
|
81
|
-
redaction_policy: str = "scrub" # "none" | "scrub" | "full"
|
|
82
|
-
resource_ownership_check: bool = True
|
|
83
|
-
allow_cross_profile: bool = False
|
|
84
|
-
fail_closed_in_company_mode: bool = True # informational; see docstring
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
__all__ = [
|
|
88
|
-
"OperationPolicy",
|
|
89
|
-
"_ALL_TRANSPORTS",
|
|
90
|
-
"_ADMIN_TRANSPORTS",
|
|
91
|
-
"_MESH_TRANSPORTS",
|
|
92
|
-
]
|