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,703 +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
|
-
"""Dashboard config endpoints — storage, daemon, mesh, trust, forgetting.
|
|
6
|
-
|
|
7
|
-
Each section provides GET (read current) and PUT (validate + persist) routes.
|
|
8
|
-
Writes use the same direct-JSON approach as the evolution config endpoint:
|
|
9
|
-
1. Read config.json as a raw dict (fail-open → defaults when absent/corrupt).
|
|
10
|
-
2. Update only the targeted keys; all other keys — including 'mode' — survive.
|
|
11
|
-
3. Atomic write via a temp file + os.replace (no torn writes).
|
|
12
|
-
|
|
13
|
-
Auth: follows the same pattern as the auto-capture/auto-recall/auto-invoke
|
|
14
|
-
config endpoints — no route-level auth guard. Write-identity is enforced by
|
|
15
|
-
the middleware layer wired in unified_daemon.py / ui.py for non-localhost
|
|
16
|
-
callers. Tests use a bare FastAPI app (no middleware) and monkeypatch
|
|
17
|
-
MEMORY_DIR to a tmp_path.
|
|
18
|
-
|
|
19
|
-
Restart-required semantics:
|
|
20
|
-
- graph_backend / vector_backend: changes take effect only on daemon restart.
|
|
21
|
-
- daemon_port / daemon_legacy_port: changes take effect only on daemon restart.
|
|
22
|
-
- mesh, trust, and forgetting are persisted safely but require restart
|
|
23
|
-
because no complete supported worker-rebind transaction exists for them.
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
from __future__ import annotations
|
|
27
|
-
|
|
28
|
-
import logging
|
|
29
|
-
from pathlib import Path
|
|
30
|
-
from typing import Annotated, Optional
|
|
31
|
-
|
|
32
|
-
from fastapi import APIRouter, Request
|
|
33
|
-
from fastapi.responses import JSONResponse
|
|
34
|
-
from pydantic import BaseModel, ConfigDict, Field, StrictBool
|
|
35
|
-
|
|
36
|
-
from superlocalmemory.server.config_file import read_config, update_config
|
|
37
|
-
from superlocalmemory.server.routes.helpers import MEMORY_DIR
|
|
38
|
-
|
|
39
|
-
logger = logging.getLogger(__name__)
|
|
40
|
-
|
|
41
|
-
router = APIRouter(prefix="/api/v3", tags=["config"])
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def _require_admin(request: Request) -> None:
|
|
45
|
-
"""SEC-H-01: system-configuration mutations are admin-only (MANAGE).
|
|
46
|
-
|
|
47
|
-
Machine auth (loopback / credential) is enforced by the daemon middleware;
|
|
48
|
-
this adds the RBAC layer so a logged-in non-admin (viewer/member) in company
|
|
49
|
-
mode cannot change the daemon port, swap the LLM key, or alter the forgetting
|
|
50
|
-
curve. The machine owner keeps MANAGE (personal mode is unaffected). Call
|
|
51
|
-
this BEFORE the handler's try/except so the 401/403 is not swallowed into a
|
|
52
|
-
500.
|
|
53
|
-
"""
|
|
54
|
-
from superlocalmemory.server.rbac_enforce import require_manage
|
|
55
|
-
require_manage(request)
|
|
56
|
-
|
|
57
|
-
# ---------------------------------------------------------------------------
|
|
58
|
-
# Allowed backend values
|
|
59
|
-
# ---------------------------------------------------------------------------
|
|
60
|
-
|
|
61
|
-
_GRAPH_BACKENDS = frozenset({"auto", "sqlite", "cozo"})
|
|
62
|
-
_VECTOR_BACKENDS = frozenset({"auto", "lancedb", "sqlite-vec"})
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
# ---------------------------------------------------------------------------
|
|
66
|
-
# Internal helpers
|
|
67
|
-
# ---------------------------------------------------------------------------
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _config_path() -> Path:
|
|
71
|
-
"""Return the config.json path, resolved from the active MEMORY_DIR."""
|
|
72
|
-
return MEMORY_DIR / "config.json"
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _read_config() -> dict:
|
|
76
|
-
"""Read one coherent config snapshot."""
|
|
77
|
-
p = _config_path()
|
|
78
|
-
try:
|
|
79
|
-
return read_config(p)
|
|
80
|
-
except (ValueError, OSError) as exc:
|
|
81
|
-
logger.warning("config_api: could not read config.json: %s", exc)
|
|
82
|
-
raise
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def _update_config(mutator) -> dict:
|
|
86
|
-
"""Run one interprocess-locked read/modify/replace transaction."""
|
|
87
|
-
return update_config(_config_path(), mutator)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
# ---------------------------------------------------------------------------
|
|
91
|
-
# Pydantic request models (extra="forbid" → 422 on unknown keys)
|
|
92
|
-
# ---------------------------------------------------------------------------
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class StorageConfigUpdate(BaseModel):
|
|
96
|
-
model_config = ConfigDict(extra="forbid")
|
|
97
|
-
|
|
98
|
-
graph_backend: Optional[Annotated[str, Field(pattern=r"^(auto|sqlite|cozo)$")]] = None
|
|
99
|
-
vector_backend: Optional[Annotated[str, Field(pattern=r"^(auto|lancedb|sqlite-vec)$")]] = None
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
class DaemonConfigUpdate(BaseModel):
|
|
103
|
-
model_config = ConfigDict(extra="forbid")
|
|
104
|
-
|
|
105
|
-
idle_timeout: Optional[int] = Field(None, ge=0)
|
|
106
|
-
port: Optional[int] = Field(None, ge=1, le=65535)
|
|
107
|
-
legacy_port: Optional[int] = Field(None, ge=1, le=65535)
|
|
108
|
-
enable_legacy_port: Optional[StrictBool] = None
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
class MeshConfigUpdate(BaseModel):
|
|
112
|
-
model_config = ConfigDict(extra="forbid")
|
|
113
|
-
|
|
114
|
-
enabled: StrictBool
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
class TrustConfigUpdate(BaseModel):
|
|
118
|
-
model_config = ConfigDict(extra="forbid")
|
|
119
|
-
|
|
120
|
-
use_trust_weighting: Optional[StrictBool] = None
|
|
121
|
-
trust_first_party: Optional[StrictBool] = None
|
|
122
|
-
promotion_min_trust: Optional[float] = Field(None, ge=0.0, le=1.0)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
class ForgettingConfigUpdate(BaseModel):
|
|
126
|
-
model_config = ConfigDict(extra="forbid")
|
|
127
|
-
|
|
128
|
-
enabled: Optional[StrictBool] = None
|
|
129
|
-
alpha: Optional[float] = Field(None, gt=0.0)
|
|
130
|
-
beta: Optional[float] = Field(None, gt=0.0)
|
|
131
|
-
gamma: Optional[float] = Field(None, gt=0.0)
|
|
132
|
-
delta: Optional[float] = Field(None, gt=0.0)
|
|
133
|
-
min_strength: Optional[float] = Field(None, gt=0.0)
|
|
134
|
-
max_strength: Optional[float] = Field(None, gt=0.0)
|
|
135
|
-
archive_threshold: Optional[float] = Field(None, ge=0.0, le=1.0)
|
|
136
|
-
forget_threshold: Optional[float] = Field(None, ge=0.0, le=1.0)
|
|
137
|
-
learning_rate: Optional[float] = Field(None, gt=0.0)
|
|
138
|
-
forgetting_drift_scale: Optional[float] = Field(None, gt=0.0)
|
|
139
|
-
# ge, not gt: zero is a meaningful setting — it turns trust-modulated decay
|
|
140
|
-
# off, so every memory fades at the same rate regardless of where it came
|
|
141
|
-
# from. A greater-than bound made the one value that disables the feature
|
|
142
|
-
# the one value the API refused.
|
|
143
|
-
trust_kappa: Optional[float] = Field(None, ge=0.0)
|
|
144
|
-
scheduler_interval_minutes: Optional[int] = Field(None, ge=1)
|
|
145
|
-
core_memory_immune: Optional[StrictBool] = None
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
# ---------------------------------------------------------------------------
|
|
149
|
-
# Default value constants (mirrors ForgettingConfig dataclass defaults)
|
|
150
|
-
# ---------------------------------------------------------------------------
|
|
151
|
-
|
|
152
|
-
_FORGETTING_DEFAULTS: dict = {
|
|
153
|
-
"enabled": True,
|
|
154
|
-
"alpha": 2.0,
|
|
155
|
-
"beta": 1.5,
|
|
156
|
-
"gamma": 1.0,
|
|
157
|
-
"delta": 0.5,
|
|
158
|
-
"min_strength": 0.1,
|
|
159
|
-
"max_strength": 100.0,
|
|
160
|
-
"archive_threshold": 0.2,
|
|
161
|
-
"forget_threshold": 0.05,
|
|
162
|
-
"learning_rate": 1.0,
|
|
163
|
-
"forgetting_drift_scale": 0.5,
|
|
164
|
-
"trust_kappa": 2.0,
|
|
165
|
-
"scheduler_interval_minutes": 30,
|
|
166
|
-
"core_memory_immune": True,
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
# ---------------------------------------------------------------------------
|
|
171
|
-
# GET /api/v3/storage/config
|
|
172
|
-
# ---------------------------------------------------------------------------
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
@router.get("/storage/config")
|
|
176
|
-
def get_storage_config(request: Request = None): # noqa: B008 - FastAPI idiom
|
|
177
|
-
"""Return current storage backend configuration.
|
|
178
|
-
|
|
179
|
-
base_dir is read-only — it is derived from the process namespace and
|
|
180
|
-
cannot be changed via this endpoint.
|
|
181
|
-
"""
|
|
182
|
-
try:
|
|
183
|
-
data = _read_config()
|
|
184
|
-
declared_graph = data.get("graph_backend", "auto")
|
|
185
|
-
declared_vector = data.get("vector_backend", "auto")
|
|
186
|
-
active_graph, active_vector = _active_backends(declared_graph, declared_vector)
|
|
187
|
-
return {
|
|
188
|
-
"graph_backend": declared_graph,
|
|
189
|
-
"vector_backend": declared_vector,
|
|
190
|
-
# What is actually answering queries. A store can be configured for
|
|
191
|
-
# a backend it never successfully promoted to, and then the setting
|
|
192
|
-
# describes an intention rather than the system.
|
|
193
|
-
"graph_backend_active": active_graph,
|
|
194
|
-
"vector_backend_active": active_vector,
|
|
195
|
-
"backend_matches_configuration": (
|
|
196
|
-
active_graph == declared_graph and active_vector == declared_vector
|
|
197
|
-
),
|
|
198
|
-
"scale_engine_state": data.get("scale_engine_state", "local_core"),
|
|
199
|
-
# What the last start did about moving this store onto the graph
|
|
200
|
-
# and vector backends. A store that could not be moved says why
|
|
201
|
-
# here rather than looking like one that was never asked.
|
|
202
|
-
"automatic_promotion": getattr(
|
|
203
|
-
request.app.state, "scale_autopromotion", None,
|
|
204
|
-
) if request is not None else None,
|
|
205
|
-
"base_dir": data.get("base_dir", str(MEMORY_DIR)),
|
|
206
|
-
}
|
|
207
|
-
except Exception:
|
|
208
|
-
logger.exception("get_storage_config failed")
|
|
209
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def _active_backends(declared_graph: str, declared_vector: str) -> tuple[str, str]:
|
|
213
|
-
"""Which backends are really serving queries, not which were requested.
|
|
214
|
-
|
|
215
|
-
A promotion writes the chosen backend into the configuration before the
|
|
216
|
-
directory that holds it exists, and a promotion that never completed leaves
|
|
217
|
-
the setting saying ``cozo`` while every query is answered by SQLite. The
|
|
218
|
-
dashboard read the setting, so it agreed with the mistake.
|
|
219
|
-
|
|
220
|
-
Resolved from the two things that must both be true for a backend to serve:
|
|
221
|
-
its library imports, and its data directory is on disk.
|
|
222
|
-
"""
|
|
223
|
-
def usable(module: str, directory: str) -> bool:
|
|
224
|
-
# Importing it, not merely finding it. A package whose native extension
|
|
225
|
-
# no longer matches the interpreter is present on disk and raises on
|
|
226
|
-
# import, and "the file is there" would report it as serving queries it
|
|
227
|
-
# cannot answer.
|
|
228
|
-
import importlib
|
|
229
|
-
|
|
230
|
-
if not (MEMORY_DIR / directory).is_dir():
|
|
231
|
-
return False
|
|
232
|
-
try:
|
|
233
|
-
importlib.import_module(module)
|
|
234
|
-
except Exception: # noqa: BLE001 - any import failure means unusable
|
|
235
|
-
return False
|
|
236
|
-
return True
|
|
237
|
-
|
|
238
|
-
graph = "sqlite"
|
|
239
|
-
if declared_graph in ("cozo", "auto") and usable("pycozo", "cozo"):
|
|
240
|
-
graph = "cozo"
|
|
241
|
-
|
|
242
|
-
vector = "sqlite-vec"
|
|
243
|
-
if declared_vector in ("lancedb", "auto") and usable("lancedb", "lance"):
|
|
244
|
-
vector = "lancedb"
|
|
245
|
-
|
|
246
|
-
return graph, vector
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
# ---------------------------------------------------------------------------
|
|
250
|
-
# PUT /api/v3/storage/config
|
|
251
|
-
# ---------------------------------------------------------------------------
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
@router.put("/storage/config")
|
|
255
|
-
def put_storage_config(request: Request, body: StorageConfigUpdate):
|
|
256
|
-
"""Update graph_backend and/or vector_backend.
|
|
257
|
-
|
|
258
|
-
Both fields require a daemon restart to take effect.
|
|
259
|
-
Returns restart_required: true unconditionally.
|
|
260
|
-
"""
|
|
261
|
-
_require_admin(request)
|
|
262
|
-
try:
|
|
263
|
-
def mutate(data: dict) -> None:
|
|
264
|
-
if body.graph_backend is not None:
|
|
265
|
-
data["graph_backend"] = body.graph_backend
|
|
266
|
-
if body.vector_backend is not None:
|
|
267
|
-
data["vector_backend"] = body.vector_backend
|
|
268
|
-
|
|
269
|
-
data = _update_config(mutate)
|
|
270
|
-
return {
|
|
271
|
-
"graph_backend": data.get("graph_backend", "auto"),
|
|
272
|
-
"vector_backend": data.get("vector_backend", "auto"),
|
|
273
|
-
"base_dir": data.get("base_dir", str(MEMORY_DIR)),
|
|
274
|
-
"restart_required": True,
|
|
275
|
-
}
|
|
276
|
-
except Exception:
|
|
277
|
-
logger.exception("put_storage_config failed")
|
|
278
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
# ---------------------------------------------------------------------------
|
|
282
|
-
# GET /api/v3/daemon/config
|
|
283
|
-
# ---------------------------------------------------------------------------
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
@router.get("/daemon/config")
|
|
287
|
-
def get_daemon_config():
|
|
288
|
-
"""Return current daemon configuration."""
|
|
289
|
-
try:
|
|
290
|
-
data = _read_config()
|
|
291
|
-
return {
|
|
292
|
-
"idle_timeout": data.get("daemon_idle_timeout", 0),
|
|
293
|
-
"port": data.get("daemon_port", 8765),
|
|
294
|
-
"legacy_port": data.get("daemon_legacy_port", 8767),
|
|
295
|
-
"enable_legacy_port": data.get("daemon_enable_legacy_port", True),
|
|
296
|
-
}
|
|
297
|
-
except Exception:
|
|
298
|
-
logger.exception("get_daemon_config failed")
|
|
299
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
# ---------------------------------------------------------------------------
|
|
303
|
-
# PUT /api/v3/daemon/config
|
|
304
|
-
# ---------------------------------------------------------------------------
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
@router.put("/daemon/config")
|
|
308
|
-
def put_daemon_config(request: Request, body: DaemonConfigUpdate):
|
|
309
|
-
"""Update daemon configuration.
|
|
310
|
-
|
|
311
|
-
Port / legacy_port changes require a daemon restart.
|
|
312
|
-
restart_required is True if any port field is included in the request.
|
|
313
|
-
"""
|
|
314
|
-
_require_admin(request)
|
|
315
|
-
try:
|
|
316
|
-
port_changed = False
|
|
317
|
-
|
|
318
|
-
def mutate(data: dict) -> None:
|
|
319
|
-
nonlocal port_changed
|
|
320
|
-
if body.idle_timeout is not None:
|
|
321
|
-
data["daemon_idle_timeout"] = body.idle_timeout
|
|
322
|
-
if body.port is not None:
|
|
323
|
-
data["daemon_port"] = body.port
|
|
324
|
-
port_changed = True
|
|
325
|
-
if body.legacy_port is not None:
|
|
326
|
-
data["daemon_legacy_port"] = body.legacy_port
|
|
327
|
-
port_changed = True
|
|
328
|
-
if body.enable_legacy_port is not None:
|
|
329
|
-
data["daemon_enable_legacy_port"] = body.enable_legacy_port
|
|
330
|
-
|
|
331
|
-
data = _update_config(mutate)
|
|
332
|
-
return {
|
|
333
|
-
"idle_timeout": data.get("daemon_idle_timeout", 0),
|
|
334
|
-
"port": data.get("daemon_port", 8765),
|
|
335
|
-
"legacy_port": data.get("daemon_legacy_port", 8767),
|
|
336
|
-
"enable_legacy_port": data.get("daemon_enable_legacy_port", True),
|
|
337
|
-
"restart_required": port_changed,
|
|
338
|
-
}
|
|
339
|
-
except Exception:
|
|
340
|
-
logger.exception("put_daemon_config failed")
|
|
341
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
# ---------------------------------------------------------------------------
|
|
345
|
-
# GET /api/v3/mesh/config
|
|
346
|
-
# ---------------------------------------------------------------------------
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
@router.get("/mesh/config")
|
|
350
|
-
def get_mesh_config():
|
|
351
|
-
"""Return current mesh configuration."""
|
|
352
|
-
try:
|
|
353
|
-
data = _read_config()
|
|
354
|
-
return {"enabled": data.get("mesh_enabled", True)}
|
|
355
|
-
except Exception:
|
|
356
|
-
logger.exception("get_mesh_config failed")
|
|
357
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
# ---------------------------------------------------------------------------
|
|
361
|
-
# PUT /api/v3/mesh/config
|
|
362
|
-
# ---------------------------------------------------------------------------
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
@router.put("/mesh/config")
|
|
366
|
-
def put_mesh_config(request: Request, body: MeshConfigUpdate):
|
|
367
|
-
"""Persist mesh state; restart is required to rebuild the mesh worker."""
|
|
368
|
-
_require_admin(request)
|
|
369
|
-
try:
|
|
370
|
-
_update_config(
|
|
371
|
-
lambda data: data.update({"mesh_enabled": body.enabled}),
|
|
372
|
-
)
|
|
373
|
-
return {"enabled": body.enabled, "restart_required": True}
|
|
374
|
-
except Exception:
|
|
375
|
-
logger.exception("put_mesh_config failed")
|
|
376
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
# ---------------------------------------------------------------------------
|
|
380
|
-
# GET /api/v3/trust/config
|
|
381
|
-
# ---------------------------------------------------------------------------
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
@router.get("/trust/config")
|
|
385
|
-
def get_trust_config():
|
|
386
|
-
"""Return current trust configuration.
|
|
387
|
-
|
|
388
|
-
Fields are spread across three config sections:
|
|
389
|
-
- retrieval.use_trust_weighting (Bayesian trust in retrieval ranking)
|
|
390
|
-
- injection.trust_first_party (framing of injected context)
|
|
391
|
-
- consolidation.promotion_min_trust (min trust required for promotion)
|
|
392
|
-
"""
|
|
393
|
-
try:
|
|
394
|
-
data = _read_config()
|
|
395
|
-
retrieval = data.get("retrieval", {})
|
|
396
|
-
injection = data.get("injection", {})
|
|
397
|
-
consolidation = data.get("consolidation", {})
|
|
398
|
-
return {
|
|
399
|
-
"use_trust_weighting": retrieval.get("use_trust_weighting", True),
|
|
400
|
-
"trust_first_party": injection.get("trust_first_party", False),
|
|
401
|
-
"promotion_min_trust": consolidation.get("promotion_min_trust", 0.5),
|
|
402
|
-
}
|
|
403
|
-
except Exception:
|
|
404
|
-
logger.exception("get_trust_config failed")
|
|
405
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
# ---------------------------------------------------------------------------
|
|
409
|
-
# PUT /api/v3/trust/config
|
|
410
|
-
# ---------------------------------------------------------------------------
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
@router.put("/trust/config")
|
|
414
|
-
def put_trust_config(request: Request, body: TrustConfigUpdate):
|
|
415
|
-
"""Update trust configuration.
|
|
416
|
-
|
|
417
|
-
Each field is stored in its canonical config.json sub-section.
|
|
418
|
-
Unrelated keys in those sub-sections are preserved.
|
|
419
|
-
"""
|
|
420
|
-
_require_admin(request)
|
|
421
|
-
try:
|
|
422
|
-
def mutate(data: dict) -> None:
|
|
423
|
-
if body.use_trust_weighting is not None:
|
|
424
|
-
retrieval = data.setdefault("retrieval", {})
|
|
425
|
-
retrieval["use_trust_weighting"] = body.use_trust_weighting
|
|
426
|
-
if body.trust_first_party is not None:
|
|
427
|
-
injection = data.setdefault("injection", {})
|
|
428
|
-
injection["trust_first_party"] = body.trust_first_party
|
|
429
|
-
if body.promotion_min_trust is not None:
|
|
430
|
-
consolidation = data.setdefault("consolidation", {})
|
|
431
|
-
consolidation["promotion_min_trust"] = body.promotion_min_trust
|
|
432
|
-
|
|
433
|
-
data = _update_config(mutate)
|
|
434
|
-
retrieval = data.get("retrieval", {})
|
|
435
|
-
injection = data.get("injection", {})
|
|
436
|
-
consolidation = data.get("consolidation", {})
|
|
437
|
-
return {
|
|
438
|
-
"use_trust_weighting": retrieval.get("use_trust_weighting", True),
|
|
439
|
-
"trust_first_party": injection.get("trust_first_party", False),
|
|
440
|
-
"promotion_min_trust": consolidation.get("promotion_min_trust", 0.5),
|
|
441
|
-
"restart_required": True,
|
|
442
|
-
}
|
|
443
|
-
except Exception:
|
|
444
|
-
logger.exception("put_trust_config failed")
|
|
445
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
# ---------------------------------------------------------------------------
|
|
449
|
-
# GET /api/v3/forgetting/config
|
|
450
|
-
# ---------------------------------------------------------------------------
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
@router.get("/forgetting/config")
|
|
454
|
-
def get_forgetting_config():
|
|
455
|
-
"""Return all Ebbinghaus forgetting configuration fields."""
|
|
456
|
-
try:
|
|
457
|
-
data = _read_config()
|
|
458
|
-
stored = data.get("forgetting", {})
|
|
459
|
-
# Return defaults for any field not yet in config.json
|
|
460
|
-
result = {**_FORGETTING_DEFAULTS, **stored}
|
|
461
|
-
# Keep only known fields
|
|
462
|
-
return {k: result[k] for k in _FORGETTING_DEFAULTS}
|
|
463
|
-
except Exception:
|
|
464
|
-
logger.exception("get_forgetting_config failed")
|
|
465
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
# ---------------------------------------------------------------------------
|
|
469
|
-
# PUT /api/v3/forgetting/config
|
|
470
|
-
# ---------------------------------------------------------------------------
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
@router.put("/forgetting/config")
|
|
474
|
-
def put_forgetting_config(request: Request, body: ForgettingConfigUpdate):
|
|
475
|
-
"""Update Ebbinghaus forgetting configuration.
|
|
476
|
-
|
|
477
|
-
Only provided fields are changed; all other forgetting fields are
|
|
478
|
-
preserved. Changes take effect after the daemon restarts.
|
|
479
|
-
"""
|
|
480
|
-
_require_admin(request)
|
|
481
|
-
try:
|
|
482
|
-
updates = body.model_dump(exclude_none=True)
|
|
483
|
-
|
|
484
|
-
def mutate(data: dict) -> None:
|
|
485
|
-
stored = data.get("forgetting", {})
|
|
486
|
-
merged = {**_FORGETTING_DEFAULTS, **stored, **updates}
|
|
487
|
-
data["forgetting"] = merged
|
|
488
|
-
|
|
489
|
-
data = _update_config(mutate)
|
|
490
|
-
merged = data["forgetting"]
|
|
491
|
-
return {
|
|
492
|
-
**{k: merged[k] for k in _FORGETTING_DEFAULTS},
|
|
493
|
-
"restart_required": True,
|
|
494
|
-
}
|
|
495
|
-
except Exception:
|
|
496
|
-
logger.exception("put_forgetting_config failed")
|
|
497
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
# ---------------------------------------------------------------------------
|
|
501
|
-
# Graph Pruning config (v3.8.4-G — GitHub #84)
|
|
502
|
-
# Dedicated endpoint so the forgetting config partial-update contract stays
|
|
503
|
-
# clean. Callers that only want graph knobs do not need to know about the
|
|
504
|
-
# Ebbinghaus curve, and vice-versa.
|
|
505
|
-
# ---------------------------------------------------------------------------
|
|
506
|
-
|
|
507
|
-
_GRAPH_PRUNING_DEFAULTS: dict = {
|
|
508
|
-
"max_degree_per_node": 100,
|
|
509
|
-
"min_edge_weight": 0.0,
|
|
510
|
-
"enabled": True,
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
class GraphPruningConfigUpdate(BaseModel):
|
|
515
|
-
"""Partial update model for graph pruning configuration.
|
|
516
|
-
|
|
517
|
-
All fields are optional so a PUT with only ``max_degree_per_node`` does
|
|
518
|
-
NOT reset ``min_edge_weight`` back to the default. Existing values are
|
|
519
|
-
preserved; only the supplied fields are overwritten.
|
|
520
|
-
"""
|
|
521
|
-
|
|
522
|
-
model_config = ConfigDict(extra="forbid")
|
|
523
|
-
|
|
524
|
-
max_degree_per_node: Optional[int] = Field(None, ge=1)
|
|
525
|
-
min_edge_weight: Optional[float] = Field(None, ge=0.0, le=1.0)
|
|
526
|
-
enabled: Optional[StrictBool] = None
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
# ---------------------------------------------------------------------------
|
|
530
|
-
# GET /api/v3/graph/config
|
|
531
|
-
# ---------------------------------------------------------------------------
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
@router.get("/graph/config")
|
|
535
|
-
def get_graph_config():
|
|
536
|
-
"""Return current graph thinning configuration.
|
|
537
|
-
|
|
538
|
-
Returns all three fields with their defaults when config.json has no
|
|
539
|
-
``graph_pruning`` section (old installations).
|
|
540
|
-
"""
|
|
541
|
-
try:
|
|
542
|
-
data = _read_config()
|
|
543
|
-
stored = data.get("graph_pruning", {})
|
|
544
|
-
result = {**_GRAPH_PRUNING_DEFAULTS, **stored}
|
|
545
|
-
# Return only known fields
|
|
546
|
-
return {k: result[k] for k in _GRAPH_PRUNING_DEFAULTS}
|
|
547
|
-
except Exception:
|
|
548
|
-
logger.exception("get_graph_config failed")
|
|
549
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
# ---------------------------------------------------------------------------
|
|
553
|
-
# PUT /api/v3/graph/config
|
|
554
|
-
# ---------------------------------------------------------------------------
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
@router.put("/graph/config")
|
|
558
|
-
def put_graph_config(request: Request, body: GraphPruningConfigUpdate):
|
|
559
|
-
"""Update graph thinning configuration.
|
|
560
|
-
|
|
561
|
-
Only supplied fields are written; all other graph pruning fields are
|
|
562
|
-
preserved. Changes take effect at the next maintenance cycle without
|
|
563
|
-
requiring a daemon restart (the scheduler reads graph_pruning live from
|
|
564
|
-
the config object, which the daemon reloads from disk on each cycle).
|
|
565
|
-
"""
|
|
566
|
-
_require_admin(request)
|
|
567
|
-
try:
|
|
568
|
-
updates = body.model_dump(exclude_none=True)
|
|
569
|
-
|
|
570
|
-
def mutate(data: dict) -> None:
|
|
571
|
-
stored = data.get("graph_pruning", {})
|
|
572
|
-
merged = {**_GRAPH_PRUNING_DEFAULTS, **stored, **updates}
|
|
573
|
-
data["graph_pruning"] = merged
|
|
574
|
-
|
|
575
|
-
data = _update_config(mutate)
|
|
576
|
-
merged = data["graph_pruning"]
|
|
577
|
-
return {k: merged[k] for k in _GRAPH_PRUNING_DEFAULTS}
|
|
578
|
-
except Exception:
|
|
579
|
-
logger.exception("put_graph_config failed")
|
|
580
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
# ---------------------------------------------------------------------------
|
|
584
|
-
# Ollama model selection
|
|
585
|
-
# ---------------------------------------------------------------------------
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
class OllamaModelCheck(BaseModel):
|
|
589
|
-
"""A model a user is considering, and what they want to use it for."""
|
|
590
|
-
|
|
591
|
-
model_config = ConfigDict(extra="forbid")
|
|
592
|
-
|
|
593
|
-
model_name: str = Field(..., min_length=1, max_length=200)
|
|
594
|
-
role: str = Field("embedding", pattern="^(embedding|generation)$")
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
@router.get("/ollama/models")
|
|
598
|
-
def get_ollama_models():
|
|
599
|
-
"""Which Ollama models are installed, and which two are in use.
|
|
600
|
-
|
|
601
|
-
A user picking a model should be picking from a list, not typing a name and
|
|
602
|
-
finding out later that they typed it wrong.
|
|
603
|
-
"""
|
|
604
|
-
from superlocalmemory.core.ollama_validator import DEFAULT_BASE_URL
|
|
605
|
-
|
|
606
|
-
try:
|
|
607
|
-
data = _read_config()
|
|
608
|
-
embedding = data.get("embedding") or {}
|
|
609
|
-
llm = data.get("llm") or {}
|
|
610
|
-
base_url = llm.get("base_url") or DEFAULT_BASE_URL
|
|
611
|
-
|
|
612
|
-
installed: list[dict] = []
|
|
613
|
-
reachable = True
|
|
614
|
-
detail = ""
|
|
615
|
-
try:
|
|
616
|
-
import httpx
|
|
617
|
-
|
|
618
|
-
response = httpx.get(f"{base_url.rstrip('/')}/api/tags", timeout=3.0)
|
|
619
|
-
if response.status_code == 200:
|
|
620
|
-
for entry in response.json().get("models", []):
|
|
621
|
-
installed.append({
|
|
622
|
-
"name": entry.get("name", ""),
|
|
623
|
-
"size": entry.get("size", 0),
|
|
624
|
-
})
|
|
625
|
-
else:
|
|
626
|
-
reachable = False
|
|
627
|
-
detail = f"Ollama answered {response.status_code}."
|
|
628
|
-
except Exception as exc: # noqa: BLE001 - reported, not raised
|
|
629
|
-
reachable = False
|
|
630
|
-
detail = f"Ollama is not running at {base_url}. Start it with: ollama serve ({exc})"
|
|
631
|
-
|
|
632
|
-
return {
|
|
633
|
-
"reachable": reachable,
|
|
634
|
-
"detail": detail,
|
|
635
|
-
"base_url": base_url,
|
|
636
|
-
"installed": sorted(installed, key=lambda m: m["name"]),
|
|
637
|
-
"embedding_model": embedding.get("ollama_model", ""),
|
|
638
|
-
"generation_model": llm.get("model", "") if llm.get("provider") == "ollama" else "",
|
|
639
|
-
"stored_dimension": _stored_dimension(),
|
|
640
|
-
}
|
|
641
|
-
except Exception:
|
|
642
|
-
logger.exception("get_ollama_models failed")
|
|
643
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
@router.post("/ollama/validate")
|
|
647
|
-
def post_ollama_validate(request: Request, body: OllamaModelCheck):
|
|
648
|
-
"""Ask the server to actually use the model, before anything is saved.
|
|
649
|
-
|
|
650
|
-
For the embedding role this also decides whether the switch is safe for this
|
|
651
|
-
store: two vector widths cannot be compared, and a store holding both
|
|
652
|
-
answers similarity questions with noise rather than failing.
|
|
653
|
-
"""
|
|
654
|
-
_require_admin(request)
|
|
655
|
-
from superlocalmemory.core.ollama_validator import (
|
|
656
|
-
DEFAULT_BASE_URL,
|
|
657
|
-
EMBEDDING,
|
|
658
|
-
check_embedding_model_change,
|
|
659
|
-
validate_ollama_model,
|
|
660
|
-
)
|
|
661
|
-
|
|
662
|
-
try:
|
|
663
|
-
data = _read_config()
|
|
664
|
-
llm = data.get("llm") or {}
|
|
665
|
-
embedding = data.get("embedding") or {}
|
|
666
|
-
base_url = llm.get("base_url") or DEFAULT_BASE_URL
|
|
667
|
-
|
|
668
|
-
if body.role != EMBEDDING:
|
|
669
|
-
probe = validate_ollama_model(body.model_name, body.role, base_url=base_url)
|
|
670
|
-
return {
|
|
671
|
-
"ok": probe.ok,
|
|
672
|
-
"message": probe.message,
|
|
673
|
-
"role": body.role,
|
|
674
|
-
"model_name": body.model_name,
|
|
675
|
-
"dimension": probe.dimension,
|
|
676
|
-
"safe_to_apply": probe.ok,
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
decision = check_embedding_model_change(
|
|
680
|
-
body.model_name,
|
|
681
|
-
db_path=MEMORY_DIR / "memory.db",
|
|
682
|
-
current_model=embedding.get("ollama_model", "")
|
|
683
|
-
or embedding.get("model_name", ""),
|
|
684
|
-
base_url=base_url,
|
|
685
|
-
)
|
|
686
|
-
return {
|
|
687
|
-
"ok": decision.allowed,
|
|
688
|
-
"message": decision.message,
|
|
689
|
-
"role": body.role,
|
|
690
|
-
"model_name": body.model_name,
|
|
691
|
-
"dimension": decision.new_dimension,
|
|
692
|
-
"stored_dimension": decision.stored_dimension,
|
|
693
|
-
"safe_to_apply": decision.allowed,
|
|
694
|
-
}
|
|
695
|
-
except Exception:
|
|
696
|
-
logger.exception("post_ollama_validate failed")
|
|
697
|
-
return JSONResponse({"error": "Internal server error"}, status_code=500)
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
def _stored_dimension() -> int | None:
|
|
701
|
-
from superlocalmemory.core.ollama_validator import stored_embedding_dimension
|
|
702
|
-
|
|
703
|
-
return stored_embedding_dimension(MEMORY_DIR / "memory.db")
|