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,197 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Optimize API routes — single canonical route file (INTERFACE-CONTRACT v2 §5 R2-01).
|
|
6
|
-
|
|
7
|
-
All optimize endpoints live here.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import logging
|
|
13
|
-
from typing import Any, Literal
|
|
14
|
-
|
|
15
|
-
from fastapi import APIRouter, HTTPException
|
|
16
|
-
from pydantic import BaseModel
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger("superlocalmemory.server.routes.optimize")
|
|
19
|
-
|
|
20
|
-
router = APIRouter(prefix="/api/optimize", tags=["optimize"])
|
|
21
|
-
|
|
22
|
-
# F-03 fix: module-level singleton — constructed once, shared by /savings + CLI
|
|
23
|
-
from superlocalmemory.optimize.metrics.estimator import SavingsEstimator as _SavingsEstimator # noqa: E402
|
|
24
|
-
_savings_estimator = _SavingsEstimator()
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class ConfigUpdateRequest(BaseModel):
|
|
28
|
-
"""Partial config update — only provided fields are changed."""
|
|
29
|
-
enabled: bool | None = None
|
|
30
|
-
proxy_enabled: bool | None = None
|
|
31
|
-
cache_enabled: bool | None = None
|
|
32
|
-
semantic_enabled: bool | None = None
|
|
33
|
-
compress_enabled: bool | None = None
|
|
34
|
-
compress_mode: Literal['safe', 'aggressive'] | None = None
|
|
35
|
-
compress_prose: bool | None = None
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@router.get("/config")
|
|
39
|
-
async def get_config() -> dict[str, Any]:
|
|
40
|
-
"""Return current optimize config as JSON."""
|
|
41
|
-
try:
|
|
42
|
-
from superlocalmemory.optimize.config import get_shared_store
|
|
43
|
-
cfg = get_shared_store().get()
|
|
44
|
-
return cfg.as_dict()
|
|
45
|
-
except Exception as exc:
|
|
46
|
-
logger.warning("GET /api/optimize/config failed: %s", exc)
|
|
47
|
-
raise HTTPException(status_code=500, detail=str(exc))
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
@router.put("/config")
|
|
51
|
-
async def put_config(body: ConfigUpdateRequest) -> dict[str, Any]:
|
|
52
|
-
"""Update optimize config (partial). Daemon hot-reloads within 2s."""
|
|
53
|
-
try:
|
|
54
|
-
import dataclasses
|
|
55
|
-
from superlocalmemory.optimize.config import get_shared_store
|
|
56
|
-
store = get_shared_store()
|
|
57
|
-
cfg = store.get()
|
|
58
|
-
updates: dict[str, Any] = {}
|
|
59
|
-
for field_name in ConfigUpdateRequest.model_fields:
|
|
60
|
-
val = getattr(body, field_name, None)
|
|
61
|
-
if val is not None:
|
|
62
|
-
updates[field_name] = val
|
|
63
|
-
if updates:
|
|
64
|
-
cfg = dataclasses.replace(cfg, **updates)
|
|
65
|
-
store.save(cfg)
|
|
66
|
-
return {"status": "ok", "updated": list(updates.keys())}
|
|
67
|
-
except ValueError as exc:
|
|
68
|
-
raise HTTPException(status_code=400, detail=str(exc))
|
|
69
|
-
except Exception as exc:
|
|
70
|
-
logger.warning("PUT /api/optimize/config failed: %s", exc)
|
|
71
|
-
raise HTTPException(status_code=500, detail=str(exc))
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
@router.get("/status")
|
|
75
|
-
async def get_status() -> dict[str, Any]:
|
|
76
|
-
"""Concise enabled/disabled summary of each optimize sub-feature (M3).
|
|
77
|
-
|
|
78
|
-
REST-convention companion to `slm optimize status` (which reads config
|
|
79
|
-
locally). Returns a per-feature on/off view, the compression mode, and a
|
|
80
|
-
top-level `healthy` flag so external pollers have a stable endpoint.
|
|
81
|
-
"""
|
|
82
|
-
try:
|
|
83
|
-
from superlocalmemory.optimize.config import get_shared_store
|
|
84
|
-
cfg = get_shared_store().get()
|
|
85
|
-
return {
|
|
86
|
-
"healthy": True,
|
|
87
|
-
"enabled": cfg.enabled,
|
|
88
|
-
"features": {
|
|
89
|
-
"proxy": cfg.proxy_enabled,
|
|
90
|
-
"cache": cfg.cache_enabled,
|
|
91
|
-
"compression": cfg.compress_enabled,
|
|
92
|
-
"semantic_cache": cfg.semantic_enabled,
|
|
93
|
-
},
|
|
94
|
-
"compress_mode": cfg.compress_mode,
|
|
95
|
-
"config_version": cfg.config_version,
|
|
96
|
-
}
|
|
97
|
-
except Exception as exc:
|
|
98
|
-
logger.warning("GET /api/optimize/status failed: %s", exc)
|
|
99
|
-
# Fail-open: report unhealthy rather than 500 so a poller can
|
|
100
|
-
# distinguish "daemon up but optimize degraded" from "daemon down".
|
|
101
|
-
return {"healthy": False, "error": "internal error"}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@router.get("/savings")
|
|
105
|
-
async def get_savings() -> dict[str, Any]:
|
|
106
|
-
"""Return savings estimates from live metrics + CacheDB.
|
|
107
|
-
|
|
108
|
-
Field names match INTERFACE-CONTRACT §5 exactly.
|
|
109
|
-
"""
|
|
110
|
-
try:
|
|
111
|
-
from superlocalmemory.optimize.config import get_shared_store
|
|
112
|
-
from superlocalmemory.optimize.metrics.counters import get_metrics
|
|
113
|
-
from superlocalmemory.optimize.storage.db import CacheDB
|
|
114
|
-
|
|
115
|
-
cfg = get_shared_store().get()
|
|
116
|
-
collector = get_metrics()
|
|
117
|
-
db = CacheDB()
|
|
118
|
-
snap = collector.snapshot(
|
|
119
|
-
cache_size_bytes=db.db_size_bytes(),
|
|
120
|
-
cache_entry_count=db.entry_count(),
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
# F-03 fix: use module-level singleton instead of per-request instantiation
|
|
124
|
-
# DASH-V6 fix: attribute may EXIST but be None; getattr default only
|
|
125
|
-
# covers the missing case, so coerce None -> default to avoid .lower() crash.
|
|
126
|
-
active_model = getattr(cfg, "active_model", None) or "anthropic"
|
|
127
|
-
# Determine provider from model
|
|
128
|
-
provider = "anthropic"
|
|
129
|
-
for key in ("anthropic", "openai", "gemini"):
|
|
130
|
-
if key in active_model.lower():
|
|
131
|
-
provider = key
|
|
132
|
-
break
|
|
133
|
-
est = _savings_estimator.estimate(snap, provider=provider)
|
|
134
|
-
|
|
135
|
-
# compress_ratio from snap (byte-based, survives restart)
|
|
136
|
-
if snap.compress_bytes_original > 0:
|
|
137
|
-
compress_ratio = snap.compress_bytes_after / snap.compress_bytes_original
|
|
138
|
-
else:
|
|
139
|
-
compress_ratio = None
|
|
140
|
-
|
|
141
|
-
total = snap.hits + snap.misses
|
|
142
|
-
hit_rate = snap.hits / total if total > 0 else 0.0
|
|
143
|
-
|
|
144
|
-
# F-02 fix: response keys match INTERFACE-CONTRACT §5 exactly
|
|
145
|
-
return {
|
|
146
|
-
"tokens_saved_input": snap.tokens_saved_input,
|
|
147
|
-
"tokens_saved_output": snap.tokens_saved_output,
|
|
148
|
-
"calls_skipped": snap.calls_skipped,
|
|
149
|
-
"compress_ratio": round(compress_ratio, 4) if compress_ratio is not None else None,
|
|
150
|
-
"cost_saved": {"usd": est["usd"], "inr": est["inr"]},
|
|
151
|
-
"hit_rate": round(hit_rate, 4),
|
|
152
|
-
"cache_bytes": snap.cache_size_bytes,
|
|
153
|
-
"entries": snap.cache_entry_count,
|
|
154
|
-
# diagnostic fields — non-conflicting extras
|
|
155
|
-
"hits": snap.hits,
|
|
156
|
-
"misses": snap.misses,
|
|
157
|
-
"tokens_saved_compress": snap.tokens_saved_compress,
|
|
158
|
-
"is_stale": est["is_stale"],
|
|
159
|
-
"pricing_date": est["pricing_date"],
|
|
160
|
-
}
|
|
161
|
-
except Exception as exc:
|
|
162
|
-
logger.warning("GET /api/optimize/savings failed: %s", exc)
|
|
163
|
-
raise HTTPException(status_code=500, detail=str(exc))
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
@router.get("/stats")
|
|
167
|
-
async def get_stats() -> dict[str, Any]:
|
|
168
|
-
"""Return raw metrics snapshot as JSON."""
|
|
169
|
-
try:
|
|
170
|
-
from superlocalmemory.optimize.metrics.counters import get_metrics
|
|
171
|
-
from superlocalmemory.optimize.storage.db import CacheDB
|
|
172
|
-
|
|
173
|
-
collector = get_metrics()
|
|
174
|
-
db = CacheDB()
|
|
175
|
-
snap = collector.snapshot(
|
|
176
|
-
cache_size_bytes=db.db_size_bytes(),
|
|
177
|
-
cache_entry_count=db.entry_count(),
|
|
178
|
-
)
|
|
179
|
-
# Return all 16 fields as dict
|
|
180
|
-
import dataclasses
|
|
181
|
-
return dataclasses.asdict(snap)
|
|
182
|
-
except Exception as exc:
|
|
183
|
-
logger.warning("GET /api/optimize/stats failed: %s", exc)
|
|
184
|
-
raise HTTPException(status_code=500, detail=str(exc))
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
@router.delete("/cache/clear")
|
|
188
|
-
async def delete_cache_clear(tenant: str = "default") -> dict[str, Any]:
|
|
189
|
-
"""Delete all cache entries for a tenant."""
|
|
190
|
-
try:
|
|
191
|
-
from superlocalmemory.optimize.storage.db import CacheDB
|
|
192
|
-
db = CacheDB()
|
|
193
|
-
deleted = db.clear_tenant(tenant)
|
|
194
|
-
return {"success": True, "deleted": deleted}
|
|
195
|
-
except Exception as exc:
|
|
196
|
-
logger.warning("DELETE /api/optimize/cache/clear failed: %s", exc)
|
|
197
|
-
raise HTTPException(status_code=500, detail=str(exc))
|
|
@@ -1,173 +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-01 §4.4 / §4.5
|
|
4
|
-
|
|
5
|
-
"""POST /internal/prewarm — populates the context cache for a session.
|
|
6
|
-
|
|
7
|
-
Bug fix: ``hooks/prewarm_auth.authorize`` (which gates loopback →
|
|
8
|
-
origin → install-token → body-size) was implemented and unit-tested,
|
|
9
|
-
but no FastAPI route mounted it. The hot-path ``post_tool_async_hook``
|
|
10
|
-
POSTs to ``/internal/prewarm`` after every tool call to refresh the
|
|
11
|
-
``active_brain_cache`` row for the current session/topic. Without a
|
|
12
|
-
route registered here, those POSTs 404'd silently, the cache never
|
|
13
|
-
populated, and every ``UserPromptSubmit`` ended up a structural miss.
|
|
14
|
-
|
|
15
|
-
Design notes
|
|
16
|
-
------------
|
|
17
|
-
* All 4 gates from LLD-01 §4.4 run before any engine work: loopback
|
|
18
|
-
peer, absence of browser ``Origin`` header, valid install-token, body
|
|
19
|
-
<= ``MAX_BODY_BYTES``. On any gate failure we return the decision's
|
|
20
|
-
status code with ``application/json`` error envelope and do not touch
|
|
21
|
-
the engine. This is LLD-07 SEC-HR-03 applied at the edge.
|
|
22
|
-
* The route is async; the actual cache write (``ContextCache.upsert``)
|
|
23
|
-
is synchronous SQLite and runs on the default executor via
|
|
24
|
-
``asyncio.to_thread`` so we never block the event loop.
|
|
25
|
-
* Body schema is intentionally narrow: ``{"session_id": str,
|
|
26
|
-
"prompt": str, "content": str, "fact_ids": list[str]}``. Missing or
|
|
27
|
-
wrong-type fields produce 400.
|
|
28
|
-
* Never raises past this function. Any unexpected exception is caught,
|
|
29
|
-
logged at ``debug`` to avoid log flooding under a hostile peer, and
|
|
30
|
-
returned as 500 JSON. The hot path ``post_tool_async_hook`` treats
|
|
31
|
-
any non-2xx as "fire-and-forget, try again later", so degradation is
|
|
32
|
-
graceful.
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
from __future__ import annotations
|
|
36
|
-
|
|
37
|
-
import asyncio
|
|
38
|
-
import logging
|
|
39
|
-
import time
|
|
40
|
-
|
|
41
|
-
from fastapi import APIRouter, Request
|
|
42
|
-
from fastapi.responses import JSONResponse
|
|
43
|
-
|
|
44
|
-
logger = logging.getLogger(__name__)
|
|
45
|
-
|
|
46
|
-
router = APIRouter(tags=["internal"])
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
_ALLOWED_BODY_KEYS = frozenset({"session_id", "prompt", "content", "fact_ids"})
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@router.post("/internal/prewarm")
|
|
53
|
-
async def prewarm(request: Request) -> JSONResponse:
|
|
54
|
-
"""Write (or refresh) a context-cache entry for the caller's session.
|
|
55
|
-
|
|
56
|
-
Gates (LLD-01 §4.4):
|
|
57
|
-
1. Loopback-only client (127.0.0.1 / ::1 / localhost).
|
|
58
|
-
2. Reject browser-originated calls (any ``Origin`` header).
|
|
59
|
-
3. Install-token present and constant-time-verified.
|
|
60
|
-
4. Body <= ``MAX_BODY_BYTES``.
|
|
61
|
-
|
|
62
|
-
On success, returns ``{"ok": true}``. On any failure, returns the
|
|
63
|
-
AuthDecision's status with a terse JSON body. Never exposes engine
|
|
64
|
-
error detail to the caller.
|
|
65
|
-
"""
|
|
66
|
-
# Gates 1-3 first (cheap; reject hostile peers before reading body).
|
|
67
|
-
try:
|
|
68
|
-
from superlocalmemory.hooks.prewarm_auth import (
|
|
69
|
-
MAX_BODY_BYTES,
|
|
70
|
-
authorize,
|
|
71
|
-
check_body_size,
|
|
72
|
-
)
|
|
73
|
-
except Exception as exc: # pragma: no cover — primitives always present
|
|
74
|
-
logger.debug("prewarm: auth primitives unimportable: %s", exc)
|
|
75
|
-
return JSONResponse({"error": "server_error"}, status_code=500)
|
|
76
|
-
|
|
77
|
-
client_host = request.client.host if request.client else ""
|
|
78
|
-
headers = {k.lower(): v for k, v in request.headers.items()}
|
|
79
|
-
|
|
80
|
-
decision = authorize(client_host=client_host, headers=headers)
|
|
81
|
-
if not decision.allowed:
|
|
82
|
-
return JSONResponse(
|
|
83
|
-
{"error": decision.reason}, status_code=decision.status,
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
# Gate 4 — read body with a hard size cap. FastAPI/Starlette has no
|
|
87
|
-
# cheap way to check the Content-Length up front in all servers, so
|
|
88
|
-
# we read at most MAX_BODY_BYTES+1 and reject if we got more.
|
|
89
|
-
try:
|
|
90
|
-
body_bytes = await request.body()
|
|
91
|
-
except Exception as exc: # pragma: no cover
|
|
92
|
-
logger.debug("prewarm: body read failed: %s", exc)
|
|
93
|
-
return JSONResponse({"error": "bad_body"}, status_code=400)
|
|
94
|
-
ok, reason = check_body_size(body_bytes)
|
|
95
|
-
if not ok:
|
|
96
|
-
return JSONResponse({"error": reason}, status_code=413)
|
|
97
|
-
|
|
98
|
-
try:
|
|
99
|
-
import json as _json
|
|
100
|
-
payload = _json.loads(body_bytes or b"{}")
|
|
101
|
-
except Exception:
|
|
102
|
-
return JSONResponse({"error": "invalid_json"}, status_code=400)
|
|
103
|
-
|
|
104
|
-
if not isinstance(payload, dict):
|
|
105
|
-
return JSONResponse({"error": "invalid_json"}, status_code=400)
|
|
106
|
-
|
|
107
|
-
# Narrow contract: reject unknown keys to keep the surface small.
|
|
108
|
-
# S10-SEC-N-02: fixed error tag, never echo attacker-supplied keys.
|
|
109
|
-
unknown = set(payload.keys()) - _ALLOWED_BODY_KEYS
|
|
110
|
-
if unknown:
|
|
111
|
-
return JSONResponse(
|
|
112
|
-
{"error": "unknown_keys"}, status_code=400,
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
session_id = payload.get("session_id")
|
|
116
|
-
prompt = payload.get("prompt")
|
|
117
|
-
content = payload.get("content")
|
|
118
|
-
fact_ids = payload.get("fact_ids") or []
|
|
119
|
-
if not isinstance(session_id, str) or not session_id:
|
|
120
|
-
return JSONResponse({"error": "session_id_required"}, status_code=400)
|
|
121
|
-
if not isinstance(prompt, str) or not prompt:
|
|
122
|
-
return JSONResponse({"error": "prompt_required"}, status_code=400)
|
|
123
|
-
if not isinstance(content, str) or not content:
|
|
124
|
-
return JSONResponse({"error": "content_required"}, status_code=400)
|
|
125
|
-
if not isinstance(fact_ids, list) or not all(
|
|
126
|
-
isinstance(f, str) for f in fact_ids
|
|
127
|
-
):
|
|
128
|
-
return JSONResponse({"error": "fact_ids_list"}, status_code=400)
|
|
129
|
-
|
|
130
|
-
try:
|
|
131
|
-
topic_sig = await asyncio.to_thread(_compute_topic_sig, prompt)
|
|
132
|
-
await asyncio.to_thread(
|
|
133
|
-
_upsert_cache,
|
|
134
|
-
session_id=session_id,
|
|
135
|
-
topic_sig=topic_sig,
|
|
136
|
-
content=content,
|
|
137
|
-
fact_ids=fact_ids,
|
|
138
|
-
)
|
|
139
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
140
|
-
logger.debug("prewarm: upsert failed: %s", exc)
|
|
141
|
-
return JSONResponse({"error": "upsert_failed"}, status_code=500)
|
|
142
|
-
|
|
143
|
-
return JSONResponse({"ok": True})
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def _compute_topic_sig(prompt: str) -> str:
|
|
147
|
-
"""Lazy import so module import is free of hot-path SLM modules."""
|
|
148
|
-
from superlocalmemory.core.topic_signature import compute_topic_signature
|
|
149
|
-
return compute_topic_signature(prompt)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
def _upsert_cache(
|
|
153
|
-
*, session_id: str, topic_sig: str,
|
|
154
|
-
content: str, fact_ids: list[str],
|
|
155
|
-
) -> None:
|
|
156
|
-
from superlocalmemory.core.context_cache import CacheEntry, ContextCache
|
|
157
|
-
from superlocalmemory.server.routes.helpers import get_active_profile
|
|
158
|
-
cache = ContextCache()
|
|
159
|
-
try:
|
|
160
|
-
cache.upsert(CacheEntry(
|
|
161
|
-
session_id=session_id,
|
|
162
|
-
topic_sig=topic_sig,
|
|
163
|
-
content=content,
|
|
164
|
-
fact_ids=tuple(fact_ids),
|
|
165
|
-
provenance="prewarm_post_tool",
|
|
166
|
-
computed_at=int(time.time()),
|
|
167
|
-
profile_id=get_active_profile(), # so non-default profiles hit
|
|
168
|
-
))
|
|
169
|
-
finally:
|
|
170
|
-
cache.close()
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
__all__ = ("router",)
|
|
@@ -1,292 +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 - Profile Routes
|
|
5
|
-
- AGPL-3.0-or-later
|
|
6
|
-
|
|
7
|
-
Routes: /api/profiles, /api/profiles/{name}/switch,
|
|
8
|
-
/api/profiles/create, DELETE /api/profiles/{name}
|
|
9
|
-
|
|
10
|
-
SQLite is the single source of truth for profiles. profiles.json
|
|
11
|
-
is kept in sync as a cache for backward compatibility.
|
|
12
|
-
"""
|
|
13
|
-
import asyncio
|
|
14
|
-
import logging
|
|
15
|
-
from datetime import datetime, timezone
|
|
16
|
-
|
|
17
|
-
from fastapi import APIRouter, HTTPException, Request
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.server.route_mutations import authorize_route_mutation
|
|
20
|
-
|
|
21
|
-
from .helpers import (
|
|
22
|
-
get_db_connection, validate_profile_name,
|
|
23
|
-
ProfileSwitch, DB_PATH,
|
|
24
|
-
sync_profiles, ensure_profile_in_db, ensure_profile_in_json,
|
|
25
|
-
delete_profile_from_db,
|
|
26
|
-
_load_profiles_json, _save_profiles_json,
|
|
27
|
-
)
|
|
28
|
-
from superlocalmemory.storage.memory_write import memory_write
|
|
29
|
-
from superlocalmemory.server.profile_runtime import (
|
|
30
|
-
commit_daemon_profile_switch,
|
|
31
|
-
get_profile_runtime,
|
|
32
|
-
TransitionDrainTimeout,
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
logger = logging.getLogger("superlocalmemory.routes.profiles")
|
|
36
|
-
router = APIRouter()
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def _internal_error(detail: str = "Internal server error") -> HTTPException:
|
|
40
|
-
"""SEC-H-02: log full traceback server-side; return a generic message to the client."""
|
|
41
|
-
logger.exception("profiles route error")
|
|
42
|
-
return HTTPException(status_code=500, detail=detail)
|
|
43
|
-
|
|
44
|
-
# WebSocket manager reference (set by ui_server.py at startup)
|
|
45
|
-
ws_manager = None
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def _get_memory_count(profile: str) -> int:
|
|
49
|
-
"""Get memory count for a profile."""
|
|
50
|
-
try:
|
|
51
|
-
conn = get_db_connection()
|
|
52
|
-
cursor = conn.cursor()
|
|
53
|
-
try:
|
|
54
|
-
cursor.execute(
|
|
55
|
-
"SELECT COUNT(*) FROM atomic_facts WHERE profile_id = ?", (profile,),
|
|
56
|
-
)
|
|
57
|
-
count = cursor.fetchone()[0]
|
|
58
|
-
except Exception:
|
|
59
|
-
cursor.execute(
|
|
60
|
-
"SELECT COUNT(*) FROM memories WHERE profile = ?", (profile,),
|
|
61
|
-
)
|
|
62
|
-
count = cursor.fetchone()[0]
|
|
63
|
-
conn.close()
|
|
64
|
-
return count
|
|
65
|
-
except Exception:
|
|
66
|
-
return 0
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
@router.get("/api/profiles")
|
|
70
|
-
async def list_profiles(request: Request):
|
|
71
|
-
"""List available memory profiles (synced from SQLite + profiles.json)."""
|
|
72
|
-
try:
|
|
73
|
-
merged = sync_profiles()
|
|
74
|
-
active = get_profile_runtime(request.app.state).snapshot.profile_id
|
|
75
|
-
|
|
76
|
-
profiles = []
|
|
77
|
-
for p in merged:
|
|
78
|
-
# profile_id is the canonical key (PK, FK target, used by engine)
|
|
79
|
-
pid = p.get('profile_id', p.get('name', ''))
|
|
80
|
-
count = _get_memory_count(pid)
|
|
81
|
-
profiles.append({
|
|
82
|
-
"name": pid,
|
|
83
|
-
"description": p.get('description', ''),
|
|
84
|
-
"memory_count": count,
|
|
85
|
-
"created_at": p.get('created_at', ''),
|
|
86
|
-
"last_used": p.get('last_used', ''),
|
|
87
|
-
"is_active": pid == active,
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
"profiles": profiles,
|
|
92
|
-
"active_profile": active,
|
|
93
|
-
"total_profiles": len(profiles),
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
except Exception:
|
|
97
|
-
raise _internal_error("Profile list error")
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
@router.post("/api/profiles/{name}/switch")
|
|
101
|
-
async def switch_profile(name: str, request: Request):
|
|
102
|
-
"""Switch active memory profile (persists to both config stores)."""
|
|
103
|
-
try:
|
|
104
|
-
if not validate_profile_name(name):
|
|
105
|
-
raise HTTPException(status_code=400, detail="Invalid profile name.")
|
|
106
|
-
|
|
107
|
-
merged = sync_profiles()
|
|
108
|
-
merged_ids = {p.get('profile_id', p.get('name', '')) for p in merged}
|
|
109
|
-
|
|
110
|
-
if name not in merged_ids:
|
|
111
|
-
available = ', '.join(sorted(merged_ids))
|
|
112
|
-
raise HTTPException(
|
|
113
|
-
status_code=404,
|
|
114
|
-
detail=f"Profile '{name}' not found. Available: {available}",
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
authorization = authorize_route_mutation(
|
|
118
|
-
request,
|
|
119
|
-
operation="update",
|
|
120
|
-
source_agent_id="http-profile-switch",
|
|
121
|
-
profile_id=name,
|
|
122
|
-
)
|
|
123
|
-
# RBAC (C4): a logged-in user may only activate a workspace they belong
|
|
124
|
-
# to — this is the read boundary. Switching sets the active tenant for
|
|
125
|
-
# subsequent reads, so a non-member must not be able to enter it. The
|
|
126
|
-
# machine owner (no user session) switches freely.
|
|
127
|
-
from superlocalmemory.server.rbac_enforce import resolve_principal
|
|
128
|
-
_principal = resolve_principal(request)
|
|
129
|
-
if _principal.get("kind") == "user":
|
|
130
|
-
_rbac = getattr(request.app.state, "rbac", None)
|
|
131
|
-
if _rbac is not None and _rbac.get_role(_principal["user_id"], name) is None:
|
|
132
|
-
raise HTTPException(
|
|
133
|
-
status_code=403,
|
|
134
|
-
detail="You are not a member of this workspace.",
|
|
135
|
-
)
|
|
136
|
-
runtime = get_profile_runtime(request.app.state)
|
|
137
|
-
previous = runtime.snapshot.profile_id
|
|
138
|
-
try:
|
|
139
|
-
snapshot = await asyncio.to_thread(
|
|
140
|
-
runtime.transition,
|
|
141
|
-
name,
|
|
142
|
-
lambda prior, target: commit_daemon_profile_switch(
|
|
143
|
-
request.app.state,
|
|
144
|
-
prior,
|
|
145
|
-
target,
|
|
146
|
-
),
|
|
147
|
-
)
|
|
148
|
-
except TransitionDrainTimeout as exc:
|
|
149
|
-
raise HTTPException(
|
|
150
|
-
status_code=503,
|
|
151
|
-
detail=str(exc),
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
count = _get_memory_count(name)
|
|
155
|
-
|
|
156
|
-
if ws_manager:
|
|
157
|
-
await ws_manager.broadcast({
|
|
158
|
-
"type": "profile_switched", "profile": name,
|
|
159
|
-
"previous": previous, "memory_count": count,
|
|
160
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
authorization.complete()
|
|
164
|
-
return {
|
|
165
|
-
"success": True, "active_profile": name,
|
|
166
|
-
"previous_profile": previous, "memory_count": count,
|
|
167
|
-
"generation": snapshot.generation,
|
|
168
|
-
"message": f"Switched to profile '{name}' ({count} memories).",
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
except HTTPException:
|
|
172
|
-
raise
|
|
173
|
-
except Exception:
|
|
174
|
-
raise _internal_error("Profile switch error")
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
@router.post("/api/profiles/create")
|
|
178
|
-
async def create_profile(body: ProfileSwitch, request: Request):
|
|
179
|
-
"""Create a new memory profile (writes to BOTH SQLite and profiles.json)."""
|
|
180
|
-
try:
|
|
181
|
-
name = body.profile_name
|
|
182
|
-
if not validate_profile_name(name):
|
|
183
|
-
raise HTTPException(status_code=400, detail="Invalid profile name")
|
|
184
|
-
|
|
185
|
-
# Check both stores for duplicates
|
|
186
|
-
merged = sync_profiles()
|
|
187
|
-
merged_ids = {p.get('profile_id', p.get('name', '')) for p in merged}
|
|
188
|
-
if name in merged_ids:
|
|
189
|
-
raise HTTPException(status_code=409, detail=f"Profile '{name}' already exists")
|
|
190
|
-
|
|
191
|
-
authorization = authorize_route_mutation(
|
|
192
|
-
request,
|
|
193
|
-
operation="update",
|
|
194
|
-
source_agent_id="http-profile-create",
|
|
195
|
-
)
|
|
196
|
-
# RBAC (C3): creating a tenant is an administrative action.
|
|
197
|
-
from superlocalmemory.access.rbac import Permission as _Perm
|
|
198
|
-
from superlocalmemory.server.rbac_enforce import require_manage as _rbac_manage
|
|
199
|
-
_principal = _rbac_manage(request)
|
|
200
|
-
# Write to BOTH stores atomically
|
|
201
|
-
desc = f'Memory profile: {name}'
|
|
202
|
-
ensure_profile_in_db(name, desc)
|
|
203
|
-
ensure_profile_in_json(name, desc)
|
|
204
|
-
|
|
205
|
-
# A logged-in user who creates a workspace becomes its admin so they
|
|
206
|
-
# can manage it immediately (profile_id == name here). The machine
|
|
207
|
-
# owner needs no membership row (implicit root).
|
|
208
|
-
if _principal.get("kind") == "user":
|
|
209
|
-
rbac = getattr(request.app.state, "rbac", None)
|
|
210
|
-
if rbac is not None:
|
|
211
|
-
try:
|
|
212
|
-
rbac.set_membership(name, _principal["user_id"], "admin",
|
|
213
|
-
added_by=_principal["username"])
|
|
214
|
-
except Exception:
|
|
215
|
-
pass
|
|
216
|
-
|
|
217
|
-
authorization.complete()
|
|
218
|
-
return {"success": True, "profile": name, "message": f"Profile '{name}' created"}
|
|
219
|
-
|
|
220
|
-
except HTTPException:
|
|
221
|
-
raise
|
|
222
|
-
except Exception:
|
|
223
|
-
raise _internal_error("Profile create error")
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
@router.delete("/api/profiles/{name}")
|
|
227
|
-
async def delete_profile(name: str, request: Request):
|
|
228
|
-
"""Delete a profile. Moves its memories to 'default'."""
|
|
229
|
-
try:
|
|
230
|
-
if name == 'default':
|
|
231
|
-
raise HTTPException(status_code=400, detail="Cannot delete 'default' profile")
|
|
232
|
-
|
|
233
|
-
merged = sync_profiles()
|
|
234
|
-
merged_ids = {p.get('profile_id', p.get('name', '')) for p in merged}
|
|
235
|
-
if name not in merged_ids:
|
|
236
|
-
raise HTTPException(status_code=404, detail=f"Profile '{name}' not found")
|
|
237
|
-
|
|
238
|
-
runtime = get_profile_runtime(request.app.state)
|
|
239
|
-
if runtime.snapshot.profile_id == name:
|
|
240
|
-
raise HTTPException(status_code=400, detail="Cannot delete active profile.")
|
|
241
|
-
|
|
242
|
-
json_config = _load_profiles_json()
|
|
243
|
-
|
|
244
|
-
authorization = authorize_route_mutation(
|
|
245
|
-
request,
|
|
246
|
-
operation="delete",
|
|
247
|
-
source_agent_id="http-profile-delete",
|
|
248
|
-
profile_id=name,
|
|
249
|
-
)
|
|
250
|
-
# RBAC (C3): deleting a tenant is administrative. Check MANAGE on the
|
|
251
|
-
# profile being deleted (not the active one).
|
|
252
|
-
from superlocalmemory.server.rbac_enforce import require_manage as _rbac_manage
|
|
253
|
-
_rbac_manage(request, profile=name)
|
|
254
|
-
# Move data to default before deleting (bypasses CASCADE).
|
|
255
|
-
# memory_write: write lock + busy_timeout — two UPDATEs are atomic.
|
|
256
|
-
moved = 0
|
|
257
|
-
with memory_write(DB_PATH) as conn:
|
|
258
|
-
try:
|
|
259
|
-
cur = conn.execute(
|
|
260
|
-
"UPDATE atomic_facts SET profile_id = 'default' WHERE profile_id = ?",
|
|
261
|
-
(name,),
|
|
262
|
-
)
|
|
263
|
-
moved = cur.rowcount
|
|
264
|
-
except Exception:
|
|
265
|
-
pass
|
|
266
|
-
try:
|
|
267
|
-
cur2 = conn.execute(
|
|
268
|
-
"UPDATE memories SET profile_id = 'default' WHERE profile_id = ?",
|
|
269
|
-
(name,),
|
|
270
|
-
)
|
|
271
|
-
moved += cur2.rowcount
|
|
272
|
-
except Exception:
|
|
273
|
-
pass
|
|
274
|
-
|
|
275
|
-
# Delete from BOTH stores
|
|
276
|
-
delete_profile_from_db(name)
|
|
277
|
-
|
|
278
|
-
profiles = json_config.get('profiles', {})
|
|
279
|
-
profiles.pop(name, None)
|
|
280
|
-
json_config['profiles'] = profiles
|
|
281
|
-
_save_profiles_json(json_config)
|
|
282
|
-
|
|
283
|
-
authorization.complete()
|
|
284
|
-
return {
|
|
285
|
-
"success": True,
|
|
286
|
-
"message": f"Profile '{name}' deleted. {moved} memories moved to 'default'.",
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
except HTTPException:
|
|
290
|
-
raise
|
|
291
|
-
except Exception:
|
|
292
|
-
raise _internal_error("Profile delete error")
|