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 +0,0 @@
|
|
|
1
|
-
# Server package — API and UI servers
|
|
@@ -1,310 +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 API Server
|
|
7
|
-
Provides REST endpoints for memory visualization and exploration.
|
|
8
|
-
Uses V3 MemoryEngine for all operations.
|
|
9
|
-
|
|
10
|
-
v3.7.8 (WS3 F4): ``create_app()`` in this module is a standalone/legacy app
|
|
11
|
-
factory. The running daemon serves ``superlocalmemory.server.unified_daemon:
|
|
12
|
-
create_app`` (see ``unified_daemon.py``'s uvicorn config); THIS factory is
|
|
13
|
-
reachable only via direct ``python -m superlocalmemory.server.api`` /
|
|
14
|
-
programmatic use and the tests that exercise it directly
|
|
15
|
-
(``tests/test_api/test_api_lifespan_contract.py``,
|
|
16
|
-
``tests/test_security/test_rate_limit_e2e.py``). Its ``auth_middleware``
|
|
17
|
-
below intentionally keeps the older, simpler ``check_api_key``-only gate
|
|
18
|
-
(unconditional per-write check, no daemon-capability / install-token
|
|
19
|
-
identity layer) because it predates and is independent of the unified
|
|
20
|
-
daemon's richer ``write_identity.require_http_mutation_actor`` boundary and
|
|
21
|
-
the ``SLM_REQUIRE_API_KEY_LOOPBACK`` opt-in (see
|
|
22
|
-
``infra/auth_middleware.py``). Do not treat this module's auth posture as
|
|
23
|
-
the production write boundary -- that is ``unified_daemon.py``'s
|
|
24
|
-
``auth_middleware``. ``UI_DIR`` below is still imported by
|
|
25
|
-
``unified_daemon.py`` and must not be removed.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
import json
|
|
29
|
-
import logging
|
|
30
|
-
from pathlib import Path
|
|
31
|
-
from contextlib import asynccontextmanager
|
|
32
|
-
from typing import Optional
|
|
33
|
-
|
|
34
|
-
from fastapi import FastAPI, HTTPException, Query, Request
|
|
35
|
-
from fastapi.staticfiles import StaticFiles
|
|
36
|
-
from fastapi.responses import HTMLResponse
|
|
37
|
-
from fastapi.middleware.cors import CORSMiddleware
|
|
38
|
-
from fastapi.middleware.gzip import GZipMiddleware
|
|
39
|
-
from pydantic import BaseModel
|
|
40
|
-
import uvicorn
|
|
41
|
-
|
|
42
|
-
from superlocalmemory.core.config import CANONICAL_RECALL_LIMIT
|
|
43
|
-
from superlocalmemory.server.security_middleware import SecurityHeadersMiddleware
|
|
44
|
-
from superlocalmemory.server.routes.helpers import SLM_VERSION
|
|
45
|
-
from superlocalmemory.infra.data_root import DynamicStatePath
|
|
46
|
-
|
|
47
|
-
logger = logging.getLogger("superlocalmemory.api_server")
|
|
48
|
-
|
|
49
|
-
# V3 paths
|
|
50
|
-
MEMORY_DIR = DynamicStatePath()
|
|
51
|
-
DB_PATH = DynamicStatePath("memory.db")
|
|
52
|
-
# V3.3.21+: the dashboard ships inside the package (superlocalmemory/ui) for
|
|
53
|
-
# every install path. The legacy repo-root ui/ dev fallback was retired in
|
|
54
|
-
# v3.8.0 when that copy was deleted; the packaged directory is authoritative.
|
|
55
|
-
UI_DIR = Path(__file__).resolve().parent.parent / "ui"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
# ============================================================================
|
|
59
|
-
# Request/Response Models
|
|
60
|
-
# ============================================================================
|
|
61
|
-
|
|
62
|
-
class SearchRequest(BaseModel):
|
|
63
|
-
query: str
|
|
64
|
-
limit: int = CANONICAL_RECALL_LIMIT
|
|
65
|
-
min_score: float = 0.3
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
class MemoryFilter(BaseModel):
|
|
69
|
-
category: Optional[str] = None
|
|
70
|
-
project_name: Optional[str] = None
|
|
71
|
-
cluster_id: Optional[int] = None
|
|
72
|
-
min_importance: Optional[int] = None
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# ============================================================================
|
|
76
|
-
# V3 Engine Initialization (lifespan context)
|
|
77
|
-
# ============================================================================
|
|
78
|
-
|
|
79
|
-
@asynccontextmanager
|
|
80
|
-
async def lifespan(application: FastAPI):
|
|
81
|
-
"""Initialize V3 engine on startup, cleanup on shutdown."""
|
|
82
|
-
try:
|
|
83
|
-
from superlocalmemory.core.config import SLMConfig
|
|
84
|
-
from superlocalmemory.core.engine import MemoryEngine
|
|
85
|
-
|
|
86
|
-
config = SLMConfig.load()
|
|
87
|
-
engine = MemoryEngine(config)
|
|
88
|
-
engine.initialize()
|
|
89
|
-
application.state.engine = engine
|
|
90
|
-
application.state.config = config
|
|
91
|
-
logger.info("V3 MemoryEngine initialized: mode=%s", config.mode.value)
|
|
92
|
-
except Exception as exc:
|
|
93
|
-
logger.warning("V3 engine init failed (API will use fallback): %s", exc)
|
|
94
|
-
application.state.engine = None
|
|
95
|
-
application.state.config = None
|
|
96
|
-
|
|
97
|
-
# Event fan-out belongs to the same application lifecycle as the engine.
|
|
98
|
-
# Registering it through FastAPI.on_event created a second, deprecated
|
|
99
|
-
# startup path and made TestClient initialization emit warnings.
|
|
100
|
-
from superlocalmemory.server.routes.events import register_event_listener
|
|
101
|
-
|
|
102
|
-
register_event_listener()
|
|
103
|
-
yield
|
|
104
|
-
|
|
105
|
-
# Cleanup
|
|
106
|
-
if hasattr(application.state, 'engine') and application.state.engine:
|
|
107
|
-
application.state.engine.close()
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def create_app() -> FastAPI:
|
|
111
|
-
"""Create and configure the FastAPI application."""
|
|
112
|
-
application = FastAPI(
|
|
113
|
-
title="SuperLocalMemory V4 API",
|
|
114
|
-
description="V4 Memory Engine REST API",
|
|
115
|
-
version=SLM_VERSION,
|
|
116
|
-
lifespan=lifespan,
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
# Middleware
|
|
120
|
-
application.add_middleware(SecurityHeadersMiddleware)
|
|
121
|
-
application.add_middleware(GZipMiddleware, minimum_size=1000)
|
|
122
|
-
application.add_middleware(
|
|
123
|
-
CORSMiddleware,
|
|
124
|
-
allow_origins=[
|
|
125
|
-
"http://localhost:8765", "http://127.0.0.1:8765",
|
|
126
|
-
"http://localhost:8417", "http://127.0.0.1:8417",
|
|
127
|
-
],
|
|
128
|
-
allow_credentials=True,
|
|
129
|
-
allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
|
|
130
|
-
allow_headers=["Content-Type", "Authorization", "X-SLM-API-Key"],
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
# Rate limiting (graceful)
|
|
134
|
-
try:
|
|
135
|
-
from superlocalmemory.infra.rate_limiter import RateLimiter
|
|
136
|
-
from superlocalmemory.core.remote_mode import (
|
|
137
|
-
rate_limit_config,
|
|
138
|
-
is_rate_limit_exempt,
|
|
139
|
-
)
|
|
140
|
-
# v3.6.12 (issue #40): env-tunable thresholds (defaults unchanged).
|
|
141
|
-
_rl_write, _rl_read, _rl_window = rate_limit_config()
|
|
142
|
-
_write_limiter = RateLimiter(max_requests=_rl_write, window_seconds=_rl_window)
|
|
143
|
-
_read_limiter = RateLimiter(max_requests=_rl_read, window_seconds=_rl_window)
|
|
144
|
-
|
|
145
|
-
@application.middleware("http")
|
|
146
|
-
async def rate_limit_middleware(request, call_next):
|
|
147
|
-
client_ip = request.client.host if request.client else "unknown"
|
|
148
|
-
if is_rate_limit_exempt(client_ip):
|
|
149
|
-
return await call_next(request)
|
|
150
|
-
is_write = request.method in ("POST", "PUT", "DELETE", "PATCH")
|
|
151
|
-
limiter = _write_limiter if is_write else _read_limiter
|
|
152
|
-
allowed, remaining = limiter.is_allowed(client_ip)
|
|
153
|
-
if not allowed:
|
|
154
|
-
from fastapi.responses import JSONResponse
|
|
155
|
-
return JSONResponse(
|
|
156
|
-
status_code=429,
|
|
157
|
-
content={"error": "Too many requests."},
|
|
158
|
-
headers={"Retry-After": str(limiter.window)},
|
|
159
|
-
)
|
|
160
|
-
response = await call_next(request)
|
|
161
|
-
response.headers["X-RateLimit-Remaining"] = str(remaining)
|
|
162
|
-
return response
|
|
163
|
-
except (ImportError, Exception):
|
|
164
|
-
pass
|
|
165
|
-
|
|
166
|
-
# Auth middleware (graceful)
|
|
167
|
-
try:
|
|
168
|
-
from superlocalmemory.infra.auth_middleware import check_api_key
|
|
169
|
-
|
|
170
|
-
@application.middleware("http")
|
|
171
|
-
async def auth_middleware(request, call_next):
|
|
172
|
-
is_write = request.method in ("POST", "PUT", "DELETE", "PATCH")
|
|
173
|
-
headers = dict(request.headers)
|
|
174
|
-
if not check_api_key(headers, is_write=is_write):
|
|
175
|
-
from fastapi.responses import JSONResponse
|
|
176
|
-
return JSONResponse(
|
|
177
|
-
status_code=401,
|
|
178
|
-
content={"error": "Invalid or missing API key."},
|
|
179
|
-
)
|
|
180
|
-
response = await call_next(request)
|
|
181
|
-
return response
|
|
182
|
-
except (ImportError, Exception):
|
|
183
|
-
pass
|
|
184
|
-
|
|
185
|
-
# Mount static files
|
|
186
|
-
UI_DIR.mkdir(exist_ok=True)
|
|
187
|
-
application.mount("/static", StaticFiles(directory=str(UI_DIR)), name="static")
|
|
188
|
-
|
|
189
|
-
# ========================================================================
|
|
190
|
-
# Register Route Modules
|
|
191
|
-
# ========================================================================
|
|
192
|
-
from superlocalmemory.server.routes.memories import router as memories_router
|
|
193
|
-
from superlocalmemory.server.routes.stats import router as stats_router
|
|
194
|
-
from superlocalmemory.server.routes.profiles import router as profiles_router
|
|
195
|
-
from superlocalmemory.server.routes.backup import router as backup_router
|
|
196
|
-
from superlocalmemory.server.routes.data_io import router as data_io_router
|
|
197
|
-
from superlocalmemory.server.routes.events import router as events_router
|
|
198
|
-
from superlocalmemory.server.routes.agents import router as agents_router
|
|
199
|
-
from superlocalmemory.server.routes.ws import router as ws_router, manager as ws_manager
|
|
200
|
-
from superlocalmemory.server.routes.v3_api import router as v3_router
|
|
201
|
-
|
|
202
|
-
application.include_router(memories_router)
|
|
203
|
-
application.include_router(stats_router)
|
|
204
|
-
application.include_router(profiles_router)
|
|
205
|
-
application.include_router(backup_router)
|
|
206
|
-
application.include_router(data_io_router)
|
|
207
|
-
application.include_router(events_router)
|
|
208
|
-
application.include_router(agents_router)
|
|
209
|
-
application.include_router(ws_router)
|
|
210
|
-
application.include_router(v3_router)
|
|
211
|
-
|
|
212
|
-
# v3.4.1: Chat SSE endpoint
|
|
213
|
-
for _module_name_v341 in ("chat",):
|
|
214
|
-
try:
|
|
215
|
-
_mod_v341 = __import__(f"superlocalmemory.server.routes.{_module_name_v341}", fromlist=["router"])
|
|
216
|
-
application.include_router(_mod_v341.router)
|
|
217
|
-
except (ImportError, Exception):
|
|
218
|
-
pass
|
|
219
|
-
|
|
220
|
-
# Graceful optional routers
|
|
221
|
-
for _module_name in ("learning", "lifecycle", "behavioral", "compliance", "insights", "timeline"):
|
|
222
|
-
try:
|
|
223
|
-
_mod = __import__(f"superlocalmemory.server.routes.{_module_name}", fromlist=["router"])
|
|
224
|
-
application.include_router(_mod.router)
|
|
225
|
-
except (ImportError, Exception):
|
|
226
|
-
pass
|
|
227
|
-
|
|
228
|
-
# Wire WebSocket manager
|
|
229
|
-
import superlocalmemory.server.routes.profiles as _profiles_mod
|
|
230
|
-
import superlocalmemory.server.routes.data_io as _data_io_mod
|
|
231
|
-
_profiles_mod.ws_manager = ws_manager
|
|
232
|
-
_data_io_mod.ws_manager = ws_manager
|
|
233
|
-
|
|
234
|
-
# ========================================================================
|
|
235
|
-
# Basic Routes
|
|
236
|
-
# ========================================================================
|
|
237
|
-
|
|
238
|
-
@application.get("/", response_class=HTMLResponse)
|
|
239
|
-
async def root():
|
|
240
|
-
"""Serve main UI page."""
|
|
241
|
-
index_path = UI_DIR / "index.html"
|
|
242
|
-
if not index_path.exists():
|
|
243
|
-
return (
|
|
244
|
-
"<html><head><title>SuperLocalMemory V4</title></head>"
|
|
245
|
-
"<body style='font-family:Arial;padding:40px'>"
|
|
246
|
-
"<h1>SuperLocalMemory V4 API Server Running</h1>"
|
|
247
|
-
"<p><a href='/docs'>API Documentation</a></p>"
|
|
248
|
-
"</body></html>"
|
|
249
|
-
)
|
|
250
|
-
from superlocalmemory import __version__ as _v
|
|
251
|
-
|
|
252
|
-
# __SLM_VERSION__ was substituted only by the unified daemon, so the
|
|
253
|
-
# dashboard's upgrade detector did nothing when served from here.
|
|
254
|
-
# Asset versioning is cosmetic. It must never be why this page 500s.
|
|
255
|
-
#
|
|
256
|
-
# The import is deferred (house style, keeps startup lean), which means
|
|
257
|
-
# it resolves at REQUEST time — so when `pip install -e .` replaced the
|
|
258
|
-
# installed package underneath a running daemon, this route began
|
|
259
|
-
# answering "Internal Server Error" on the dashboard while every other
|
|
260
|
-
# endpoint was fine. A stale hand-written version string is a trifle; a
|
|
261
|
-
# blank page is not. Fall back to the file as written.
|
|
262
|
-
try:
|
|
263
|
-
from superlocalmemory.server.asset_versions import render_index
|
|
264
|
-
|
|
265
|
-
return render_index(
|
|
266
|
-
index_path, UI_DIR, substitutions={"__SLM_VERSION__": _v},
|
|
267
|
-
)
|
|
268
|
-
except Exception as exc: # noqa: BLE001 — serve the page regardless
|
|
269
|
-
logger.warning(
|
|
270
|
-
"asset version rewrite unavailable, serving index.html as "
|
|
271
|
-
"written: %s: %s", type(exc).__name__, exc,
|
|
272
|
-
)
|
|
273
|
-
return index_path.read_text().replace("__SLM_VERSION__", _v)
|
|
274
|
-
|
|
275
|
-
@application.get("/health")
|
|
276
|
-
async def health_check():
|
|
277
|
-
"""Health check."""
|
|
278
|
-
from datetime import datetime, timezone
|
|
279
|
-
engine = application.state.engine
|
|
280
|
-
return {
|
|
281
|
-
"status": "healthy",
|
|
282
|
-
"version": SLM_VERSION,
|
|
283
|
-
"engine": "initialized" if engine else "unavailable",
|
|
284
|
-
"database": "connected" if DB_PATH.exists() else "missing",
|
|
285
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
return application
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
# v3.4.3: Module-level app removed to prevent duplicate MemoryEngine.
|
|
292
|
-
# The unified daemon (server/unified_daemon.py) imports routes from this
|
|
293
|
-
# module via _register_dashboard_routes(). Do NOT create app here.
|
|
294
|
-
# For standalone use: python -m superlocalmemory.server.api
|
|
295
|
-
|
|
296
|
-
if __name__ == "__main__":
|
|
297
|
-
app = create_app()
|
|
298
|
-
print("=" * 60)
|
|
299
|
-
print("SuperLocalMemory V4 - API Server (standalone mode)")
|
|
300
|
-
print("=" * 60)
|
|
301
|
-
print(f"Database: {DB_PATH}")
|
|
302
|
-
print(f"UI Directory: {UI_DIR}")
|
|
303
|
-
print("=" * 60)
|
|
304
|
-
print("\nStarting server on http://localhost:8000")
|
|
305
|
-
print("API Documentation: http://localhost:8000/docs")
|
|
306
|
-
print("\nPress Ctrl+C to stop\n")
|
|
307
|
-
|
|
308
|
-
uvicorn.run(
|
|
309
|
-
app, host="127.0.0.1", port=8000, log_level="info",
|
|
310
|
-
)
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Derive the dashboard's asset cache-busters from the files themselves.
|
|
5
|
-
|
|
6
|
-
``index.html`` referenced 64 static assets. 35 carried a hand-written
|
|
7
|
-
``?v=`` literal and 29 carried nothing, and not one of them was derived from the
|
|
8
|
-
file it pointed at. So the version strings looked like cache-busting and were
|
|
9
|
-
not: editing a JS or CSS file left its ``?v=`` reading whatever the last person
|
|
10
|
-
typed, which during 4.0.10 was ``022ff653`` on a file that had changed.
|
|
11
|
-
|
|
12
|
-
WHAT THIS DOES AND DOES NOT FIX
|
|
13
|
-
-------------------------------
|
|
14
|
-
It does not fix a live user-facing bug, and it would be dishonest to claim it
|
|
15
|
-
does. Three mechanisms already stop a stale asset reaching a browser on this
|
|
16
|
-
server, and the first was verified against the running daemon rather than read:
|
|
17
|
-
|
|
18
|
-
* ``/static/*`` is served ``Cache-Control: no-cache, must-revalidate`` with an
|
|
19
|
-
ETag (``server/security_middleware.py``), so a browser must revalidate and
|
|
20
|
-
cannot serve a cached copy without asking.
|
|
21
|
-
* The unified daemon copies the whole UI tree into the data directory on every
|
|
22
|
-
start (``unified_daemon.py``, ``state_path("ui")``), so an upgrade refreshes
|
|
23
|
-
the files it serves.
|
|
24
|
-
* ``index.html`` itself is ``no-cache``, so the page is always re-read.
|
|
25
|
-
|
|
26
|
-
What it fixes is a **trap**, and unblocks a real improvement:
|
|
27
|
-
|
|
28
|
-
* 64 references, none tracking content. Anyone reading them concludes
|
|
29
|
-
cache-busting is handled here, which is how the 4.0.10 change shipped with a
|
|
30
|
-
stale literal and how the next one would too. A number that is maintained by
|
|
31
|
-
hand and consulted by nobody is worse than no number.
|
|
32
|
-
* The revalidation policy is the only thing making that safe, and it costs a
|
|
33
|
-
conditional request per asset on every page load — 64 of them. The obvious
|
|
34
|
-
optimisation is ``max-age`` with a long life, and today that change would
|
|
35
|
-
turn every hand-typed literal into an immediate live bug. With versions
|
|
36
|
-
derived from content it becomes safe to make. That policy change is NOT
|
|
37
|
-
made here; it needs its own measurement.
|
|
38
|
-
* A proxy or CDN that ignores ``no-cache`` is defeated by a URL that changes,
|
|
39
|
-
not by a header.
|
|
40
|
-
|
|
41
|
-
DESIGN
|
|
42
|
-
------
|
|
43
|
-
Rewrite at serve time rather than at build time, because there is no build step:
|
|
44
|
-
the UI ships as source files and is copied into place. The hash is computed from
|
|
45
|
-
file bytes and cached on ``(size, mtime_ns)``, so a warm daemon does one ``stat``
|
|
46
|
-
per asset per page load and no reads. Unresolvable references keep whatever the
|
|
47
|
-
HTML said, so a missing file or an odd path degrades to today's behaviour rather
|
|
48
|
-
than breaking the page.
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
from __future__ import annotations
|
|
52
|
-
|
|
53
|
-
import hashlib
|
|
54
|
-
import logging
|
|
55
|
-
import re
|
|
56
|
-
from pathlib import Path
|
|
57
|
-
|
|
58
|
-
logger = logging.getLogger(__name__)
|
|
59
|
-
|
|
60
|
-
__all__ = ["render_index", "asset_version", "rewrite_asset_versions"]
|
|
61
|
-
|
|
62
|
-
#: Characters of hex digest used in a URL. Eight is what the existing literals
|
|
63
|
-
#: used and is ample: these identify one file's revisions, not a global
|
|
64
|
-
#: namespace, so a collision needs two versions of the same file agreeing on
|
|
65
|
-
#: eight hex characters.
|
|
66
|
-
_HASH_CHARS = 8
|
|
67
|
-
|
|
68
|
-
#: ``src="static/…"`` / ``href="static/…"`` with an optional existing ``?v=``.
|
|
69
|
-
#: Deliberately narrow — only the ``static/`` prefix the dashboard mounts, only
|
|
70
|
-
#: double-quoted attributes, and the path is captured without its query so the
|
|
71
|
-
#: rewrite cannot alter it.
|
|
72
|
-
_ASSET_REF = re.compile(
|
|
73
|
-
r'(?P<attr>\b(?:src|href)=")'
|
|
74
|
-
r'(?P<path>static/[^"?#]+)'
|
|
75
|
-
r'(?P<query>\?[^"#]*)?'
|
|
76
|
-
r'(?P<fragment>#[^"]*)?'
|
|
77
|
-
r'(?P<close>")'
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
#: (resolved path) -> (size, mtime_ns, digest). Keyed on the path so a daemon
|
|
81
|
-
#: serving from the data-directory copy and one serving from the source tree do
|
|
82
|
-
#: not share entries.
|
|
83
|
-
_CACHE: dict[Path, tuple[int, int, str]] = {}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def asset_version(asset_path: Path) -> str | None:
|
|
87
|
-
"""Short content hash of ``asset_path``, or None if it cannot be read.
|
|
88
|
-
|
|
89
|
-
Cached on ``(size, mtime_ns)``. That pair is what ETag generators use for
|
|
90
|
-
the same reason: it changes on every practical edit, and re-reading a file
|
|
91
|
-
that has not changed costs a page-load's worth of I/O for nothing.
|
|
92
|
-
|
|
93
|
-
``mtime_ns`` rather than ``mtime``: the UI is installed with
|
|
94
|
-
``shutil.copytree``, which preserves timestamps, so two files written inside
|
|
95
|
-
the same filesystem tick are a real possibility on a fast copy.
|
|
96
|
-
"""
|
|
97
|
-
try:
|
|
98
|
-
stat = asset_path.stat()
|
|
99
|
-
except OSError:
|
|
100
|
-
return None
|
|
101
|
-
|
|
102
|
-
key = (stat.st_size, stat.st_mtime_ns)
|
|
103
|
-
cached = _CACHE.get(asset_path)
|
|
104
|
-
if cached is not None and cached[:2] == key:
|
|
105
|
-
return cached[2]
|
|
106
|
-
|
|
107
|
-
try:
|
|
108
|
-
digest = hashlib.sha256(asset_path.read_bytes()).hexdigest()[:_HASH_CHARS]
|
|
109
|
-
except OSError as exc:
|
|
110
|
-
logger.debug("asset version unavailable for %s: %s", asset_path, exc)
|
|
111
|
-
return None
|
|
112
|
-
|
|
113
|
-
_CACHE[asset_path] = (*key, digest)
|
|
114
|
-
return digest
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
def rewrite_asset_versions(html: str, ui_root: Path) -> str:
|
|
118
|
-
"""Replace every ``static/…?v=`` with a version derived from the file.
|
|
119
|
-
|
|
120
|
-
``ui_root`` is the directory mounted at ``/static``, so a reference to
|
|
121
|
-
``static/js/core.js`` resolves to ``ui_root/js/core.js`` — the ``static/``
|
|
122
|
-
segment is the mount point, not a directory on disk. Getting that wrong
|
|
123
|
-
silently resolves nothing and leaves all 64 literals in place, which is why
|
|
124
|
-
the test asserts a version actually moved rather than only that the call
|
|
125
|
-
returned.
|
|
126
|
-
|
|
127
|
-
Assets with no existing query gain one. That is a URL change, and it is the
|
|
128
|
-
point: 29 of the 64 references had no cache-buster at all, so they were the
|
|
129
|
-
ones a policy change would break first.
|
|
130
|
-
"""
|
|
131
|
-
|
|
132
|
-
def _replace(match: re.Match[str]) -> str:
|
|
133
|
-
path = match.group("path")
|
|
134
|
-
version = asset_version(ui_root / path[len("static/"):])
|
|
135
|
-
if version is None:
|
|
136
|
-
# Keep whatever the HTML said. A reference we cannot resolve is not
|
|
137
|
-
# a reason to serve a page that cannot load its own stylesheet.
|
|
138
|
-
return match.group(0)
|
|
139
|
-
return (
|
|
140
|
-
f"{match.group('attr')}{path}?v={version}"
|
|
141
|
-
f"{match.group('fragment') or ''}{match.group('close')}"
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
return _ASSET_REF.sub(_replace, html)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
def render_index(
|
|
148
|
-
index_path: Path,
|
|
149
|
-
ui_root: Path | None = None,
|
|
150
|
-
*,
|
|
151
|
-
substitutions: dict[str, str] | None = None,
|
|
152
|
-
) -> str:
|
|
153
|
-
"""Read ``index.html`` and prepare it for serving.
|
|
154
|
-
|
|
155
|
-
One function for the three ``root()`` handlers (``api.py``, ``ui.py``,
|
|
156
|
-
``unified_daemon.py``) that each read this file and returned it. They had
|
|
157
|
-
drifted: only the daemon substituted ``__SLM_VERSION__``, so the upgrade
|
|
158
|
-
detector the dashboard relies on silently did nothing on the other two.
|
|
159
|
-
|
|
160
|
-
``ui_root`` defaults to the file's own directory, which is correct for every
|
|
161
|
-
caller today — ``index.html`` sits at the root of the tree mounted at
|
|
162
|
-
``/static``.
|
|
163
|
-
|
|
164
|
-
Raises ``OSError`` if the index itself cannot be read; every caller already
|
|
165
|
-
checks ``exists()`` and has its own fallback page.
|
|
166
|
-
"""
|
|
167
|
-
html = index_path.read_text()
|
|
168
|
-
html = rewrite_asset_versions(html, ui_root or index_path.parent)
|
|
169
|
-
for placeholder, value in (substitutions or {}).items():
|
|
170
|
-
html = html.replace(placeholder, value)
|
|
171
|
-
return html
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory v3.4.22 — LLD-03 §3.5 + §3.6
|
|
4
|
-
|
|
5
|
-
"""Background schedulers for the v3.4.22 contextual bandit.
|
|
6
|
-
|
|
7
|
-
Two asyncio tasks, both registered in the daemon lifespan:
|
|
8
|
-
|
|
9
|
-
1. Reward-proxy settler — every 60 s (``SLM_BANDIT_REWARD_WINDOW_SEC``),
|
|
10
|
-
calls ``reward_proxy.settle_stale_plays`` for the configured profile(s).
|
|
11
|
-
2. Retention sweep — every 24 h
|
|
12
|
-
(``SLM_BANDIT_PLAYS_RETENTION_INTERVAL_SEC``), calls
|
|
13
|
-
``bandit.retention_sweep`` with the configured horizon
|
|
14
|
-
(``SLM_BANDIT_PLAYS_RETENTION_DAYS``, default 7).
|
|
15
|
-
|
|
16
|
-
Both honour ``SLM_BANDIT_DISABLED=1`` (caller checks before scheduling).
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import asyncio
|
|
22
|
-
import logging
|
|
23
|
-
import os
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
from typing import Any
|
|
26
|
-
|
|
27
|
-
from superlocalmemory.infra.data_root import state_path
|
|
28
|
-
|
|
29
|
-
logger = logging.getLogger(__name__)
|
|
30
|
-
|
|
31
|
-
_REWARD_INTERVAL = float(
|
|
32
|
-
os.environ.get("SLM_BANDIT_REWARD_WINDOW_SEC", "60"),
|
|
33
|
-
)
|
|
34
|
-
_RETENTION_INTERVAL = float(
|
|
35
|
-
os.environ.get("SLM_BANDIT_PLAYS_RETENTION_INTERVAL_SEC", "86400"),
|
|
36
|
-
)
|
|
37
|
-
_RETENTION_DAYS = int(
|
|
38
|
-
os.environ.get("SLM_BANDIT_PLAYS_RETENTION_DAYS", "7"),
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _learning_db(config: Any) -> Path:
|
|
43
|
-
if config is not None:
|
|
44
|
-
cand = getattr(config, "learning_db_path", None)
|
|
45
|
-
if cand is not None:
|
|
46
|
-
return Path(cand)
|
|
47
|
-
return state_path("learning.db")
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def _memory_db(config: Any) -> Path:
|
|
51
|
-
if config is not None:
|
|
52
|
-
cand = getattr(config, "db_path", None)
|
|
53
|
-
if cand is not None:
|
|
54
|
-
return Path(cand)
|
|
55
|
-
return state_path("memory.db")
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def _profile_id(config: Any) -> str:
|
|
59
|
-
if config is not None:
|
|
60
|
-
pid = getattr(config, "default_profile", None)
|
|
61
|
-
if isinstance(pid, str) and pid:
|
|
62
|
-
return pid
|
|
63
|
-
return "default"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
async def _reward_proxy_loop(
|
|
67
|
-
learning_db: Path, memory_db: Path, profile_id: str,
|
|
68
|
-
interval_sec: float,
|
|
69
|
-
) -> None:
|
|
70
|
-
"""Run the proxy settler on a steady interval. Never raises."""
|
|
71
|
-
from superlocalmemory.learning.reward_from_outcomes import (
|
|
72
|
-
settle_from_outcomes,
|
|
73
|
-
)
|
|
74
|
-
from superlocalmemory.learning.reward_proxy import settle_stale_plays
|
|
75
|
-
|
|
76
|
-
while True:
|
|
77
|
-
try:
|
|
78
|
-
await asyncio.sleep(interval_sec)
|
|
79
|
-
# Reported outcomes FIRST. The proxy defaults a play once its
|
|
80
|
-
# window closes; if it ran first it would claim every play and a
|
|
81
|
-
# real outcome arriving later would find nothing to settle.
|
|
82
|
-
real = await asyncio.to_thread(
|
|
83
|
-
settle_from_outcomes,
|
|
84
|
-
profile_id, learning_db, memory_db,
|
|
85
|
-
)
|
|
86
|
-
# The settler is synchronous + fast; run in a thread to avoid
|
|
87
|
-
# blocking the event loop on unusual DB lock stalls.
|
|
88
|
-
n = await asyncio.to_thread(
|
|
89
|
-
settle_stale_plays,
|
|
90
|
-
profile_id, learning_db, memory_db,
|
|
91
|
-
)
|
|
92
|
-
# INFO, not DEBUG, when a real outcome moved an arm: this is the
|
|
93
|
-
# only line that distinguishes a learning loop that is running
|
|
94
|
-
# from one that merely starts. Its absence for a month is what
|
|
95
|
-
# made this defect invisible.
|
|
96
|
-
if real:
|
|
97
|
-
logger.info("bandit settled %d play(s) from outcomes", real)
|
|
98
|
-
if n:
|
|
99
|
-
logger.debug("bandit.reward_proxy settled=%d (default)", n)
|
|
100
|
-
except asyncio.CancelledError: # pragma: no cover — lifecycle
|
|
101
|
-
raise
|
|
102
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
103
|
-
logger.warning("bandit.reward_proxy loop: %s", exc)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
async def _retention_loop(
|
|
107
|
-
learning_db: Path, interval_sec: float, retention_days: int,
|
|
108
|
-
) -> None:
|
|
109
|
-
"""Run retention_sweep on a 24h cadence. Never raises."""
|
|
110
|
-
from superlocalmemory.learning.bandit import retention_sweep
|
|
111
|
-
|
|
112
|
-
while True:
|
|
113
|
-
try:
|
|
114
|
-
await asyncio.sleep(interval_sec)
|
|
115
|
-
deleted = await asyncio.to_thread(
|
|
116
|
-
retention_sweep, learning_db, retention_days,
|
|
117
|
-
)
|
|
118
|
-
logger.info(
|
|
119
|
-
"bandit_plays_retention_sweep tick: deleted=%d", deleted,
|
|
120
|
-
)
|
|
121
|
-
except asyncio.CancelledError: # pragma: no cover — lifecycle
|
|
122
|
-
raise
|
|
123
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
124
|
-
logger.warning("bandit.retention loop: %s", exc)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def schedule_bandit_loops(application: Any, config: Any) -> None:
|
|
128
|
-
"""Register both background tasks with the FastAPI app state.
|
|
129
|
-
|
|
130
|
-
Tasks are stored on ``application.state.bandit_tasks`` so the daemon's
|
|
131
|
-
shutdown path can cancel them cleanly (if added).
|
|
132
|
-
"""
|
|
133
|
-
learning = _learning_db(config)
|
|
134
|
-
memory = _memory_db(config)
|
|
135
|
-
profile = _profile_id(config)
|
|
136
|
-
|
|
137
|
-
try:
|
|
138
|
-
loop = asyncio.get_event_loop()
|
|
139
|
-
except RuntimeError: # pragma: no cover — defensive
|
|
140
|
-
return
|
|
141
|
-
|
|
142
|
-
tasks = []
|
|
143
|
-
tasks.append(loop.create_task(
|
|
144
|
-
_reward_proxy_loop(learning, memory, profile, _REWARD_INTERVAL),
|
|
145
|
-
))
|
|
146
|
-
tasks.append(loop.create_task(
|
|
147
|
-
_retention_loop(learning, _RETENTION_INTERVAL, _RETENTION_DAYS),
|
|
148
|
-
))
|
|
149
|
-
if hasattr(application, "state"):
|
|
150
|
-
application.state.bandit_tasks = tasks
|
|
151
|
-
logger.info(
|
|
152
|
-
"bandit loops scheduled: reward=%.0fs, retention=%.0fs, "
|
|
153
|
-
"retention_days=%d",
|
|
154
|
-
_REWARD_INTERVAL, _RETENTION_INTERVAL, _RETENTION_DAYS,
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
__all__ = ("schedule_bandit_loops",)
|