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,314 +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
|
|
4
|
-
|
|
5
|
-
"""Progressive-abstraction read API (Wave Q3).
|
|
6
|
-
|
|
7
|
-
Exposes the abstraction hierarchy so the dashboard can browse it and drill
|
|
8
|
-
down to source atoms:
|
|
9
|
-
|
|
10
|
-
GET /api/v3/abstraction/persona — the per-profile persona roll-up
|
|
11
|
-
GET /api/v3/abstraction/communities — community summaries (Q2)
|
|
12
|
-
GET /api/v3/abstraction/consolidated — display-only cluster summaries
|
|
13
|
-
GET /api/v3/abstraction/health — can my memories be found? (4.0.10)
|
|
14
|
-
GET /api/v3/abstraction/sources — drill-down (node -> source atoms)
|
|
15
|
-
|
|
16
|
-
Read-only, profile-scoped (Rule 01), direct sqlite3 (Rule 06). All handlers
|
|
17
|
-
fail-soft: a missing DB or table returns an empty payload, never a 500.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import logging
|
|
23
|
-
import sqlite3
|
|
24
|
-
from typing import Any
|
|
25
|
-
|
|
26
|
-
from fastapi import APIRouter, Query
|
|
27
|
-
from fastapi.responses import JSONResponse
|
|
28
|
-
|
|
29
|
-
from superlocalmemory.server.routes.helpers import DB_PATH, get_active_profile, get_read_connection
|
|
30
|
-
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
|
-
router = APIRouter(prefix="/api/v3/abstraction", tags=["abstraction"])
|
|
34
|
-
|
|
35
|
-
#: How many summary rows /consolidated will read before ranking them by
|
|
36
|
-
#: quality. Bounded because this runs on a request thread: a store with tens of
|
|
37
|
-
#: thousands of summaries must not turn one card into a full-table scan.
|
|
38
|
-
_SCAN_CEILING = 400
|
|
39
|
-
|
|
40
|
-
#: Characters of normalised opening text that make two summaries "the same
|
|
41
|
-
#: summary" for display. Long enough that two genuinely different subjects
|
|
42
|
-
#: diverge within it, short enough to catch the same sentence with a different
|
|
43
|
-
#: tail — which is the shape the summarizer actually produces.
|
|
44
|
-
_OPENING_KEY_CHARS = 90
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def _opening_key(content: object) -> str:
|
|
48
|
-
"""Normalised opening of a summary, for near-duplicate collapsing.
|
|
49
|
-
|
|
50
|
-
Case-folded with runs of whitespace flattened, so two summaries differing
|
|
51
|
-
only in line wrapping or capitalisation collapse together. Returns "" for
|
|
52
|
-
anything too short to judge, which is then never collapsed — better to show
|
|
53
|
-
a duplicate than to hide a distinct summary on a weak signal.
|
|
54
|
-
"""
|
|
55
|
-
text = " ".join(str(content or "").split()).casefold()
|
|
56
|
-
if len(text) < 40:
|
|
57
|
-
return ""
|
|
58
|
-
return text[:_OPENING_KEY_CHARS]
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class _ReadDB:
|
|
62
|
-
"""Adapt a raw sqlite3 connection to the .execute(...) -> list contract
|
|
63
|
-
the read-only builder methods expect (matches DatabaseManager.execute)."""
|
|
64
|
-
|
|
65
|
-
def __init__(self, conn: sqlite3.Connection) -> None:
|
|
66
|
-
self._conn = conn
|
|
67
|
-
|
|
68
|
-
def execute(self, sql: str, params: tuple = ()) -> list:
|
|
69
|
-
return self._conn.execute(sql, params).fetchall()
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def _conn() -> sqlite3.Connection | None:
|
|
73
|
-
if not DB_PATH.exists():
|
|
74
|
-
return None
|
|
75
|
-
return get_read_connection(DB_PATH)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@router.get("/persona")
|
|
79
|
-
def get_persona(profile: str = Query("")) -> JSONResponse:
|
|
80
|
-
pid = profile or get_active_profile()
|
|
81
|
-
conn = _conn()
|
|
82
|
-
if conn is None:
|
|
83
|
-
return JSONResponse({"profile": pid, "persona": None})
|
|
84
|
-
try:
|
|
85
|
-
from superlocalmemory.core.progressive_abstraction import ProgressiveAbstraction
|
|
86
|
-
|
|
87
|
-
persona = ProgressiveAbstraction(_ReadDB(conn)).get_persona(pid)
|
|
88
|
-
return JSONResponse({"profile": pid, "persona": persona})
|
|
89
|
-
except Exception as exc: # pragma: no cover - defensive
|
|
90
|
-
logger.debug("persona read failed: %s", exc)
|
|
91
|
-
return JSONResponse({"profile": pid, "persona": None})
|
|
92
|
-
finally:
|
|
93
|
-
conn.close()
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@router.get("/communities")
|
|
97
|
-
def get_communities(profile: str = Query("")) -> JSONResponse:
|
|
98
|
-
pid = profile or get_active_profile()
|
|
99
|
-
conn = _conn()
|
|
100
|
-
if conn is None:
|
|
101
|
-
return JSONResponse({"profile": pid, "communities": []})
|
|
102
|
-
try:
|
|
103
|
-
from superlocalmemory.core.community_summary import CommunitySummaryBuilder
|
|
104
|
-
|
|
105
|
-
summaries = CommunitySummaryBuilder(_ReadDB(conn)).get_summaries(pid)
|
|
106
|
-
return JSONResponse({"profile": pid, "communities": summaries})
|
|
107
|
-
except Exception as exc: # pragma: no cover - defensive
|
|
108
|
-
logger.debug("communities read failed: %s", exc)
|
|
109
|
-
return JSONResponse({"profile": pid, "communities": []})
|
|
110
|
-
finally:
|
|
111
|
-
conn.close()
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@router.get("/sources")
|
|
115
|
-
def get_sources(
|
|
116
|
-
profile: str = Query(""), node: str = Query("persona"),
|
|
117
|
-
) -> JSONResponse:
|
|
118
|
-
pid = profile or get_active_profile()
|
|
119
|
-
conn = _conn()
|
|
120
|
-
empty: dict[str, Any] = {
|
|
121
|
-
"node_id": node, "node_type": "unknown", "communities": [], "fact_ids": [],
|
|
122
|
-
}
|
|
123
|
-
if conn is None:
|
|
124
|
-
return JSONResponse({"profile": pid, "sources": empty})
|
|
125
|
-
try:
|
|
126
|
-
from superlocalmemory.core.progressive_abstraction import ProgressiveAbstraction
|
|
127
|
-
|
|
128
|
-
node_val: Any = node
|
|
129
|
-
if node != "persona":
|
|
130
|
-
try:
|
|
131
|
-
node_val = int(node)
|
|
132
|
-
except (ValueError, TypeError):
|
|
133
|
-
node_val = node
|
|
134
|
-
sources = ProgressiveAbstraction(_ReadDB(conn)).get_sources(pid, node_val)
|
|
135
|
-
return JSONResponse({"profile": pid, "sources": sources})
|
|
136
|
-
except Exception as exc: # pragma: no cover - defensive
|
|
137
|
-
logger.debug("sources read failed: %s", exc)
|
|
138
|
-
return JSONResponse({"profile": pid, "sources": empty})
|
|
139
|
-
finally:
|
|
140
|
-
conn.close()
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
@router.get("/consolidated")
|
|
144
|
-
def get_consolidated(
|
|
145
|
-
profile: str = Query(""),
|
|
146
|
-
limit: int = Query(50, ge=1, le=200),
|
|
147
|
-
include_unusable: bool = Query(False),
|
|
148
|
-
) -> JSONResponse:
|
|
149
|
-
"""Cluster summaries, read from the DISPLAY table and nowhere else.
|
|
150
|
-
|
|
151
|
-
``consolidated_summaries`` is the only source. Reading ``atomic_facts``
|
|
152
|
-
here would put the boundary back where it was: these summaries were in the
|
|
153
|
-
retrieval corpus until 4.0.10 and the whole point of moving them is that
|
|
154
|
-
exactly one surface shows them, and it is this one.
|
|
155
|
-
|
|
156
|
-
``summaries`` holds only rows worth reading. The rest are REPORTED, not
|
|
157
|
-
returned: ``unusable`` and ``near_duplicates`` are counts over the scanned
|
|
158
|
-
window. A reader is better served by "62 of these came back empty" than by a
|
|
159
|
-
page that silently shows a handful and looks complete — and hiding the fact
|
|
160
|
-
that they came back empty would hide the problem this endpoint exists to make
|
|
161
|
-
visible. ``include_unusable=true`` returns them for inspection.
|
|
162
|
-
|
|
163
|
-
Two orderings, both measured rather than chosen:
|
|
164
|
-
|
|
165
|
-
* Ranking by ``source_count`` alone put the junk on top, because the
|
|
166
|
-
summaries merging the largest clusters are exactly the ones the model had
|
|
167
|
-
least in common to work with. On the author's store **0 of the top 24 by
|
|
168
|
-
source_count were usable**, so a card asking for 24 rendered empty against
|
|
169
|
-
a store holding a thousand summaries.
|
|
170
|
-
* Rows covering real memories rank above rows covering none. 353 of these
|
|
171
|
-
are summaries of summaries; their honest ``source_count`` is 0, and a
|
|
172
|
-
digest of the summarizer's own output is worth less to a reader than a
|
|
173
|
-
digest of their own words.
|
|
174
|
-
|
|
175
|
-
Quality is a Python predicate rather than a SQL expression, which is why the
|
|
176
|
-
window is read to at most ``_SCAN_CEILING`` rows, classified, and then
|
|
177
|
-
ordered.
|
|
178
|
-
"""
|
|
179
|
-
pid = profile or get_active_profile()
|
|
180
|
-
conn = _conn()
|
|
181
|
-
if conn is None:
|
|
182
|
-
return JSONResponse({
|
|
183
|
-
"profile": pid, "summaries": [], "unusable": 0, "scanned": 0,
|
|
184
|
-
})
|
|
185
|
-
try:
|
|
186
|
-
from superlocalmemory.summaries.base import clean_llm_summary
|
|
187
|
-
from superlocalmemory.summaries.non_answer import (
|
|
188
|
-
MIN_USEFUL_CHARS,
|
|
189
|
-
is_non_answer,
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
scan = min(_SCAN_CEILING, max(int(limit) * 8, int(limit)))
|
|
193
|
-
rows = conn.execute(
|
|
194
|
-
"SELECT summary_id, entity_name, content, source_count, "
|
|
195
|
-
" generated_by, source_earliest, source_latest, created_at "
|
|
196
|
-
" FROM consolidated_summaries "
|
|
197
|
-
" WHERE profile_id = ? "
|
|
198
|
-
" ORDER BY source_count DESC, created_at DESC, summary_id ASC "
|
|
199
|
-
" LIMIT ?",
|
|
200
|
-
(pid, scan),
|
|
201
|
-
).fetchall()
|
|
202
|
-
|
|
203
|
-
classified: list[dict[str, Any]] = []
|
|
204
|
-
unusable = 0
|
|
205
|
-
for row in rows:
|
|
206
|
-
item = dict(row)
|
|
207
|
-
# CLEAN, THEN JUDGE — the same order the write path uses, and for
|
|
208
|
-
# the same reason. Rows migrated from the old corpus were never
|
|
209
|
-
# cleaned, so their scaffolding is still attached: judging first let
|
|
210
|
-
# "Here is a concise summary paragraph incorporating all 10 facts..."
|
|
211
|
-
# through as usable and put it at the top of the card, because it
|
|
212
|
-
# does contain a summary and the non-answer rules are about refusals,
|
|
213
|
-
# not preambles. Cleaning is also what the reader should see: the
|
|
214
|
-
# scaffolding is addressed to a conversation they cannot read.
|
|
215
|
-
item["content"] = clean_llm_summary(str(item.get("content") or ""))
|
|
216
|
-
rejected, why = is_non_answer(
|
|
217
|
-
item["content"], min_chars=MIN_USEFUL_CHARS,
|
|
218
|
-
)
|
|
219
|
-
item["quality"] = why if rejected else "ok"
|
|
220
|
-
if rejected:
|
|
221
|
-
unusable += 1
|
|
222
|
-
classified.append(item)
|
|
223
|
-
|
|
224
|
-
# Usable first, then rows that cover real memories, then the SQL
|
|
225
|
-
# ordering within each group. Stable sort, so two runs of one request
|
|
226
|
-
# return the same rows in the same order — a summary card that
|
|
227
|
-
# reshuffles itself on refresh reads as a bug even when every row is
|
|
228
|
-
# correct.
|
|
229
|
-
classified.sort(key=lambda item: (
|
|
230
|
-
0 if item["quality"] == "ok" else 1,
|
|
231
|
-
0 if (item.get("source_count") or 0) > 0 else 1,
|
|
232
|
-
))
|
|
233
|
-
|
|
234
|
-
# Collapse near-duplicates.
|
|
235
|
-
#
|
|
236
|
-
# The table's UNIQUE constraint is on exact content, so summaries that
|
|
237
|
-
# differ by a clause survive as separate rows. On the author's store the
|
|
238
|
-
# first 24 usable rows all opened "The Pro and SuperLocalMemory (SLM)
|
|
239
|
-
# projects have made significant progress in..." — twenty-four cards
|
|
240
|
-
# saying one thing, which reads as a broken page rather than as a view
|
|
241
|
-
# of a memory.
|
|
242
|
-
#
|
|
243
|
-
# Collapsed on a normalised opening, keeping the row that merged the
|
|
244
|
-
# most memories (the ordering above already put it first). The count is
|
|
245
|
-
# reported, not swallowed: that these summaries repeat each other is a
|
|
246
|
-
# real property of the store and worth a reader knowing.
|
|
247
|
-
deduped: list[dict[str, Any]] = []
|
|
248
|
-
seen_openings: set[str] = set()
|
|
249
|
-
collapsed = 0
|
|
250
|
-
for item in classified:
|
|
251
|
-
key = _opening_key(item.get("content"))
|
|
252
|
-
if key and key in seen_openings:
|
|
253
|
-
collapsed += 1
|
|
254
|
-
continue
|
|
255
|
-
if key:
|
|
256
|
-
seen_openings.add(key)
|
|
257
|
-
deduped.append(item)
|
|
258
|
-
|
|
259
|
-
# Only rows worth reading occupy the window.
|
|
260
|
-
#
|
|
261
|
-
# A first draft returned everything, usable first, and truncated at
|
|
262
|
-
# `limit`. Because the usable rows on this store collapse to a handful
|
|
263
|
-
# of distinct openings, the tail of a limit-10 request filled with
|
|
264
|
-
# refusals — and a card asking for 10 got 2 it could render and 8 it
|
|
265
|
-
# threw away. The counts carry what the reader needs to know about the
|
|
266
|
-
# rest; the rows themselves add nothing to a card.
|
|
267
|
-
shown = (
|
|
268
|
-
deduped[:int(limit)] if include_unusable
|
|
269
|
-
else [i for i in deduped if i["quality"] == "ok"][:int(limit)]
|
|
270
|
-
)
|
|
271
|
-
return JSONResponse({
|
|
272
|
-
"profile": pid,
|
|
273
|
-
"summaries": shown,
|
|
274
|
-
"unusable": unusable,
|
|
275
|
-
"near_duplicates": collapsed,
|
|
276
|
-
"scanned": len(rows),
|
|
277
|
-
})
|
|
278
|
-
except sqlite3.Error as exc:
|
|
279
|
-
# A store that predates the display table. Empty, not an error.
|
|
280
|
-
logger.debug("consolidated summaries read failed: %s", exc)
|
|
281
|
-
return JSONResponse({
|
|
282
|
-
"profile": pid, "summaries": [], "unusable": 0, "scanned": 0,
|
|
283
|
-
})
|
|
284
|
-
finally:
|
|
285
|
-
conn.close()
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
@router.get("/health")
|
|
289
|
-
def get_memory_health() -> JSONResponse:
|
|
290
|
-
"""Whether this store's memories can actually be found.
|
|
291
|
-
|
|
292
|
-
Same measurement ``slm doctor`` prints, so the dashboard and the CLI cannot
|
|
293
|
-
tell the owner two different things. Read-only and fail-soft.
|
|
294
|
-
"""
|
|
295
|
-
try:
|
|
296
|
-
from superlocalmemory.core.memory_health import describe, measure
|
|
297
|
-
|
|
298
|
-
health = measure(DB_PATH)
|
|
299
|
-
return JSONResponse({
|
|
300
|
-
"live_facts": health.live_facts,
|
|
301
|
-
"findable_by_meaning": health.findable_by_meaning,
|
|
302
|
-
"missing_vector": health.missing_vector,
|
|
303
|
-
"withheld_summaries": health.withheld_summaries,
|
|
304
|
-
"display_summaries": health.display_summaries,
|
|
305
|
-
"hidden_by_forgetting": health.hidden_by_forgetting,
|
|
306
|
-
"inconsistently_hidden": health.inconsistently_hidden,
|
|
307
|
-
"reachability": round(health.reachability, 4),
|
|
308
|
-
"healthy": health.healthy,
|
|
309
|
-
"unavailable": list(health.unavailable),
|
|
310
|
-
"summary": describe(health),
|
|
311
|
-
})
|
|
312
|
-
except Exception as exc: # pragma: no cover - defensive
|
|
313
|
-
logger.debug("memory health read failed: %s", exc)
|
|
314
|
-
return JSONResponse({"healthy": None, "summary": [], "unavailable": ["error"]})
|
|
@@ -1,63 +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 adapter management API — enable/disable/start/stop from dashboard.
|
|
6
|
-
|
|
7
|
-
v3.4.4: Users can manage Gmail, Calendar, Transcript adapters entirely from
|
|
8
|
-
the dashboard UI — no CLI needed. The best product experience.
|
|
9
|
-
|
|
10
|
-
Endpoints:
|
|
11
|
-
GET /api/adapters — list all adapters with status
|
|
12
|
-
POST /api/adapters/enable — enable an adapter
|
|
13
|
-
POST /api/adapters/disable — disable an adapter
|
|
14
|
-
POST /api/adapters/start — start a running adapter
|
|
15
|
-
POST /api/adapters/stop — stop a running adapter
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
from fastapi import APIRouter, Request
|
|
21
|
-
from pydantic import BaseModel
|
|
22
|
-
|
|
23
|
-
router = APIRouter(tags=["adapters"])
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class AdapterAction(BaseModel):
|
|
27
|
-
name: str
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@router.get("/api/adapters")
|
|
31
|
-
async def list_adapters_api():
|
|
32
|
-
"""List all adapters with their enabled/running status."""
|
|
33
|
-
from superlocalmemory.ingestion.adapter_manager import list_adapters
|
|
34
|
-
adapters = list_adapters()
|
|
35
|
-
return {"adapters": adapters}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@router.post("/api/adapters/enable")
|
|
39
|
-
async def enable_adapter_api(body: AdapterAction):
|
|
40
|
-
"""Enable an adapter (doesn't start it yet)."""
|
|
41
|
-
from superlocalmemory.ingestion.adapter_manager import enable_adapter
|
|
42
|
-
return enable_adapter(body.name)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
@router.post("/api/adapters/disable")
|
|
46
|
-
async def disable_adapter_api(body: AdapterAction):
|
|
47
|
-
"""Disable and stop an adapter."""
|
|
48
|
-
from superlocalmemory.ingestion.adapter_manager import disable_adapter
|
|
49
|
-
return disable_adapter(body.name)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@router.post("/api/adapters/start")
|
|
53
|
-
async def start_adapter_api(body: AdapterAction):
|
|
54
|
-
"""Start a running adapter subprocess."""
|
|
55
|
-
from superlocalmemory.ingestion.adapter_manager import start_adapter
|
|
56
|
-
return start_adapter(body.name)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@router.post("/api/adapters/stop")
|
|
60
|
-
async def stop_adapter_api(body: AdapterAction):
|
|
61
|
-
"""Stop a running adapter."""
|
|
62
|
-
from superlocalmemory.ingestion.adapter_manager import stop_adapter
|
|
63
|
-
return stop_adapter(body.name)
|
|
@@ -1,303 +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 - Agent Registry + Trust Routes
|
|
5
|
-
- AGPL-3.0-or-later
|
|
6
|
-
|
|
7
|
-
Routes: /api/agents, /api/agents/stats, /api/trust/stats, /api/trust/signals/{agent_id}
|
|
8
|
-
Uses V3 TrustScorer and core.registry.
|
|
9
|
-
"""
|
|
10
|
-
import logging
|
|
11
|
-
from typing import Optional
|
|
12
|
-
|
|
13
|
-
from fastapi import APIRouter, HTTPException, Query, Request
|
|
14
|
-
|
|
15
|
-
from superlocalmemory.infra.data_root import state_path
|
|
16
|
-
|
|
17
|
-
from .helpers import DB_PATH, get_read_connection
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger("superlocalmemory.routes.agents")
|
|
20
|
-
router = APIRouter()
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def _internal_error(detail: str = "Internal server error") -> HTTPException:
|
|
24
|
-
"""SEC-H-02: log full traceback server-side; return a generic message to the client."""
|
|
25
|
-
logger.exception("agents route error")
|
|
26
|
-
return HTTPException(status_code=500, detail=detail)
|
|
27
|
-
|
|
28
|
-
# Feature flag: V3 trust scorer
|
|
29
|
-
TRUST_AVAILABLE = False
|
|
30
|
-
try:
|
|
31
|
-
from superlocalmemory.trust.scorer import TrustScorer
|
|
32
|
-
TRUST_AVAILABLE = True
|
|
33
|
-
except ImportError:
|
|
34
|
-
pass
|
|
35
|
-
|
|
36
|
-
REGISTRY_AVAILABLE = False
|
|
37
|
-
try:
|
|
38
|
-
from superlocalmemory.core.registry import AgentRegistry
|
|
39
|
-
REGISTRY_AVAILABLE = True
|
|
40
|
-
except ImportError:
|
|
41
|
-
pass
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def _registry_path():
|
|
45
|
-
return state_path("agents.json")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@router.get("/api/agents")
|
|
49
|
-
async def get_agents(
|
|
50
|
-
request: Request,
|
|
51
|
-
protocol: Optional[str] = None,
|
|
52
|
-
limit: int = Query(50, ge=1, le=200),
|
|
53
|
-
):
|
|
54
|
-
"""List registered agents with optional protocol filter."""
|
|
55
|
-
if not REGISTRY_AVAILABLE:
|
|
56
|
-
return {"agents": [], "count": 0, "message": "Agent registry not available"}
|
|
57
|
-
try:
|
|
58
|
-
registry = AgentRegistry(persist_path=_registry_path())
|
|
59
|
-
agents = registry.list_agents()
|
|
60
|
-
return {
|
|
61
|
-
"agents": agents,
|
|
62
|
-
"count": len(agents),
|
|
63
|
-
"stats": {"total_agents": len(agents)},
|
|
64
|
-
}
|
|
65
|
-
except Exception:
|
|
66
|
-
raise _internal_error("Agent registry error")
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
@router.get("/api/agents/stats")
|
|
70
|
-
async def get_agent_stats(request: Request):
|
|
71
|
-
"""Get agent registry statistics."""
|
|
72
|
-
if not REGISTRY_AVAILABLE:
|
|
73
|
-
return {"total_agents": 0, "message": "Agent registry not available"}
|
|
74
|
-
try:
|
|
75
|
-
registry = AgentRegistry(persist_path=_registry_path())
|
|
76
|
-
agents = registry.list_agents()
|
|
77
|
-
return {"total_agents": len(agents)}
|
|
78
|
-
except Exception:
|
|
79
|
-
raise _internal_error("Agent stats error")
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
@router.get("/api/agents/memory-activity")
|
|
83
|
-
async def get_agent_memory_activity(
|
|
84
|
-
request: Request,
|
|
85
|
-
limit: int = Query(20, ge=1, le=100),
|
|
86
|
-
):
|
|
87
|
-
"""Per-agent memory attribution for the multi-agent memory view.
|
|
88
|
-
|
|
89
|
-
Reports how many memories each writing agent contributed, when each was
|
|
90
|
-
last active, which ingestion sources they used, and the most recent
|
|
91
|
-
entries — grouped by ``ingestion_operations.trusted_actor_id`` (the agent
|
|
92
|
-
that wrote the memory). Profile-scoped. Uses a direct DB read because the
|
|
93
|
-
dashboard runs without the engine subprocess. Never raises to the client;
|
|
94
|
-
returns empty structures if the operations table is absent.
|
|
95
|
-
"""
|
|
96
|
-
import sqlite3
|
|
97
|
-
|
|
98
|
-
from .helpers import get_active_profile
|
|
99
|
-
|
|
100
|
-
pid = get_active_profile()
|
|
101
|
-
agents: list[dict] = []
|
|
102
|
-
recent: list[dict] = []
|
|
103
|
-
total = 0
|
|
104
|
-
|
|
105
|
-
if DB_PATH.exists():
|
|
106
|
-
conn = get_read_connection(DB_PATH)
|
|
107
|
-
try:
|
|
108
|
-
try:
|
|
109
|
-
# Group by the agent's OWN identity, not by the capability that
|
|
110
|
-
# authorised the write.
|
|
111
|
-
#
|
|
112
|
-
# This grouped by ``trusted_actor_id``, which on a real store is
|
|
113
|
-
# a capability digest — 43 distinct agents rendered as 43 rows of
|
|
114
|
-
# ``daemon-capability:923b7d6e616f46d3...`` and not one readable
|
|
115
|
-
# name. For a pane whose entire purpose is telling agents apart,
|
|
116
|
-
# that is the same as showing nothing.
|
|
117
|
-
#
|
|
118
|
-
# The real name was already being stored the whole time: writers
|
|
119
|
-
# pass ``agent_id`` and it lands in ``raw_metadata_json``. On this
|
|
120
|
-
# store that yields claude-desktop, claude, gemini, codex, grok
|
|
121
|
-
# and mcp_client. Capability digests remain available per row for
|
|
122
|
-
# audit — they answer "what was allowed to write this", which is a
|
|
123
|
-
# different and also useful question, just not this pane's.
|
|
124
|
-
# raw_metadata_json is absent on stores predating it. Try the
|
|
125
|
-
# identity query and fall back to capability grouping if the
|
|
126
|
-
# column is missing — without this, the OperationalError is
|
|
127
|
-
# caught below and an older install shows ZERO agents while
|
|
128
|
-
# having plenty. Deliberately not PRAGMA table_info: this
|
|
129
|
-
# handler is on the dashboard read path, which is gated against
|
|
130
|
-
# anything that parses as DDL.
|
|
131
|
-
_tail = (
|
|
132
|
-
"COUNT(*) AS cnt, MAX(created_at) AS last_active, "
|
|
133
|
-
"GROUP_CONCAT(DISTINCT source_type) AS sources, "
|
|
134
|
-
"COUNT(DISTINCT NULLIF(trusted_actor_id, '')) AS capabilities "
|
|
135
|
-
"FROM ingestion_operations WHERE profile_id=? "
|
|
136
|
-
"GROUP BY agent_id ORDER BY cnt DESC, agent_id ASC "
|
|
137
|
-
"LIMIT 500"
|
|
138
|
-
)
|
|
139
|
-
try:
|
|
140
|
-
rows = conn.execute(
|
|
141
|
-
"SELECT COALESCE("
|
|
142
|
-
" NULLIF(json_extract(raw_metadata_json, '$.agent_id'), ''),"
|
|
143
|
-
" NULLIF(trusted_actor_id, ''),"
|
|
144
|
-
" 'unknown'"
|
|
145
|
-
") AS agent_id, " + _tail,
|
|
146
|
-
(pid,),
|
|
147
|
-
).fetchall()
|
|
148
|
-
except sqlite3.OperationalError:
|
|
149
|
-
rows = conn.execute(
|
|
150
|
-
"SELECT COALESCE(NULLIF(trusted_actor_id, ''), 'unknown')"
|
|
151
|
-
" AS agent_id, " + _tail,
|
|
152
|
-
(pid,),
|
|
153
|
-
).fetchall()
|
|
154
|
-
for r in rows:
|
|
155
|
-
name = r["agent_id"]
|
|
156
|
-
agents.append({
|
|
157
|
-
"agent_id": name,
|
|
158
|
-
"count": r["cnt"],
|
|
159
|
-
"last_active": r["last_active"],
|
|
160
|
-
"source_types": (
|
|
161
|
-
[s for s in (r["sources"] or "").split(",") if s]
|
|
162
|
-
),
|
|
163
|
-
# How many distinct capabilities this agent wrote under.
|
|
164
|
-
"capability_count": r["capabilities"],
|
|
165
|
-
# True when we fell back to a digest — the UI can then say
|
|
166
|
-
# "this writer did not identify itself" instead of
|
|
167
|
-
# presenting a hash as though it were a name.
|
|
168
|
-
"identified": not str(name).startswith(
|
|
169
|
-
("daemon-capability:", "local-capability:")
|
|
170
|
-
) and name != "unknown",
|
|
171
|
-
})
|
|
172
|
-
total += r["cnt"]
|
|
173
|
-
except sqlite3.OperationalError:
|
|
174
|
-
pass
|
|
175
|
-
|
|
176
|
-
try:
|
|
177
|
-
rows = conn.execute(
|
|
178
|
-
"SELECT CASE WHEN trusted_actor_id='' THEN 'unknown' "
|
|
179
|
-
"ELSE trusted_actor_id END AS agent_id, "
|
|
180
|
-
"substr(raw_content, 1, 160) AS snippet, "
|
|
181
|
-
"created_at, source_type, session_id "
|
|
182
|
-
"FROM ingestion_operations WHERE profile_id=? "
|
|
183
|
-
"ORDER BY created_at DESC, rowid DESC LIMIT ?",
|
|
184
|
-
(pid, int(limit)),
|
|
185
|
-
).fetchall()
|
|
186
|
-
recent = [{
|
|
187
|
-
"agent_id": r["agent_id"],
|
|
188
|
-
"content": r["snippet"],
|
|
189
|
-
"created_at": r["created_at"],
|
|
190
|
-
"source_type": r["source_type"],
|
|
191
|
-
"session_id": r["session_id"],
|
|
192
|
-
} for r in rows]
|
|
193
|
-
except sqlite3.OperationalError:
|
|
194
|
-
pass
|
|
195
|
-
finally:
|
|
196
|
-
conn.close()
|
|
197
|
-
|
|
198
|
-
return {
|
|
199
|
-
"ok": True,
|
|
200
|
-
"profile_id": pid,
|
|
201
|
-
"total_memories": total,
|
|
202
|
-
"agent_count": len(agents),
|
|
203
|
-
"agents": agents,
|
|
204
|
-
"recent": recent,
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
@router.get("/api/trust/stats")
|
|
209
|
-
async def get_trust_stats(request: Request):
|
|
210
|
-
"""Get trust scoring statistics.
|
|
211
|
-
|
|
212
|
-
Queries trust_scores and trust_signals tables directly (no engine needed).
|
|
213
|
-
Falls back to engine._trust_scorer if available.
|
|
214
|
-
"""
|
|
215
|
-
try:
|
|
216
|
-
# Try engine-based scorer first
|
|
217
|
-
try:
|
|
218
|
-
engine = getattr(request.app.state, "engine", None)
|
|
219
|
-
if engine and getattr(engine, "_trust_scorer", None):
|
|
220
|
-
return engine._trust_scorer.get_trust_stats()
|
|
221
|
-
except (AttributeError, Exception):
|
|
222
|
-
pass # Fall through to direct DB query
|
|
223
|
-
|
|
224
|
-
# Direct DB query (dashboard runs without engine subprocess)
|
|
225
|
-
import sqlite3
|
|
226
|
-
from .helpers import get_active_profile
|
|
227
|
-
pid = get_active_profile()
|
|
228
|
-
|
|
229
|
-
total_signals = 0
|
|
230
|
-
avg_trust_score = 0.667
|
|
231
|
-
by_signal_type = {}
|
|
232
|
-
|
|
233
|
-
if DB_PATH.exists():
|
|
234
|
-
conn = get_read_connection(DB_PATH)
|
|
235
|
-
try:
|
|
236
|
-
try:
|
|
237
|
-
# Count trust signals
|
|
238
|
-
row = conn.execute(
|
|
239
|
-
"SELECT COUNT(*) AS cnt FROM trust_signals "
|
|
240
|
-
"WHERE profile_id = ?", (pid,),
|
|
241
|
-
).fetchone()
|
|
242
|
-
total_signals = row["cnt"] if row else 0
|
|
243
|
-
except sqlite3.OperationalError:
|
|
244
|
-
pass
|
|
245
|
-
|
|
246
|
-
try:
|
|
247
|
-
# Average trust score
|
|
248
|
-
row = conn.execute(
|
|
249
|
-
"SELECT AVG(trust_score) AS avg_ts FROM trust_scores "
|
|
250
|
-
"WHERE profile_id = ?", (pid,),
|
|
251
|
-
).fetchone()
|
|
252
|
-
if row and row["avg_ts"] is not None:
|
|
253
|
-
avg_trust_score = round(float(row["avg_ts"]), 3)
|
|
254
|
-
except sqlite3.OperationalError:
|
|
255
|
-
pass
|
|
256
|
-
|
|
257
|
-
try:
|
|
258
|
-
# Signal breakdown by type
|
|
259
|
-
rows = conn.execute(
|
|
260
|
-
"SELECT signal_type, COUNT(*) AS cnt "
|
|
261
|
-
"FROM trust_signals WHERE profile_id = ? "
|
|
262
|
-
"GROUP BY signal_type", (pid,),
|
|
263
|
-
).fetchall()
|
|
264
|
-
by_signal_type = {r["signal_type"]: r["cnt"] for r in rows}
|
|
265
|
-
except sqlite3.OperationalError:
|
|
266
|
-
pass
|
|
267
|
-
finally:
|
|
268
|
-
conn.close()
|
|
269
|
-
|
|
270
|
-
# Enforcement status: SLM uses "Silent Collection" by default
|
|
271
|
-
enforcement = "Silent Collection"
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
"total_signals": total_signals,
|
|
275
|
-
"avg_trust_score": avg_trust_score,
|
|
276
|
-
"enforcement": enforcement,
|
|
277
|
-
"by_signal_type": by_signal_type,
|
|
278
|
-
}
|
|
279
|
-
except Exception:
|
|
280
|
-
raise _internal_error("Trust stats error")
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
@router.get("/api/trust/signals/{agent_id}")
|
|
284
|
-
async def get_agent_trust_signals(
|
|
285
|
-
request: Request, agent_id: str,
|
|
286
|
-
limit: int = Query(50, ge=1, le=200),
|
|
287
|
-
):
|
|
288
|
-
"""Get trust signal history for a specific agent."""
|
|
289
|
-
if not TRUST_AVAILABLE:
|
|
290
|
-
return {"signals": [], "count": 0}
|
|
291
|
-
try:
|
|
292
|
-
engine = getattr(request.app.state, "engine", None)
|
|
293
|
-
if engine and engine._trust_scorer:
|
|
294
|
-
scorer = engine._trust_scorer
|
|
295
|
-
signals = scorer.get_signals(agent_id, limit=limit)
|
|
296
|
-
score = scorer.get_trust_score(agent_id)
|
|
297
|
-
return {
|
|
298
|
-
"agent_id": agent_id, "trust_score": score,
|
|
299
|
-
"signals": signals, "count": len(signals),
|
|
300
|
-
}
|
|
301
|
-
return {"agent_id": agent_id, "signals": [], "count": 0}
|
|
302
|
-
except Exception:
|
|
303
|
-
raise _internal_error("Trust signals error")
|