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,171 +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
|
-
"""SuperLocalMemory V3 - WebSocket Routes
|
|
5
|
-
- AGPL-3.0-or-later
|
|
6
|
-
|
|
7
|
-
Routes: /ws/updates
|
|
8
|
-
"""
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Set
|
|
11
|
-
from datetime import datetime, timezone
|
|
12
|
-
|
|
13
|
-
from fastapi import APIRouter, WebSocket, WebSocketDisconnect
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger("superlocalmemory.routes.ws")
|
|
16
|
-
router = APIRouter()
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ConnectionManager:
|
|
20
|
-
"""Manages WebSocket connections for real-time updates."""
|
|
21
|
-
|
|
22
|
-
def __init__(self):
|
|
23
|
-
self.active_connections: Set[WebSocket] = set()
|
|
24
|
-
|
|
25
|
-
async def connect(self, websocket: WebSocket):
|
|
26
|
-
await websocket.accept()
|
|
27
|
-
self.active_connections.add(websocket)
|
|
28
|
-
|
|
29
|
-
def disconnect(self, websocket: WebSocket):
|
|
30
|
-
self.active_connections.discard(websocket)
|
|
31
|
-
|
|
32
|
-
async def broadcast(self, message: dict):
|
|
33
|
-
disconnected = set()
|
|
34
|
-
for connection in self.active_connections:
|
|
35
|
-
try:
|
|
36
|
-
await connection.send_json(message)
|
|
37
|
-
except Exception:
|
|
38
|
-
disconnected.add(connection)
|
|
39
|
-
self.active_connections -= disconnected
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
manager = ConnectionManager()
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def _ws_origin_allowed(websocket: WebSocket) -> bool:
|
|
46
|
-
"""Return True when the WebSocket upgrade Origin is permitted.
|
|
47
|
-
|
|
48
|
-
Non-browser clients (CLI, MCP tools) carry no Origin header and are
|
|
49
|
-
always allowed. Browser-originated connections must come from a
|
|
50
|
-
loopback address or a host in the configured remote allowlist.
|
|
51
|
-
"""
|
|
52
|
-
origin = websocket.headers.get("origin", "")
|
|
53
|
-
if not origin:
|
|
54
|
-
return True # non-browser caller (CLI/MCP) — no origin to validate
|
|
55
|
-
|
|
56
|
-
try:
|
|
57
|
-
from superlocalmemory.server.origin import origin_is_loopback
|
|
58
|
-
if origin_is_loopback(origin):
|
|
59
|
-
return True
|
|
60
|
-
except Exception:
|
|
61
|
-
# If the helper is unavailable, fall through to the remote check.
|
|
62
|
-
if "127.0.0.1" in origin or "::1" in origin or "localhost" in origin:
|
|
63
|
-
return True
|
|
64
|
-
|
|
65
|
-
try:
|
|
66
|
-
from superlocalmemory.core.remote_mode import is_remote_origin_allowed
|
|
67
|
-
if is_remote_origin_allowed(origin):
|
|
68
|
-
return True
|
|
69
|
-
except Exception:
|
|
70
|
-
pass
|
|
71
|
-
|
|
72
|
-
return False
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _ws_rbac_allowed(websocket: WebSocket, app_state) -> bool:
|
|
76
|
-
"""Return True when the caller is authorised to open a WS connection.
|
|
77
|
-
|
|
78
|
-
Mirrors _rbac_read_gate in unified_daemon.py: no-op in single-operator
|
|
79
|
-
installations (zero RBAC users), requires a valid session in company /
|
|
80
|
-
require_login mode. Fails closed on RBAC errors.
|
|
81
|
-
"""
|
|
82
|
-
rbac = getattr(app_state, "rbac", None)
|
|
83
|
-
if rbac is None:
|
|
84
|
-
return True # single-operator mode — no auth layer active
|
|
85
|
-
|
|
86
|
-
try:
|
|
87
|
-
active = rbac.user_count() > 0
|
|
88
|
-
except Exception:
|
|
89
|
-
logger.warning("ws: RBAC state unavailable — rejecting handshake (fail closed)")
|
|
90
|
-
return False # fail closed
|
|
91
|
-
|
|
92
|
-
if not active:
|
|
93
|
-
return True # no users registered — single-operator mode
|
|
94
|
-
|
|
95
|
-
token = (
|
|
96
|
-
websocket.headers.get("x-slm-user-session", "")
|
|
97
|
-
or websocket.cookies.get("slm_session", "")
|
|
98
|
-
)
|
|
99
|
-
user = rbac.resolve_session(token) if token else None
|
|
100
|
-
|
|
101
|
-
if user is None:
|
|
102
|
-
if rbac.require_login():
|
|
103
|
-
return False # login required and no valid session
|
|
104
|
-
return True # personal / owner mode — no session needed
|
|
105
|
-
|
|
106
|
-
try:
|
|
107
|
-
from superlocalmemory.access.rbac import Permission
|
|
108
|
-
from superlocalmemory.server.routes.helpers import get_active_profile
|
|
109
|
-
return rbac.has_permission(user["user_id"], get_active_profile(), Permission.READ)
|
|
110
|
-
except Exception:
|
|
111
|
-
logger.warning("ws: permission check failed — rejecting handshake (fail closed)")
|
|
112
|
-
return False
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
@router.websocket("/ws/updates")
|
|
116
|
-
async def websocket_updates(websocket: WebSocket):
|
|
117
|
-
"""WebSocket endpoint for real-time memory updates."""
|
|
118
|
-
app_state = getattr(websocket, "app", None)
|
|
119
|
-
app_state = getattr(app_state, "state", None)
|
|
120
|
-
|
|
121
|
-
# --- Reject disallowed origins before accepting the handshake. ---
|
|
122
|
-
if not _ws_origin_allowed(websocket):
|
|
123
|
-
logger.info("ws: rejected handshake from disallowed origin %s",
|
|
124
|
-
websocket.headers.get("origin", ""))
|
|
125
|
-
await websocket.close(code=1008) # 1008 = Policy Violation
|
|
126
|
-
return
|
|
127
|
-
|
|
128
|
-
# --- Reject unauthenticated callers when login is required. ---
|
|
129
|
-
if not _ws_rbac_allowed(websocket, app_state):
|
|
130
|
-
logger.info("ws: rejected unauthenticated or unauthorised handshake")
|
|
131
|
-
await websocket.close(code=4001) # 4001 = custom: Unauthorized
|
|
132
|
-
return
|
|
133
|
-
|
|
134
|
-
await manager.connect(websocket)
|
|
135
|
-
|
|
136
|
-
try:
|
|
137
|
-
await websocket.send_json({
|
|
138
|
-
"type": "connected",
|
|
139
|
-
"message": "WebSocket connection established",
|
|
140
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
while True:
|
|
144
|
-
try:
|
|
145
|
-
data = await websocket.receive_json()
|
|
146
|
-
|
|
147
|
-
if data.get('type') == 'ping':
|
|
148
|
-
await websocket.send_json({
|
|
149
|
-
"type": "pong",
|
|
150
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
elif data.get('type') == 'get_stats':
|
|
154
|
-
await websocket.send_json({
|
|
155
|
-
"type": "stats_update",
|
|
156
|
-
"message": "Use /api/stats endpoint for stats",
|
|
157
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
except WebSocketDisconnect:
|
|
161
|
-
break
|
|
162
|
-
except Exception:
|
|
163
|
-
logger.exception("ws route error")
|
|
164
|
-
await websocket.send_json({
|
|
165
|
-
"type": "error",
|
|
166
|
-
"message": "Internal server error",
|
|
167
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
finally:
|
|
171
|
-
manager.disconnect(websocket)
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
3
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
4
|
-
# Part of Qualixar | Author: Varun Pratap Bhardwaj (qualixar.com | varunpratap.com)
|
|
5
|
-
"""Security headers middleware for FastAPI servers.
|
|
6
|
-
|
|
7
|
-
Adds comprehensive security headers to all HTTP responses:
|
|
8
|
-
- X-Content-Type-Options: Prevents MIME type sniffing
|
|
9
|
-
- X-Frame-Options: Prevents clickjacking attacks
|
|
10
|
-
- X-XSS-Protection: Enables browser XSS filters
|
|
11
|
-
- Content-Security-Policy: Restricts resource loading
|
|
12
|
-
- Referrer-Policy: Controls referrer information leakage
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from starlette.middleware.base import BaseHTTPMiddleware
|
|
16
|
-
from starlette.requests import Request
|
|
17
|
-
from starlette.responses import Response
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class SecurityHeadersMiddleware(BaseHTTPMiddleware):
|
|
21
|
-
"""Add security headers to all HTTP responses."""
|
|
22
|
-
|
|
23
|
-
async def dispatch(self, request: Request, call_next) -> Response:
|
|
24
|
-
"""Process request and add security headers to response."""
|
|
25
|
-
response = await call_next(request)
|
|
26
|
-
|
|
27
|
-
# Prevent MIME type sniffing
|
|
28
|
-
response.headers["X-Content-Type-Options"] = "nosniff"
|
|
29
|
-
|
|
30
|
-
# Prevent clickjacking attacks
|
|
31
|
-
response.headers["X-Frame-Options"] = "DENY"
|
|
32
|
-
|
|
33
|
-
# Enable browser XSS filter (legacy, but doesn't hurt)
|
|
34
|
-
response.headers["X-XSS-Protection"] = "1; mode=block"
|
|
35
|
-
|
|
36
|
-
# Content Security Policy (v3.4.22 — vendored assets, no CDN hosts).
|
|
37
|
-
# All Bootstrap/D3/Sigma/graphology/Inter assets ship locally under
|
|
38
|
-
# /static/vendor/, so we drop every CDN host from the allow-list.
|
|
39
|
-
#
|
|
40
|
-
# v3.7.9 (B2): 'unsafe-inline' removed from script-src. Every inline
|
|
41
|
-
# on*= event handler was migrated to data-act-* attributes dispatched
|
|
42
|
-
# by js/event-delegation.js (nonces cannot authorise inline event-
|
|
43
|
-
# handler attributes, so delegation is the only real fix). A stored-XSS
|
|
44
|
-
# payload can no longer execute inline script here.
|
|
45
|
-
# 'unsafe-inline' is retained on style-src only: 82 inline style=
|
|
46
|
-
# attributes remain, style injection is far lower risk than script
|
|
47
|
-
# injection, and inline style attributes cannot be nonce'd either
|
|
48
|
-
# (GitHub/GitLab keep the same script-locked / style-inline posture).
|
|
49
|
-
# img-src drops the https: wildcard now that nothing remote loads.
|
|
50
|
-
csp_directives = [
|
|
51
|
-
"default-src 'self'",
|
|
52
|
-
"script-src 'self'",
|
|
53
|
-
"style-src 'self' 'unsafe-inline'",
|
|
54
|
-
"font-src 'self'",
|
|
55
|
-
"img-src 'self' data:",
|
|
56
|
-
"connect-src 'self' ws://localhost:* ws://127.0.0.1:*",
|
|
57
|
-
"frame-ancestors 'none'",
|
|
58
|
-
"base-uri 'self'",
|
|
59
|
-
"form-action 'self'",
|
|
60
|
-
]
|
|
61
|
-
response.headers["Content-Security-Policy"] = "; ".join(csp_directives)
|
|
62
|
-
|
|
63
|
-
# Control referrer information leakage
|
|
64
|
-
response.headers["Referrer-Policy"] = "strict-origin-when-cross-origin"
|
|
65
|
-
|
|
66
|
-
# v3.4.23: Cache-Control strategy
|
|
67
|
-
# ---------------------------------------------------------------
|
|
68
|
-
# Three classes of paths, three policies:
|
|
69
|
-
#
|
|
70
|
-
# /api/* -> no-store (sensitive data, never cache)
|
|
71
|
-
# index.html -> no-cache, must-revalidate (always revalidate)
|
|
72
|
-
# /static/* -> no-cache, must-revalidate (always revalidate
|
|
73
|
-
# with ETag; fast reloads but never stale-after-
|
|
74
|
-
# upgrade)
|
|
75
|
-
#
|
|
76
|
-
# Before v3.4.23 only /api/* had cache headers. Browsers then cached
|
|
77
|
-
# JS/CSS/HTML aggressively via default heuristics, and after a daemon
|
|
78
|
-
# upgrade the dashboard showed an infinite spinner because old cached
|
|
79
|
-
# JS was calling endpoints with stale response shapes. "no-cache"
|
|
80
|
-
# (not "no-store") still allows 304s on unchanged files, so reload
|
|
81
|
-
# cost stays low.
|
|
82
|
-
path = request.url.path
|
|
83
|
-
if path.startswith("/api/"):
|
|
84
|
-
response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate"
|
|
85
|
-
response.headers["Pragma"] = "no-cache"
|
|
86
|
-
elif path == "/" or path.endswith(".html") or path.startswith("/static/"):
|
|
87
|
-
response.headers["Cache-Control"] = "no-cache, must-revalidate"
|
|
88
|
-
|
|
89
|
-
return response
|
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
3
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
4
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
5
|
-
"""
|
|
6
|
-
SuperLocalMemory V3 - FastAPI UI Server
|
|
7
|
-
App initialization, middleware, static mount, and router registration.
|
|
8
|
-
|
|
9
|
-
All route handlers live in routes/ directory:
|
|
10
|
-
routes/memories.py -- /api/memories, /api/graph, /api/search, /api/clusters
|
|
11
|
-
routes/stats.py -- /api/stats, /api/timeline, /api/patterns
|
|
12
|
-
routes/profiles.py -- /api/profiles (CRUD + switch)
|
|
13
|
-
routes/backup.py -- /api/backup (status, create, configure, list)
|
|
14
|
-
routes/data_io.py -- /api/export, /api/import
|
|
15
|
-
routes/events.py -- /events/stream (SSE), /api/events [v2.5]
|
|
16
|
-
routes/agents.py -- /api/agents, /api/trust [v2.5]
|
|
17
|
-
routes/ws.py -- /ws/updates (WebSocket)
|
|
18
|
-
|
|
19
|
-
v3.7.8 (WS3 F4): ``create_app()`` in this module is a standalone/legacy app
|
|
20
|
-
factory, NOT the app the running daemon serves -- that is
|
|
21
|
-
``superlocalmemory.server.unified_daemon:create_app`` (see that module's
|
|
22
|
-
uvicorn config). This module's ``auth_middleware`` keeps the older,
|
|
23
|
-
unconditional ``check_api_key``-only write gate (no daemon-capability /
|
|
24
|
-
install-token identity layer, no ``SLM_REQUIRE_API_KEY_LOOPBACK`` opt-in --
|
|
25
|
-
see ``infra/auth_middleware.py`` for that). Treat this file as a standalone
|
|
26
|
-
entry point only; the production write-auth boundary lives in
|
|
27
|
-
``unified_daemon.py``.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
import logging
|
|
31
|
-
import sys
|
|
32
|
-
from pathlib import Path
|
|
33
|
-
from datetime import datetime, timezone
|
|
34
|
-
|
|
35
|
-
logger = logging.getLogger(__name__)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
from superlocalmemory.server.routes.helpers import SLM_VERSION # noqa: E402
|
|
39
|
-
|
|
40
|
-
_script_dir = str(Path(__file__).parent.resolve())
|
|
41
|
-
sys.path = [p for p in sys.path if p not in ("", _script_dir)]
|
|
42
|
-
|
|
43
|
-
try:
|
|
44
|
-
from fastapi import FastAPI
|
|
45
|
-
from fastapi.staticfiles import StaticFiles
|
|
46
|
-
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
47
|
-
from fastapi.middleware.cors import CORSMiddleware
|
|
48
|
-
from fastapi.middleware.gzip import GZipMiddleware
|
|
49
|
-
import uvicorn
|
|
50
|
-
except ImportError:
|
|
51
|
-
raise ImportError(
|
|
52
|
-
"FastAPI dependencies not installed. "
|
|
53
|
-
"Install with: pip install 'fastapi[all]' uvicorn websockets"
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
from superlocalmemory.server.security_middleware import SecurityHeadersMiddleware
|
|
57
|
-
|
|
58
|
-
# V3 Paths — reuse the lazy resolvers from routes.helpers so the dashboard
|
|
59
|
-
# honours SLM_DATA_DIR / SL_MEMORY_PATH / SLM_HOME / config.json:base_dir
|
|
60
|
-
# exactly like the CLI. Previously this hardcoded ~/.superlocalmemory, which
|
|
61
|
-
# caused dashboard-created profiles to land in a different memory.db than
|
|
62
|
-
# `slm profile list` reads when a custom data dir was configured.
|
|
63
|
-
from superlocalmemory.server.routes.helpers import MEMORY_DIR, DB_PATH
|
|
64
|
-
# V3.3.21+: the dashboard ships inside the package (superlocalmemory/ui) for
|
|
65
|
-
# every install path — pip, npm, and editable checkouts. The legacy repo-root
|
|
66
|
-
# ui/ dev fallback was retired in v3.8.0 when that copy was deleted; the
|
|
67
|
-
# packaged directory is authoritative. A missing dir is surfaced at request
|
|
68
|
-
# time (see the "UI not found" handler below).
|
|
69
|
-
UI_DIR = Path(__file__).resolve().parent.parent / "ui"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def create_app() -> FastAPI:
|
|
73
|
-
"""Create and configure the FastAPI application."""
|
|
74
|
-
application = FastAPI(
|
|
75
|
-
title="SuperLocalMemory V4 UI Server",
|
|
76
|
-
description="Governed memory dashboard with trust, learning, and compliance controls.",
|
|
77
|
-
version=SLM_VERSION,
|
|
78
|
-
docs_url="/api/docs",
|
|
79
|
-
redoc_url="/api/redoc",
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
# Middleware (order matters: security headers should be outermost)
|
|
83
|
-
application.add_middleware(SecurityHeadersMiddleware)
|
|
84
|
-
application.add_middleware(GZipMiddleware, minimum_size=1000)
|
|
85
|
-
application.add_middleware(
|
|
86
|
-
CORSMiddleware,
|
|
87
|
-
allow_origins=[
|
|
88
|
-
"http://localhost:8765", "http://127.0.0.1:8765",
|
|
89
|
-
"http://localhost:8417", "http://127.0.0.1:8417",
|
|
90
|
-
],
|
|
91
|
-
allow_credentials=True,
|
|
92
|
-
allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
|
|
93
|
-
allow_headers=["Content-Type", "Authorization", "X-SLM-API-Key"],
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
# Rate limiting (graceful)
|
|
97
|
-
try:
|
|
98
|
-
from superlocalmemory.infra.rate_limiter import RateLimiter
|
|
99
|
-
from superlocalmemory.core.remote_mode import (
|
|
100
|
-
rate_limit_config,
|
|
101
|
-
is_rate_limit_exempt,
|
|
102
|
-
)
|
|
103
|
-
# v3.6.12 (issue #40): env-tunable thresholds (defaults unchanged).
|
|
104
|
-
_rl_write, _rl_read, _rl_window = rate_limit_config()
|
|
105
|
-
_write_limiter = RateLimiter(max_requests=_rl_write, window_seconds=_rl_window)
|
|
106
|
-
_read_limiter = RateLimiter(max_requests=_rl_read, window_seconds=_rl_window)
|
|
107
|
-
|
|
108
|
-
# Task #47: register for runtime reconfiguration via the dashboard.
|
|
109
|
-
try:
|
|
110
|
-
from superlocalmemory.infra.rate_limiter import (
|
|
111
|
-
register_managed as _reg_rl,
|
|
112
|
-
)
|
|
113
|
-
_reg_rl("write", _write_limiter)
|
|
114
|
-
_reg_rl("read", _read_limiter)
|
|
115
|
-
except Exception:
|
|
116
|
-
pass
|
|
117
|
-
|
|
118
|
-
@application.middleware("http")
|
|
119
|
-
async def rate_limit_middleware(request, call_next):
|
|
120
|
-
client_ip = request.client.host if request.client else "unknown"
|
|
121
|
-
if is_rate_limit_exempt(client_ip):
|
|
122
|
-
return await call_next(request)
|
|
123
|
-
is_write = request.method in ("POST", "PUT", "DELETE", "PATCH")
|
|
124
|
-
limiter = _write_limiter if is_write else _read_limiter
|
|
125
|
-
allowed, remaining = limiter.is_allowed(client_ip)
|
|
126
|
-
if not allowed:
|
|
127
|
-
from fastapi.responses import JSONResponse
|
|
128
|
-
return JSONResponse(
|
|
129
|
-
status_code=429,
|
|
130
|
-
content={"error": "Too many requests. Please slow down."},
|
|
131
|
-
headers={"Retry-After": str(limiter.window)},
|
|
132
|
-
)
|
|
133
|
-
response = await call_next(request)
|
|
134
|
-
response.headers["X-RateLimit-Remaining"] = str(remaining)
|
|
135
|
-
return response
|
|
136
|
-
except (ImportError, Exception):
|
|
137
|
-
pass
|
|
138
|
-
|
|
139
|
-
# Auth middleware (graceful)
|
|
140
|
-
try:
|
|
141
|
-
from superlocalmemory.infra.auth_middleware import check_api_key
|
|
142
|
-
|
|
143
|
-
@application.middleware("http")
|
|
144
|
-
async def auth_middleware(request, call_next):
|
|
145
|
-
is_write = request.method in ("POST", "PUT", "DELETE", "PATCH")
|
|
146
|
-
headers = dict(request.headers)
|
|
147
|
-
if not check_api_key(headers, is_write=is_write):
|
|
148
|
-
from fastapi.responses import JSONResponse
|
|
149
|
-
return JSONResponse(
|
|
150
|
-
status_code=401,
|
|
151
|
-
content={"error": "Invalid or missing API key."},
|
|
152
|
-
)
|
|
153
|
-
response = await call_next(request)
|
|
154
|
-
return response
|
|
155
|
-
except (ImportError, Exception):
|
|
156
|
-
pass
|
|
157
|
-
|
|
158
|
-
# Mount static files (UI directory)
|
|
159
|
-
UI_DIR.mkdir(exist_ok=True)
|
|
160
|
-
application.mount("/static", StaticFiles(directory=str(UI_DIR)), name="static")
|
|
161
|
-
|
|
162
|
-
# ========================================================================
|
|
163
|
-
# Register Route Modules
|
|
164
|
-
# ========================================================================
|
|
165
|
-
from superlocalmemory.server.routes.memories import router as memories_router
|
|
166
|
-
from superlocalmemory.server.routes.stats import router as stats_router
|
|
167
|
-
from superlocalmemory.server.routes.profiles import router as profiles_router
|
|
168
|
-
from superlocalmemory.server.routes.backup import router as backup_router
|
|
169
|
-
from superlocalmemory.server.routes.data_io import router as data_io_router
|
|
170
|
-
from superlocalmemory.server.routes.events import router as events_router, register_event_listener
|
|
171
|
-
from superlocalmemory.server.routes.agents import router as agents_router
|
|
172
|
-
from superlocalmemory.server.routes.ws import router as ws_router, manager as ws_manager
|
|
173
|
-
|
|
174
|
-
application.include_router(memories_router)
|
|
175
|
-
application.include_router(stats_router)
|
|
176
|
-
application.include_router(profiles_router)
|
|
177
|
-
application.include_router(backup_router)
|
|
178
|
-
application.include_router(data_io_router)
|
|
179
|
-
application.include_router(events_router)
|
|
180
|
-
application.include_router(agents_router)
|
|
181
|
-
application.include_router(ws_router)
|
|
182
|
-
|
|
183
|
-
# V3 API endpoints (dashboard, mode, trust, math, etc.)
|
|
184
|
-
from superlocalmemory.server.routes.v3_api import router as v3_router
|
|
185
|
-
application.include_router(v3_router)
|
|
186
|
-
|
|
187
|
-
# Config endpoints (storage, daemon, mesh, trust, forgetting)
|
|
188
|
-
from superlocalmemory.server.routes.config_api import router as config_api_router
|
|
189
|
-
application.include_router(config_api_router)
|
|
190
|
-
|
|
191
|
-
# v3.4.1: Chat SSE + Insights + Timeline endpoints
|
|
192
|
-
for _module_name_v341 in ("chat",):
|
|
193
|
-
try:
|
|
194
|
-
_mod_v341 = __import__(f"superlocalmemory.server.routes.{_module_name_v341}", fromlist=["router"])
|
|
195
|
-
application.include_router(_mod_v341.router)
|
|
196
|
-
except (ImportError, Exception) as _exc:
|
|
197
|
-
logger.warning("Optional router %s failed: %s", _module_name_v341, _exc)
|
|
198
|
-
|
|
199
|
-
# Graceful optional routers
|
|
200
|
-
for _module_name in ("learning", "lifecycle", "behavioral", "compliance"):
|
|
201
|
-
try:
|
|
202
|
-
_mod = __import__(f"superlocalmemory.server.routes.{_module_name}", fromlist=["router"])
|
|
203
|
-
application.include_router(_mod.router)
|
|
204
|
-
except (ImportError, Exception) as _exc:
|
|
205
|
-
# v3.6.12 (settings-3): was a silent `pass` — a transient import
|
|
206
|
-
# error in learning.py alone 404s 3 dashboard panes (Learning,
|
|
207
|
-
# Patterns, Feedback) with no trace. Log it like the chat loop above.
|
|
208
|
-
logger.warning("Optional router %s failed: %s", _module_name, _exc)
|
|
209
|
-
|
|
210
|
-
# Wire WebSocket manager into routes that need broadcast capability
|
|
211
|
-
import superlocalmemory.server.routes.profiles as _profiles_mod
|
|
212
|
-
import superlocalmemory.server.routes.data_io as _data_io_mod
|
|
213
|
-
_profiles_mod.ws_manager = ws_manager
|
|
214
|
-
_data_io_mod.ws_manager = ws_manager
|
|
215
|
-
|
|
216
|
-
# ========================================================================
|
|
217
|
-
# Basic Routes (root page + health check)
|
|
218
|
-
# ========================================================================
|
|
219
|
-
|
|
220
|
-
@application.get("/", response_class=HTMLResponse)
|
|
221
|
-
async def root():
|
|
222
|
-
"""Serve main UI page."""
|
|
223
|
-
index_path = UI_DIR / "index.html"
|
|
224
|
-
if not index_path.exists():
|
|
225
|
-
return (
|
|
226
|
-
"<!DOCTYPE html><html><head>"
|
|
227
|
-
"<title>SuperLocalMemory V4</title></head>"
|
|
228
|
-
"<body style='font-family:Arial;padding:40px'>"
|
|
229
|
-
"<h1>SuperLocalMemory V4 UI Server Running</h1>"
|
|
230
|
-
"<p>UI not found. Check ui/index.html</p>"
|
|
231
|
-
"<p><a href='/api/docs'>API Documentation</a></p>"
|
|
232
|
-
"</body></html>"
|
|
233
|
-
)
|
|
234
|
-
from superlocalmemory import __version__ as _v
|
|
235
|
-
|
|
236
|
-
# __SLM_VERSION__ was substituted only by the unified daemon, so the
|
|
237
|
-
# dashboard's upgrade detector did nothing when served from here.
|
|
238
|
-
# Asset versioning is cosmetic. It must never be why this page 500s.
|
|
239
|
-
#
|
|
240
|
-
# The import is deferred (house style, keeps startup lean), which means
|
|
241
|
-
# it resolves at REQUEST time — so when `pip install -e .` replaced the
|
|
242
|
-
# installed package underneath a running daemon, this route began
|
|
243
|
-
# answering "Internal Server Error" on the dashboard while every other
|
|
244
|
-
# endpoint was fine. A stale hand-written version string is a trifle; a
|
|
245
|
-
# blank page is not. Fall back to the file as written.
|
|
246
|
-
try:
|
|
247
|
-
from superlocalmemory.server.asset_versions import render_index
|
|
248
|
-
|
|
249
|
-
return render_index(
|
|
250
|
-
index_path, UI_DIR, substitutions={"__SLM_VERSION__": _v},
|
|
251
|
-
)
|
|
252
|
-
except Exception as exc: # noqa: BLE001 — serve the page regardless
|
|
253
|
-
logger.warning(
|
|
254
|
-
"asset version rewrite unavailable, serving index.html as "
|
|
255
|
-
"written: %s: %s", type(exc).__name__, exc,
|
|
256
|
-
)
|
|
257
|
-
return index_path.read_text().replace("__SLM_VERSION__", _v)
|
|
258
|
-
|
|
259
|
-
@application.get("/favicon.ico", include_in_schema=False)
|
|
260
|
-
async def favicon():
|
|
261
|
-
"""Serve the packaged SVG icon for browsers that request favicon.ico."""
|
|
262
|
-
return RedirectResponse(url="/static/favicon.svg", status_code=307)
|
|
263
|
-
|
|
264
|
-
@application.get("/health")
|
|
265
|
-
async def health_check():
|
|
266
|
-
"""Health check endpoint."""
|
|
267
|
-
return {
|
|
268
|
-
"status": "healthy",
|
|
269
|
-
"version": SLM_VERSION,
|
|
270
|
-
"database": "connected" if DB_PATH.exists() else "missing",
|
|
271
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
# ========================================================================
|
|
275
|
-
# Startup Events
|
|
276
|
-
# ========================================================================
|
|
277
|
-
|
|
278
|
-
@application.on_event("startup")
|
|
279
|
-
async def startup_event():
|
|
280
|
-
"""Initialize event bus and warm up worker subprocess.
|
|
281
|
-
|
|
282
|
-
Engine runs in subprocess worker (never in this process).
|
|
283
|
-
Background warmup pre-loads PyTorch + models so first recall is fast.
|
|
284
|
-
"""
|
|
285
|
-
application.state.engine = None
|
|
286
|
-
logger.info("Dashboard started (~60 MB, engine runs in subprocess worker)")
|
|
287
|
-
register_event_listener()
|
|
288
|
-
|
|
289
|
-
# Background warmup: pre-spawn worker and load all models.
|
|
290
|
-
# This runs in a daemon thread — dashboard is responsive immediately.
|
|
291
|
-
# Worker will be ready by the time user does first search (~10-30s).
|
|
292
|
-
try:
|
|
293
|
-
from superlocalmemory.core.worker_pool import WorkerPool
|
|
294
|
-
WorkerPool.shared().warmup()
|
|
295
|
-
logger.info("Worker warmup initiated (background)")
|
|
296
|
-
except Exception as exc:
|
|
297
|
-
logger.warning("Worker warmup failed to start: %s", exc)
|
|
298
|
-
|
|
299
|
-
@application.on_event("shutdown")
|
|
300
|
-
async def shutdown_event():
|
|
301
|
-
"""Kill worker subprocess on dashboard shutdown."""
|
|
302
|
-
try:
|
|
303
|
-
from superlocalmemory.core.worker_pool import WorkerPool
|
|
304
|
-
WorkerPool.shared().shutdown()
|
|
305
|
-
except Exception:
|
|
306
|
-
pass
|
|
307
|
-
|
|
308
|
-
return application
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
app = create_app()
|
|
312
|
-
|
|
313
|
-
# ============================================================================
|
|
314
|
-
# Server Startup
|
|
315
|
-
# ============================================================================
|
|
316
|
-
|
|
317
|
-
if __name__ == "__main__":
|
|
318
|
-
import argparse
|
|
319
|
-
import socket
|
|
320
|
-
|
|
321
|
-
parser = argparse.ArgumentParser(description="SuperLocalMemory V4 - Web Dashboard")
|
|
322
|
-
parser.add_argument("--port", type=int, default=8765, help="Port (default 8765)")
|
|
323
|
-
parser.add_argument("--profile", type=str, default=None, help="Memory profile")
|
|
324
|
-
args = parser.parse_args()
|
|
325
|
-
|
|
326
|
-
def find_available_port(preferred: int) -> int:
|
|
327
|
-
for port in [preferred] + list(range(preferred + 1, preferred + 20)):
|
|
328
|
-
try:
|
|
329
|
-
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
330
|
-
s.bind(("127.0.0.1", port))
|
|
331
|
-
return port
|
|
332
|
-
except OSError:
|
|
333
|
-
continue
|
|
334
|
-
return preferred
|
|
335
|
-
|
|
336
|
-
ui_port = find_available_port(args.port)
|
|
337
|
-
if ui_port != args.port:
|
|
338
|
-
print(f"\n Port {args.port} in use -- using {ui_port} instead\n")
|
|
339
|
-
|
|
340
|
-
print("=" * 70)
|
|
341
|
-
print(" SuperLocalMemory V4 - Web Dashboard")
|
|
342
|
-
print(" Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar")
|
|
343
|
-
print("=" * 70)
|
|
344
|
-
print(f" Database: {DB_PATH}")
|
|
345
|
-
print(f" UI: {UI_DIR}")
|
|
346
|
-
print("=" * 70)
|
|
347
|
-
print(f"\n Dashboard: http://localhost:{ui_port}")
|
|
348
|
-
print(f" API Docs: http://localhost:{ui_port}/api/docs")
|
|
349
|
-
print(f" Health: http://localhost:{ui_port}/health")
|
|
350
|
-
print(f" SSE Stream: http://localhost:{ui_port}/events/stream")
|
|
351
|
-
print(f" WebSocket: ws://localhost:{ui_port}/ws/updates")
|
|
352
|
-
print("\n Press Ctrl+C to stop\n")
|
|
353
|
-
|
|
354
|
-
uvicorn.run(app, host="127.0.0.1", port=ui_port, log_level="info", access_log=True)
|