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,499 +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 - Route Helpers
|
|
5
|
-
- AGPL-3.0-or-later
|
|
6
|
-
|
|
7
|
-
Shared utilities for all route modules: DB connection, dict factory,
|
|
8
|
-
profile helper, validation, Pydantic models, config paths, and the
|
|
9
|
-
shared lazy engine accessor used by every engine-dependent route.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import logging
|
|
14
|
-
import re
|
|
15
|
-
import sqlite3
|
|
16
|
-
import threading
|
|
17
|
-
import time
|
|
18
|
-
from datetime import datetime, timezone
|
|
19
|
-
from pathlib import Path
|
|
20
|
-
from typing import Optional
|
|
21
|
-
|
|
22
|
-
from fastapi import HTTPException, Request
|
|
23
|
-
from pydantic import BaseModel, Field
|
|
24
|
-
|
|
25
|
-
from superlocalmemory.infra.data_root import DynamicStatePath, canonical_data_root
|
|
26
|
-
from superlocalmemory.storage.memory_write import memory_read, memory_write
|
|
27
|
-
|
|
28
|
-
_engine_logger = logging.getLogger("superlocalmemory.engine")
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
# ---------------------------------------------------------------------------
|
|
32
|
-
# Version detection (shared — avoids circular import between ui.py ↔ v3_api.py)
|
|
33
|
-
# ---------------------------------------------------------------------------
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _get_version() -> str:
|
|
37
|
-
"""Read version from package.json / pyproject.toml / importlib.
|
|
38
|
-
|
|
39
|
-
Walks up from this file to find the project root. In the src layout
|
|
40
|
-
(running from source tree), package.json is 5 parents up; for an
|
|
41
|
-
installed package it won't exist, so we fall through to importlib.
|
|
42
|
-
"""
|
|
43
|
-
here = Path(__file__).resolve()
|
|
44
|
-
for depth in (5, 4):
|
|
45
|
-
try:
|
|
46
|
-
import json as _json
|
|
47
|
-
|
|
48
|
-
root = here
|
|
49
|
-
for _ in range(depth):
|
|
50
|
-
root = root.parent
|
|
51
|
-
pkg_json = root / "package.json"
|
|
52
|
-
if pkg_json.exists():
|
|
53
|
-
with open(pkg_json) as f:
|
|
54
|
-
v = _json.load(f).get("version", "")
|
|
55
|
-
if v:
|
|
56
|
-
return v
|
|
57
|
-
toml_path = root / "pyproject.toml"
|
|
58
|
-
if toml_path.exists():
|
|
59
|
-
import tomllib
|
|
60
|
-
|
|
61
|
-
with open(toml_path, "rb") as f:
|
|
62
|
-
return tomllib.load(f)["project"]["version"]
|
|
63
|
-
except Exception:
|
|
64
|
-
continue
|
|
65
|
-
try:
|
|
66
|
-
from importlib.metadata import version
|
|
67
|
-
|
|
68
|
-
return version("superlocalmemory")
|
|
69
|
-
except Exception:
|
|
70
|
-
pass
|
|
71
|
-
return "unknown"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
SLM_VERSION = _get_version()
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def _resolve_slm_home() -> Path:
|
|
78
|
-
"""Resolve the SLM data dir the SAME way the CLI does.
|
|
79
|
-
|
|
80
|
-
The CLI honours ``SLM_DATA_DIR`` → ``SL_MEMORY_PATH`` → ``SLM_HOME``
|
|
81
|
-
→ ``~/.superlocalmemory`` (see ``cli/_lazy_init.py:slm_home``). The
|
|
82
|
-
dashboard previously hardcoded ``Path.home() / ".superlocalmemory"``,
|
|
83
|
-
so when a user pointed the CLI at a custom data dir (or set a
|
|
84
|
-
different ``base_dir`` in ``config.json``), profiles created in the
|
|
85
|
-
dashboard landed in the default dir while ``slm profile list`` read a
|
|
86
|
-
different ``memory.db`` and reported the profile missing.
|
|
87
|
-
|
|
88
|
-
This function mirrors ``slm_home()`` so both surfaces agree. It is
|
|
89
|
-
evaluated lazily (at call time inside the properties below) rather
|
|
90
|
-
than at import, so a process that sets the env var after import —
|
|
91
|
-
e.g. tests, or a launcher that exports it late — still sees the
|
|
92
|
-
right path.
|
|
93
|
-
"""
|
|
94
|
-
return canonical_data_root()
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
# V3 paths (migrated from ~/.claude-memory to ~/.superlocalmemory).
|
|
98
|
-
# Exposed as dynamic module-level path-like objects for backward compatibility
|
|
99
|
-
# with route modules that import them. They never cache an earlier namespace.
|
|
100
|
-
MEMORY_DIR = DynamicStatePath()
|
|
101
|
-
DB_PATH = DynamicStatePath("memory.db")
|
|
102
|
-
UI_DIR = Path(__file__).parent.parent / "ui"
|
|
103
|
-
PROFILES_DIR = DynamicStatePath("profiles")
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# ---------------------------------------------------------------------------
|
|
107
|
-
# Engine lifecycle — lazy, thread-safe, recoverable after mode changes.
|
|
108
|
-
# ---------------------------------------------------------------------------
|
|
109
|
-
|
|
110
|
-
_engine_init_lock = threading.Lock()
|
|
111
|
-
_last_engine_failure: float = 0.0
|
|
112
|
-
_ENGINE_FAILURE_COOLDOWN_S: float = 5.0
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def get_engine_lazy(app_state):
|
|
116
|
-
"""Return ``app_state.engine``, initialising it if None.
|
|
117
|
-
|
|
118
|
-
Why this exists
|
|
119
|
-
---------------
|
|
120
|
-
Mode-change endpoints (``PUT`` / ``POST /api/v3/mode[/set]``) set
|
|
121
|
-
``app.state.engine = None`` so the next request picks up the new config.
|
|
122
|
-
Before this helper, no code path re-created the engine until the daemon
|
|
123
|
-
restarted, breaking every engine-backed route (entity, ingest, tiers,
|
|
124
|
-
recall, remember, list, status).
|
|
125
|
-
|
|
126
|
-
Contract
|
|
127
|
-
--------
|
|
128
|
-
* Returns the cached engine if already initialised.
|
|
129
|
-
* Otherwise acquires a process-wide lock and builds a fresh
|
|
130
|
-
``MemoryEngine`` from the latest ``SLMConfig.load()``.
|
|
131
|
-
* Returns ``None`` if init fails. A brief cooldown prevents hammering
|
|
132
|
-
init when the underlying cause (e.g., corrupt DB) is persistent.
|
|
133
|
-
* Never uses a sticky "already attempted" flag — recovery must be
|
|
134
|
-
automatic after a transient failure.
|
|
135
|
-
"""
|
|
136
|
-
global _last_engine_failure
|
|
137
|
-
|
|
138
|
-
engine = getattr(app_state, "engine", None)
|
|
139
|
-
if engine is not None:
|
|
140
|
-
return engine
|
|
141
|
-
|
|
142
|
-
now = time.monotonic()
|
|
143
|
-
if _last_engine_failure and (now - _last_engine_failure) < _ENGINE_FAILURE_COOLDOWN_S:
|
|
144
|
-
return None
|
|
145
|
-
|
|
146
|
-
with _engine_init_lock:
|
|
147
|
-
# Double-checked: another thread may have initialised while we waited.
|
|
148
|
-
engine = getattr(app_state, "engine", None)
|
|
149
|
-
if engine is not None:
|
|
150
|
-
return engine
|
|
151
|
-
try:
|
|
152
|
-
from superlocalmemory.core.config import SLMConfig
|
|
153
|
-
from superlocalmemory.core.engine import MemoryEngine
|
|
154
|
-
|
|
155
|
-
config = SLMConfig.load()
|
|
156
|
-
new_engine = MemoryEngine(config)
|
|
157
|
-
new_engine.initialize()
|
|
158
|
-
app_state.engine = new_engine
|
|
159
|
-
app_state.config = config
|
|
160
|
-
_engine_logger.info(
|
|
161
|
-
"Engine lazy-initialised (mode=%s, profile=%s)",
|
|
162
|
-
getattr(getattr(config, "mode", None), "value", "?"),
|
|
163
|
-
getattr(config, "active_profile", "?"),
|
|
164
|
-
)
|
|
165
|
-
_last_engine_failure = 0.0
|
|
166
|
-
return new_engine
|
|
167
|
-
except Exception as exc:
|
|
168
|
-
_engine_logger.warning("Engine lazy init failed: %s", exc)
|
|
169
|
-
_last_engine_failure = time.monotonic()
|
|
170
|
-
return None
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def require_engine(request: Request):
|
|
174
|
-
"""Return the engine or raise ``HTTPException(503)``.
|
|
175
|
-
|
|
176
|
-
Use this in every route that touches ``app.state.engine``. Replaces the
|
|
177
|
-
old ``engine = request.app.state.engine; if engine is None: raise ...``
|
|
178
|
-
pattern with a single call that also lazily re-initialises after a mode
|
|
179
|
-
change.
|
|
180
|
-
"""
|
|
181
|
-
engine = get_engine_lazy(request.app.state)
|
|
182
|
-
if engine is None:
|
|
183
|
-
raise HTTPException(
|
|
184
|
-
status_code=503,
|
|
185
|
-
detail="Engine not initialized. Retry in a few seconds — it's warming up.",
|
|
186
|
-
)
|
|
187
|
-
return engine
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
def log_mode_change(
|
|
191
|
-
old_mode: str,
|
|
192
|
-
new_mode: str,
|
|
193
|
-
*,
|
|
194
|
-
provider: str = "",
|
|
195
|
-
model: str = "",
|
|
196
|
-
source: str = "api",
|
|
197
|
-
) -> None:
|
|
198
|
-
"""Append an audit entry for every mode change.
|
|
199
|
-
|
|
200
|
-
Lets us trace phantom writes (e.g., a stray dashboard-card button click
|
|
201
|
-
silently flipping the system to Mode C with ``anthropic/claude-sonnet-4``
|
|
202
|
-
as the auto-defaulted model).
|
|
203
|
-
|
|
204
|
-
Audit file: ``<base_dir>/logs/mode-audit.log`` (tab-separated).
|
|
205
|
-
"""
|
|
206
|
-
audit_path = MEMORY_DIR / "logs" / "mode-audit.log"
|
|
207
|
-
try:
|
|
208
|
-
audit_path.parent.mkdir(parents=True, exist_ok=True)
|
|
209
|
-
ts = datetime.now(timezone.utc).isoformat(timespec="seconds")
|
|
210
|
-
line = (
|
|
211
|
-
f"{ts}\told={old_mode}\tnew={new_mode}"
|
|
212
|
-
f"\tprovider={provider}\tmodel={model}\tsource={source}\n"
|
|
213
|
-
)
|
|
214
|
-
with open(audit_path, "a", encoding="utf-8") as handle:
|
|
215
|
-
handle.write(line)
|
|
216
|
-
except Exception as exc: # Logging must never break the mode-change path.
|
|
217
|
-
_engine_logger.warning("mode audit write failed: %s", exc)
|
|
218
|
-
|
|
219
|
-
_engine_logger.info(
|
|
220
|
-
"Mode change: %s→%s provider=%s model=%s (%s)",
|
|
221
|
-
old_mode,
|
|
222
|
-
new_mode,
|
|
223
|
-
provider,
|
|
224
|
-
model,
|
|
225
|
-
source,
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
class _RouteReadConnection:
|
|
230
|
-
"""Compatibility wrapper for legacy route callers that close manually.
|
|
231
|
-
|
|
232
|
-
New routes should prefer ``with memory_read(path)``. A few shared route
|
|
233
|
-
callers still expect ``get_db_connection()`` to return a connection they
|
|
234
|
-
can close themselves, so this wrapper preserves that contract without
|
|
235
|
-
reopening canonical ``memory.db`` in writable mode.
|
|
236
|
-
"""
|
|
237
|
-
|
|
238
|
-
def __init__(self, db_path: Path) -> None:
|
|
239
|
-
object.__setattr__(self, "_snapshot", memory_read(db_path))
|
|
240
|
-
object.__setattr__(self, "_connection", self._snapshot.__enter__())
|
|
241
|
-
object.__setattr__(self, "_closed", False)
|
|
242
|
-
|
|
243
|
-
def __getattr__(self, name: str):
|
|
244
|
-
return getattr(self._connection, name)
|
|
245
|
-
|
|
246
|
-
def __setattr__(self, name: str, value) -> None:
|
|
247
|
-
if name.startswith("_"):
|
|
248
|
-
object.__setattr__(self, name, value)
|
|
249
|
-
else:
|
|
250
|
-
setattr(self._connection, name, value)
|
|
251
|
-
|
|
252
|
-
def close(self) -> None:
|
|
253
|
-
if not self._closed:
|
|
254
|
-
self._snapshot.__exit__(None, None, None)
|
|
255
|
-
object.__setattr__(self, "_closed", True)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
def get_read_connection(db_path: Path = DB_PATH) -> _RouteReadConnection:
|
|
259
|
-
"""Return a legacy-compatible, physically read-only canonical connection."""
|
|
260
|
-
if not db_path.exists():
|
|
261
|
-
raise HTTPException(
|
|
262
|
-
status_code=500,
|
|
263
|
-
detail="Memory database not found. Run 'slm init' to initialize.",
|
|
264
|
-
)
|
|
265
|
-
return _RouteReadConnection(db_path)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def get_db_connection() -> _RouteReadConnection:
|
|
269
|
-
"""Return the shared dashboard read connection for canonical ``memory.db``."""
|
|
270
|
-
return get_read_connection(DB_PATH)
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
def dict_factory(cursor: sqlite3.Cursor, row: tuple) -> dict:
|
|
274
|
-
"""Convert SQLite row to dictionary."""
|
|
275
|
-
fields = [column[0] for column in cursor.description]
|
|
276
|
-
return dict(zip(fields, row))
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
def get_active_profile() -> str:
|
|
280
|
-
"""Read request runtime truth, falling back to the compatibility cache."""
|
|
281
|
-
from superlocalmemory.server.profile_runtime import current_request_profile
|
|
282
|
-
|
|
283
|
-
runtime_profile = current_request_profile()
|
|
284
|
-
if runtime_profile:
|
|
285
|
-
return runtime_profile
|
|
286
|
-
config_file = MEMORY_DIR / "profiles.json"
|
|
287
|
-
if config_file.exists():
|
|
288
|
-
try:
|
|
289
|
-
with open(config_file, "r") as f:
|
|
290
|
-
pconfig = json.load(f)
|
|
291
|
-
return pconfig.get("active_profile", "default")
|
|
292
|
-
except (json.JSONDecodeError, IOError):
|
|
293
|
-
pass
|
|
294
|
-
return "default"
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
def validate_profile_name(name: str) -> bool:
|
|
298
|
-
"""Validate profile name (alphanumeric, underscore, hyphen only)."""
|
|
299
|
-
return bool(re.match(r"^[a-zA-Z0-9_-]+$", name))
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
# ============================================================================
|
|
303
|
-
# Profile Sync — SQLite as single source of truth
|
|
304
|
-
# ============================================================================
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
def ensure_profile_in_db(name: str, description: str = "") -> None:
|
|
308
|
-
"""Ensure a profile row exists in SQLite (idempotent).
|
|
309
|
-
|
|
310
|
-
Hot path: called on every authenticated request. Uses ``memory_write()``
|
|
311
|
-
so in-process writers serialise through the write lock and cross-process
|
|
312
|
-
writers (hooks / CLI) wait via PRAGMA busy_timeout instead of getting
|
|
313
|
-
SQLITE_BUSY.
|
|
314
|
-
"""
|
|
315
|
-
if not DB_PATH.exists():
|
|
316
|
-
return
|
|
317
|
-
with memory_write(DB_PATH) as conn:
|
|
318
|
-
conn.execute("PRAGMA foreign_keys=ON")
|
|
319
|
-
conn.execute(
|
|
320
|
-
"INSERT OR IGNORE INTO profiles (profile_id, name, description) VALUES (?, ?, ?)",
|
|
321
|
-
(name, name, description or f"Memory profile: {name}"),
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
def ensure_profile_in_json(name: str, description: str = "") -> None:
|
|
326
|
-
"""Ensure a profile entry exists in profiles.json (idempotent)."""
|
|
327
|
-
from datetime import datetime
|
|
328
|
-
|
|
329
|
-
config = _load_profiles_json()
|
|
330
|
-
profiles = config.get("profiles", {})
|
|
331
|
-
if name not in profiles:
|
|
332
|
-
profiles[name] = {
|
|
333
|
-
"name": name,
|
|
334
|
-
"description": description or f"Memory profile: {name}",
|
|
335
|
-
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
336
|
-
"last_used": None,
|
|
337
|
-
}
|
|
338
|
-
config["profiles"] = profiles
|
|
339
|
-
_save_profiles_json(config)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def sync_profiles() -> list[dict]:
|
|
343
|
-
"""Reconcile SQLite and profiles.json. Returns merged profile list.
|
|
344
|
-
|
|
345
|
-
SQLite is the source of truth. Uses ``profile_id`` (not ``name``)
|
|
346
|
-
as the canonical key because profile_id is the PK referenced by
|
|
347
|
-
every FK in the database.
|
|
348
|
-
"""
|
|
349
|
-
db_profiles = _get_db_profiles()
|
|
350
|
-
json_config = _load_profiles_json()
|
|
351
|
-
json_profiles = json_config.get("profiles", {})
|
|
352
|
-
|
|
353
|
-
# profile_id is the canonical key (PK in SQLite, FK target everywhere)
|
|
354
|
-
db_ids = {p["profile_id"] for p in db_profiles}
|
|
355
|
-
json_keys = set(json_profiles.keys())
|
|
356
|
-
|
|
357
|
-
changed = False
|
|
358
|
-
|
|
359
|
-
# JSON-only → add to SQLite (fixes Dashboard-created profiles)
|
|
360
|
-
for key in json_keys - db_ids:
|
|
361
|
-
ensure_profile_in_db(key, json_profiles[key].get("description", ""))
|
|
362
|
-
|
|
363
|
-
# SQLite-only → add to profiles.json (fixes CLI-created profiles)
|
|
364
|
-
for pid in db_ids - json_keys:
|
|
365
|
-
db_entry = next(p for p in db_profiles if p["profile_id"] == pid)
|
|
366
|
-
json_profiles[pid] = {
|
|
367
|
-
"name": pid,
|
|
368
|
-
"description": db_entry.get("description", ""),
|
|
369
|
-
"created_at": db_entry.get("created_at", ""),
|
|
370
|
-
"last_used": db_entry.get("last_used"),
|
|
371
|
-
}
|
|
372
|
-
changed = True
|
|
373
|
-
|
|
374
|
-
if changed:
|
|
375
|
-
json_config["profiles"] = json_profiles
|
|
376
|
-
_save_profiles_json(json_config)
|
|
377
|
-
|
|
378
|
-
# Return merged list from SQLite (now authoritative)
|
|
379
|
-
return _get_db_profiles()
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
def set_active_profile_everywhere(name: str) -> None:
|
|
383
|
-
"""Persist active profile through the crash-safe compatibility writer."""
|
|
384
|
-
from superlocalmemory.server.profile_runtime import persist_active_profile
|
|
385
|
-
|
|
386
|
-
persist_active_profile(name)
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
def delete_profile_from_db(name: str) -> None:
|
|
390
|
-
"""Delete a profile row from SQLite.
|
|
391
|
-
|
|
392
|
-
rbac_memberships has no FK to profiles, so CASCADE does not remove role
|
|
393
|
-
grants — they would otherwise survive deletion and silently re-activate if
|
|
394
|
-
a profile of the same name is later recreated. Remove them explicitly.
|
|
395
|
-
Uses ``memory_write()`` so the multi-statement DELETE is atomic and
|
|
396
|
-
serialised against other in-process writers.
|
|
397
|
-
"""
|
|
398
|
-
if not DB_PATH.exists():
|
|
399
|
-
return
|
|
400
|
-
# Receipt evidence lives in learning.db, not recall's memory.db. Purge it
|
|
401
|
-
# first: if this fails the profile row must survive for a retry rather than
|
|
402
|
-
# leaving profile-scoped learning evidence orphaned.
|
|
403
|
-
from superlocalmemory.storage.agent_experience import purge_profile_receipts
|
|
404
|
-
|
|
405
|
-
purge_profile_receipts(Path(DB_PATH).parent / "learning.db", name)
|
|
406
|
-
with memory_write(DB_PATH) as conn:
|
|
407
|
-
conn.execute("PRAGMA foreign_keys=ON")
|
|
408
|
-
# Purge role grants for this workspace (no FK CASCADE covers these).
|
|
409
|
-
for tbl in ("rbac_memberships",):
|
|
410
|
-
try:
|
|
411
|
-
conn.execute(f"DELETE FROM {tbl} WHERE profile_id = ?", (name,))
|
|
412
|
-
except sqlite3.OperationalError:
|
|
413
|
-
pass # table may not exist on older installs
|
|
414
|
-
conn.execute("DELETE FROM profiles WHERE profile_id = ?", (name,))
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
def _get_db_profiles() -> list[dict]:
|
|
418
|
-
"""Read all profiles from SQLite."""
|
|
419
|
-
if not DB_PATH.exists():
|
|
420
|
-
return []
|
|
421
|
-
try:
|
|
422
|
-
with memory_read(DB_PATH) as conn:
|
|
423
|
-
rows = conn.execute(
|
|
424
|
-
"SELECT profile_id, name, description, created_at, last_used "
|
|
425
|
-
"FROM profiles ORDER BY name"
|
|
426
|
-
).fetchall()
|
|
427
|
-
return [dict(r) for r in rows]
|
|
428
|
-
except sqlite3.OperationalError:
|
|
429
|
-
return []
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
def _load_profiles_json() -> dict:
|
|
433
|
-
"""Load profiles.json config (Dashboard dict format)."""
|
|
434
|
-
config_file = MEMORY_DIR / "profiles.json"
|
|
435
|
-
if config_file.exists():
|
|
436
|
-
try:
|
|
437
|
-
with open(config_file, "r") as f:
|
|
438
|
-
data = json.load(f)
|
|
439
|
-
# Handle ProfileManager array format → convert to dict format
|
|
440
|
-
if isinstance(data.get("profiles"), list):
|
|
441
|
-
converted = {}
|
|
442
|
-
for p in data["profiles"]:
|
|
443
|
-
n = p.get("name", "")
|
|
444
|
-
if n:
|
|
445
|
-
converted[n] = p
|
|
446
|
-
data["profiles"] = converted
|
|
447
|
-
if "active" in data and "active_profile" not in data:
|
|
448
|
-
data["active_profile"] = data.pop("active")
|
|
449
|
-
return data
|
|
450
|
-
except (json.JSONDecodeError, IOError):
|
|
451
|
-
pass
|
|
452
|
-
return {
|
|
453
|
-
"profiles": {"default": {"name": "default", "description": "Default memory profile"}},
|
|
454
|
-
"active_profile": "default",
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
def _save_profiles_json(config: dict) -> None:
|
|
459
|
-
"""Save profiles.json config."""
|
|
460
|
-
MEMORY_DIR.mkdir(parents=True, exist_ok=True)
|
|
461
|
-
config_file = MEMORY_DIR / "profiles.json"
|
|
462
|
-
with open(config_file, "w") as f:
|
|
463
|
-
json.dump(config, f, indent=2)
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
# ============================================================================
|
|
467
|
-
# Pydantic Models (shared across routes)
|
|
468
|
-
# ============================================================================
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
class SearchRequest(BaseModel):
|
|
472
|
-
"""Advanced search request model."""
|
|
473
|
-
|
|
474
|
-
query: str = Field(..., min_length=1, max_length=1000)
|
|
475
|
-
limit: int = Field(default=10, ge=1, le=100)
|
|
476
|
-
min_score: float = Field(default=0.3, ge=0.0, le=1.0)
|
|
477
|
-
category: Optional[str] = None
|
|
478
|
-
project_name: Optional[str] = None
|
|
479
|
-
cluster_id: Optional[int] = None
|
|
480
|
-
date_from: Optional[str] = None
|
|
481
|
-
date_to: Optional[str] = None
|
|
482
|
-
# T-window: relative span ("7d", "30d", "1y") or explicit range
|
|
483
|
-
# ("2026-07-01..2026-07-31"). When empty, date_from/date_to (if both set)
|
|
484
|
-
# are used as the range. Empty + no dates = no time filter.
|
|
485
|
-
window: Optional[str] = None
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
class ProfileSwitch(BaseModel):
|
|
489
|
-
"""Profile switching request."""
|
|
490
|
-
|
|
491
|
-
profile_name: str = Field(..., min_length=1, max_length=50)
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
class BackupConfigRequest(BaseModel):
|
|
495
|
-
"""Backup configuration update request."""
|
|
496
|
-
|
|
497
|
-
interval_hours: Optional[int] = Field(None, ge=1, le=8760)
|
|
498
|
-
max_backups: Optional[int] = Field(None, ge=1, le=100)
|
|
499
|
-
enabled: Optional[bool] = None
|
|
@@ -1,137 +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
|
-
"""Ingestion endpoint — accepts data from external adapters.
|
|
6
|
-
|
|
7
|
-
POST /ingest with {content, source_type, dedup_key, metadata}.
|
|
8
|
-
Deduplicates by source_type + dedup_key. Stores via MemoryEngine.
|
|
9
|
-
Admission control: max 10 concurrent ingestions (HTTP 429 on overflow).
|
|
10
|
-
|
|
11
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import json
|
|
17
|
-
import threading
|
|
18
|
-
from datetime import datetime, timezone
|
|
19
|
-
|
|
20
|
-
from fastapi import APIRouter, HTTPException, Request
|
|
21
|
-
from pydantic import BaseModel, Field
|
|
22
|
-
|
|
23
|
-
router = APIRouter(tags=["ingestion"])
|
|
24
|
-
|
|
25
|
-
_MAX_CONCURRENT = 10
|
|
26
|
-
_active_count = 0
|
|
27
|
-
_active_lock = threading.Lock()
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class IngestRequest(BaseModel):
|
|
31
|
-
# Cap ingest content (~1 MB) so a single call cannot exhaust memory through
|
|
32
|
-
# the embedding/tokenizer pipeline.
|
|
33
|
-
content: str = Field(..., max_length=1_000_000)
|
|
34
|
-
source_type: str
|
|
35
|
-
dedup_key: str
|
|
36
|
-
metadata: dict = {}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@router.post("/ingest")
|
|
40
|
-
async def ingest(req: IngestRequest, request: Request):
|
|
41
|
-
"""Ingest content from an external adapter.
|
|
42
|
-
|
|
43
|
-
Deduplicates by (source_type, dedup_key). Returns 429 if too many
|
|
44
|
-
concurrent ingestions. Stores via the singleton MemoryEngine.
|
|
45
|
-
"""
|
|
46
|
-
global _active_count
|
|
47
|
-
|
|
48
|
-
from .helpers import require_engine
|
|
49
|
-
engine = require_engine(request)
|
|
50
|
-
|
|
51
|
-
if not req.content:
|
|
52
|
-
raise HTTPException(400, detail="content required")
|
|
53
|
-
if not req.source_type:
|
|
54
|
-
raise HTTPException(400, detail="source_type required")
|
|
55
|
-
if not req.dedup_key:
|
|
56
|
-
raise HTTPException(400, detail="dedup_key required")
|
|
57
|
-
|
|
58
|
-
# Admission control
|
|
59
|
-
with _active_lock:
|
|
60
|
-
if _active_count >= _MAX_CONCURRENT:
|
|
61
|
-
raise HTTPException(
|
|
62
|
-
429,
|
|
63
|
-
detail="Too many concurrent ingestions",
|
|
64
|
-
headers={"Retry-After": "5"},
|
|
65
|
-
)
|
|
66
|
-
_active_count += 1
|
|
67
|
-
|
|
68
|
-
try:
|
|
69
|
-
from superlocalmemory.core.engine_ingestion import (
|
|
70
|
-
build_engine_ingestion_command,
|
|
71
|
-
)
|
|
72
|
-
from superlocalmemory.core.ingestion_command import (
|
|
73
|
-
IngestionRequest,
|
|
74
|
-
IngestionState,
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
from superlocalmemory.server.write_identity import (
|
|
78
|
-
authenticated_request_actor,
|
|
79
|
-
)
|
|
80
|
-
actor_id = authenticated_request_actor(
|
|
81
|
-
request,
|
|
82
|
-
actor_kind="http-ingest",
|
|
83
|
-
)
|
|
84
|
-
# Machine authentication says which process is calling. It does not say
|
|
85
|
-
# whether that caller's user may write to this workspace. Every other
|
|
86
|
-
# write route asks that question; this one did not, so a viewer could
|
|
87
|
-
# write through it in a workspace that requires a login.
|
|
88
|
-
from superlocalmemory.access.rbac import Permission
|
|
89
|
-
from superlocalmemory.server.rbac_enforce import require_permission
|
|
90
|
-
|
|
91
|
-
require_permission(request, Permission.WRITE, profile=engine._profile_id)
|
|
92
|
-
command = build_engine_ingestion_command(engine)
|
|
93
|
-
receipt, created = command.submit_with_status(IngestionRequest(
|
|
94
|
-
content=req.content,
|
|
95
|
-
profile_id=engine._profile_id,
|
|
96
|
-
source_type=req.source_type,
|
|
97
|
-
idempotency_key=req.dedup_key,
|
|
98
|
-
metadata=dict(req.metadata),
|
|
99
|
-
trusted_actor_id=actor_id,
|
|
100
|
-
))
|
|
101
|
-
completed = command.materialize(receipt.operation_id)
|
|
102
|
-
if completed.state is not IngestionState.COMPLETE:
|
|
103
|
-
raise RuntimeError(
|
|
104
|
-
completed.last_error or "canonical adapter ingestion failed"
|
|
105
|
-
)
|
|
106
|
-
fact_ids = list(completed.fact_ids)
|
|
107
|
-
|
|
108
|
-
# Compatibility ledger for existing dashboards. M018 is the source of
|
|
109
|
-
# truth; retries repair this row without repeating the canonical write.
|
|
110
|
-
engine._db.execute(
|
|
111
|
-
"INSERT OR IGNORE INTO ingestion_log "
|
|
112
|
-
"(profile_id, source_type, dedup_key, fact_ids, metadata, status, ingested_at) "
|
|
113
|
-
"VALUES (?, ?, ?, ?, ?, 'ingested', ?)",
|
|
114
|
-
(
|
|
115
|
-
engine._profile_id,
|
|
116
|
-
req.source_type,
|
|
117
|
-
req.dedup_key,
|
|
118
|
-
json.dumps(fact_ids),
|
|
119
|
-
json.dumps(req.metadata),
|
|
120
|
-
datetime.now(timezone.utc).isoformat(),
|
|
121
|
-
),
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
result = {
|
|
125
|
-
"ingested": created,
|
|
126
|
-
"operation_id": completed.operation_id,
|
|
127
|
-
"fact_ids": fact_ids,
|
|
128
|
-
}
|
|
129
|
-
if not created:
|
|
130
|
-
result["reason"] = "already_ingested"
|
|
131
|
-
return result
|
|
132
|
-
|
|
133
|
-
except Exception as exc:
|
|
134
|
-
raise HTTPException(500, detail=str(exc))
|
|
135
|
-
finally:
|
|
136
|
-
with _active_lock:
|
|
137
|
-
_active_count -= 1
|