superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,414 +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
|
-
"""Subprocess recall worker — runs the full recall pipeline in isolation.
|
|
6
|
-
|
|
7
|
-
The dashboard/MCP main process NEVER imports torch, numpy, or the engine.
|
|
8
|
-
All heavy work (engine init, embedding, retrieval, reranking) happens here.
|
|
9
|
-
|
|
10
|
-
Protocol (JSON over stdin/stdout):
|
|
11
|
-
Request: {"cmd": "recall", "query": "...", "limit": 10}
|
|
12
|
-
Response: {"ok": true, "results": [...], "query_type": "...", ...}
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import json
|
|
20
|
-
import os
|
|
21
|
-
import signal
|
|
22
|
-
import sys
|
|
23
|
-
|
|
24
|
-
# Force CPU BEFORE any torch import
|
|
25
|
-
os.environ["CUDA_VISIBLE_DEVICES"] = ""
|
|
26
|
-
os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"] = "0.0"
|
|
27
|
-
os.environ["PYTORCH_MPS_MEM_LIMIT"] = "0"
|
|
28
|
-
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
|
|
29
|
-
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
|
30
|
-
os.environ["TORCH_DEVICE"] = "cpu"
|
|
31
|
-
# V3.4.37: Disable CoreML EP — uses 3-5GB on ARM64 Mac.
|
|
32
|
-
os.environ["ORT_DISABLE_COREML"] = "1"
|
|
33
|
-
|
|
34
|
-
# SIGTERM bridge: Docker/systemd send SIGTERM to stop processes.
|
|
35
|
-
# Without this, the worker ignores SIGTERM and becomes a zombie.
|
|
36
|
-
if sys.platform != "win32":
|
|
37
|
-
signal.signal(signal.SIGTERM, lambda *_: sys.exit(0))
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def _start_parent_watchdog() -> None:
|
|
41
|
-
"""Monitor parent process — self-terminate if parent dies.
|
|
42
|
-
|
|
43
|
-
V3.4.24: Delegates to platform_utils.start_parent_watchdog().
|
|
44
|
-
"""
|
|
45
|
-
from superlocalmemory.core.platform_utils import start_parent_watchdog
|
|
46
|
-
start_parent_watchdog()
|
|
47
|
-
|
|
48
|
-
_engine = None
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def _get_engine():
|
|
52
|
-
global _engine
|
|
53
|
-
if _engine is None:
|
|
54
|
-
from superlocalmemory.core.config import SLMConfig
|
|
55
|
-
from superlocalmemory.core.engine import MemoryEngine
|
|
56
|
-
config = SLMConfig.load()
|
|
57
|
-
_engine = MemoryEngine(config)
|
|
58
|
-
_engine.initialize()
|
|
59
|
-
return _engine
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def _handle_recall(
|
|
63
|
-
query: str, limit: int, session_id: str = "", fast: bool = False,
|
|
64
|
-
include_global: bool | None = None, include_shared: bool | None = None,
|
|
65
|
-
window: str | None = None,
|
|
66
|
-
as_of: str | None = None,
|
|
67
|
-
known_as_of: str | None = None,
|
|
68
|
-
valid_at: str | None = None,
|
|
69
|
-
include_unknown: bool = False,
|
|
70
|
-
) -> dict:
|
|
71
|
-
engine = _get_engine()
|
|
72
|
-
# v3.6.15 multi-scope: None flags let engine.recall resolve the configured
|
|
73
|
-
# default (shared-off). The subprocess loads its own SLMConfig, so the
|
|
74
|
-
# resolution is identical to the in-process / daemon paths.
|
|
75
|
-
response = engine.recall(
|
|
76
|
-
query, limit=limit, session_id=session_id or None, fast=bool(fast),
|
|
77
|
-
include_global=include_global, include_shared=include_shared,
|
|
78
|
-
window=window or None,
|
|
79
|
-
as_of=as_of or None,
|
|
80
|
-
known_as_of=known_as_of or None,
|
|
81
|
-
valid_at=valid_at or None,
|
|
82
|
-
include_unknown=include_unknown,
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
# Batch-fetch original memory text for all results. Retrieval already
|
|
86
|
-
# enforced scope, so resolve content for everything it returned (own +
|
|
87
|
-
# global + shared-with-me); another tenant's PRIVATE content still can't
|
|
88
|
-
# resolve. Using the raw (possibly-None) recall flags here would drop
|
|
89
|
-
# content for legitimately-recalled global/shared memories.
|
|
90
|
-
memory_ids = list({r.fact.memory_id for r in response.results[:limit] if r.fact.memory_id})
|
|
91
|
-
memory_map = engine._db.get_memory_content_batch(
|
|
92
|
-
memory_ids, engine.profile_id,
|
|
93
|
-
include_global=True, include_shared=True,
|
|
94
|
-
) if memory_ids else {}
|
|
95
|
-
|
|
96
|
-
# v3.6.6: same shared chokepoint as the daemon HTTP route + CLI fallback,
|
|
97
|
-
# so the MCP WorkerPool subprocess path returns identical budgeted output.
|
|
98
|
-
from superlocalmemory.server.recall_serializer import (
|
|
99
|
-
recall_response_metadata,
|
|
100
|
-
serialize_recall_response,
|
|
101
|
-
)
|
|
102
|
-
_rc = getattr(engine._config, "retrieval", None)
|
|
103
|
-
results, no_confident_match = serialize_recall_response(
|
|
104
|
-
response,
|
|
105
|
-
limit=limit,
|
|
106
|
-
memory_map=memory_map,
|
|
107
|
-
per_fact_max=getattr(_rc, "recall_per_fact_max_chars", 2400),
|
|
108
|
-
total_max=getattr(_rc, "recall_total_max_chars", 12000),
|
|
109
|
-
# Markers only on session-bearing recalls: a marker exists to let a
|
|
110
|
-
# downstream reference be traced back to the recall that produced it,
|
|
111
|
-
# and only a session-bearing recall has something to trace back to.
|
|
112
|
-
# (An earlier comment here justified the condition by a
|
|
113
|
-
# ``pending_outcomes`` row that no code path writes; settlement reads
|
|
114
|
-
# the evidence recorded with the play instead.)
|
|
115
|
-
include_marker=bool(session_id),
|
|
116
|
-
)
|
|
117
|
-
return {
|
|
118
|
-
"ok": True,
|
|
119
|
-
"query": query,
|
|
120
|
-
"query_type": response.query_type,
|
|
121
|
-
"result_count": len(results),
|
|
122
|
-
"retrieval_time_ms": round(response.retrieval_time_ms, 1),
|
|
123
|
-
"channel_weights": {
|
|
124
|
-
k: round(v, 3) for k, v in (response.channel_weights or {}).items()
|
|
125
|
-
},
|
|
126
|
-
"total_candidates": getattr(response, "total_candidates", 0),
|
|
127
|
-
"results": results,
|
|
128
|
-
"no_confident_match": no_confident_match,
|
|
129
|
-
**recall_response_metadata(response),
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
def _handle_store(content: str, metadata: dict) -> dict:
|
|
134
|
-
engine = _get_engine()
|
|
135
|
-
values = dict(metadata or {})
|
|
136
|
-
session_id = str(values.pop("session_id", "") or "")
|
|
137
|
-
scope = str(values.pop("scope", "personal") or "personal")
|
|
138
|
-
shared_with = list(values.pop("shared_with", []) or [])
|
|
139
|
-
idempotency_key = str(values.pop("idempotency_key", "") or "")
|
|
140
|
-
from superlocalmemory.core.engine_ingestion import (
|
|
141
|
-
canonical_store,
|
|
142
|
-
local_trusted_actor_id,
|
|
143
|
-
)
|
|
144
|
-
operation = canonical_store(
|
|
145
|
-
engine,
|
|
146
|
-
content,
|
|
147
|
-
source_type="mcp-offline-worker",
|
|
148
|
-
trusted_actor_id=local_trusted_actor_id("recall-worker"),
|
|
149
|
-
metadata=values,
|
|
150
|
-
scope=scope,
|
|
151
|
-
shared_with=shared_with,
|
|
152
|
-
session_id=session_id,
|
|
153
|
-
idempotency_key=idempotency_key,
|
|
154
|
-
return_receipt=True,
|
|
155
|
-
)
|
|
156
|
-
if hasattr(operation, "fact_ids"):
|
|
157
|
-
fact_ids = list(operation.fact_ids)
|
|
158
|
-
operation_id = getattr(operation, "operation_id", None)
|
|
159
|
-
materialization_state = getattr(
|
|
160
|
-
getattr(operation, "state", None), "value", "complete"
|
|
161
|
-
)
|
|
162
|
-
else:
|
|
163
|
-
fact_ids = list(operation)
|
|
164
|
-
operation_id = None
|
|
165
|
-
materialization_state = "complete"
|
|
166
|
-
|
|
167
|
-
# Generate and persist summary immediately after store (Mode A heuristic, B/C LLM)
|
|
168
|
-
if fact_ids:
|
|
169
|
-
try:
|
|
170
|
-
from superlocalmemory.core.summarizer import Summarizer
|
|
171
|
-
summarizer = Summarizer(engine._config)
|
|
172
|
-
summary = summarizer.summarize_cluster([{"content": content}])
|
|
173
|
-
if summary:
|
|
174
|
-
# Get the memory_id from the first stored fact
|
|
175
|
-
rows = engine._db.execute(
|
|
176
|
-
"SELECT memory_id FROM atomic_facts WHERE fact_id = ? LIMIT 1",
|
|
177
|
-
(fact_ids[0],),
|
|
178
|
-
)
|
|
179
|
-
if rows:
|
|
180
|
-
memory_id = dict(rows[0])["memory_id"]
|
|
181
|
-
engine._db.update_memory_summary(memory_id, summary)
|
|
182
|
-
except Exception:
|
|
183
|
-
pass # Summary is non-critical
|
|
184
|
-
|
|
185
|
-
pending = materialization_state != "complete"
|
|
186
|
-
return {
|
|
187
|
-
"ok": True,
|
|
188
|
-
"fact_ids": fact_ids,
|
|
189
|
-
"count": len(fact_ids),
|
|
190
|
-
"operation_id": operation_id,
|
|
191
|
-
"pending_id": operation_id if pending else None,
|
|
192
|
-
"materialization_state": materialization_state,
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
def _handle_get_memory_facts(memory_id: str) -> dict:
|
|
197
|
-
engine = _get_engine()
|
|
198
|
-
pid = engine.profile_id
|
|
199
|
-
# Get original memory content (C4: tenant-scoped; global/shared resolvable)
|
|
200
|
-
mem_map = engine._db.get_memory_content_batch(
|
|
201
|
-
[memory_id], pid, include_global=True, include_shared=True,
|
|
202
|
-
)
|
|
203
|
-
original = mem_map.get(memory_id, "")
|
|
204
|
-
# Get child facts — same scope as the content fetch so a shared/global
|
|
205
|
-
# memory's facts are not silently empty.
|
|
206
|
-
facts = engine._db.get_facts_by_memory_id(
|
|
207
|
-
memory_id, pid, include_global=True, include_shared=True)
|
|
208
|
-
fact_list = []
|
|
209
|
-
for f in facts:
|
|
210
|
-
fact_list.append({
|
|
211
|
-
"fact_id": f.fact_id,
|
|
212
|
-
"content": f.content,
|
|
213
|
-
"fact_type": f.fact_type.value if hasattr(f.fact_type, 'value') else str(f.fact_type),
|
|
214
|
-
"confidence": round(f.confidence, 3),
|
|
215
|
-
"created_at": f.created_at,
|
|
216
|
-
})
|
|
217
|
-
return {
|
|
218
|
-
"ok": True,
|
|
219
|
-
"memory_id": memory_id,
|
|
220
|
-
"original_content": original,
|
|
221
|
-
"facts": fact_list,
|
|
222
|
-
"fact_count": len(fact_list),
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def _handle_delete_memory(
|
|
227
|
-
fact_id: str,
|
|
228
|
-
source_agent_id: str = "system",
|
|
229
|
-
) -> dict:
|
|
230
|
-
"""Delete a fact after capability-derived authorization."""
|
|
231
|
-
engine = _get_engine()
|
|
232
|
-
from superlocalmemory.core.engine_ingestion import local_trusted_actor_id
|
|
233
|
-
from superlocalmemory.core.mutations import delete_fact_authorized
|
|
234
|
-
|
|
235
|
-
return delete_fact_authorized(
|
|
236
|
-
engine,
|
|
237
|
-
fact_id,
|
|
238
|
-
trusted_actor_id=local_trusted_actor_id("recall-worker"),
|
|
239
|
-
source_agent_id=source_agent_id,
|
|
240
|
-
)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
def _handle_update_memory(
|
|
244
|
-
fact_id: str,
|
|
245
|
-
content: str,
|
|
246
|
-
source_agent_id: str = "system",
|
|
247
|
-
) -> dict:
|
|
248
|
-
"""Update a fact after capability-derived authorization.
|
|
249
|
-
|
|
250
|
-
CORRECTIONS CANNOT BE PERFORMED FROM THIS WORKER, AND THAT IS BY DESIGN.
|
|
251
|
-
|
|
252
|
-
Since corrections became a review-gated lifecycle (M042) rather than an
|
|
253
|
-
in-place edit, update_fact_authorized() requires a canonical correction
|
|
254
|
-
writer. That writer is the daemon's single-writer mutation boundary
|
|
255
|
-
(CanonicalRememberRuntime, owned by unified_daemon and handed to the HTTP
|
|
256
|
-
route). A worker subprocess cannot own it: CanonicalRememberRuntime.ready
|
|
257
|
-
requires a live worker of its own, so constructing one here would nest
|
|
258
|
-
worker processes and hand a second writer the ownership context that is
|
|
259
|
-
supposed to be exclusive.
|
|
260
|
-
|
|
261
|
-
Previously this called through anyway, and mutations.py answered
|
|
262
|
-
"canonical correction writer is temporarily unavailable" with
|
|
263
|
-
retryable=True. Nothing about it was temporary — with the daemon down that
|
|
264
|
-
path can NEVER succeed, so a caller could retry forever. This is the
|
|
265
|
-
honest, non-retryable answer with the actual remedy: the daemon-backed
|
|
266
|
-
route (used automatically whenever the daemon is running) does support
|
|
267
|
-
corrections.
|
|
268
|
-
"""
|
|
269
|
-
return {
|
|
270
|
-
"ok": False,
|
|
271
|
-
"retryable": False,
|
|
272
|
-
"error": (
|
|
273
|
-
"Corrections are review-gated and require the SuperLocalMemory "
|
|
274
|
-
"daemon, which owns the single correction writer. Start it with "
|
|
275
|
-
"`slm serve start` and retry — updates route through the daemon "
|
|
276
|
-
"automatically when it is running."
|
|
277
|
-
),
|
|
278
|
-
"remedy": "slm serve start",
|
|
279
|
-
"fact_id": fact_id,
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
def _handle_summarize(texts: list[str], mode: str) -> dict:
|
|
284
|
-
"""Generate summary using heuristic (A) or LLM (B/C)."""
|
|
285
|
-
from superlocalmemory.core.summarizer import Summarizer
|
|
286
|
-
engine = _get_engine()
|
|
287
|
-
summarizer = Summarizer(engine._config)
|
|
288
|
-
summary = summarizer.summarize_cluster(
|
|
289
|
-
[{"content": t} for t in texts],
|
|
290
|
-
)
|
|
291
|
-
return {"ok": True, "summary": summary}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
def _handle_synthesize(query: str, facts: list[dict]) -> dict:
|
|
295
|
-
"""Generate synthesized answer from query + facts."""
|
|
296
|
-
from superlocalmemory.core.summarizer import Summarizer
|
|
297
|
-
engine = _get_engine()
|
|
298
|
-
summarizer = Summarizer(engine._config)
|
|
299
|
-
synthesis = summarizer.synthesize_answer(query, facts)
|
|
300
|
-
return {"ok": True, "synthesis": synthesis}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
def _handle_status() -> dict:
|
|
304
|
-
engine = _get_engine()
|
|
305
|
-
pid = engine.profile_id
|
|
306
|
-
fact_count = engine._db.get_fact_count(pid)
|
|
307
|
-
return {
|
|
308
|
-
"ok": True,
|
|
309
|
-
"mode": engine._config.mode.value,
|
|
310
|
-
"profile": pid,
|
|
311
|
-
"fact_count": fact_count,
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
def _worker_main() -> None:
|
|
316
|
-
"""Main loop: read JSON requests from stdin, write responses to stdout."""
|
|
317
|
-
_start_parent_watchdog()
|
|
318
|
-
from superlocalmemory.core.platform_utils import get_rss_mb
|
|
319
|
-
|
|
320
|
-
for line in sys.stdin:
|
|
321
|
-
line = line.strip()
|
|
322
|
-
if not line:
|
|
323
|
-
continue
|
|
324
|
-
try:
|
|
325
|
-
req = json.loads(line)
|
|
326
|
-
except json.JSONDecodeError:
|
|
327
|
-
_respond({"ok": False, "error": "Invalid JSON"})
|
|
328
|
-
continue
|
|
329
|
-
|
|
330
|
-
cmd = req.get("cmd", "")
|
|
331
|
-
|
|
332
|
-
if cmd == "quit":
|
|
333
|
-
break
|
|
334
|
-
|
|
335
|
-
if cmd == "ping":
|
|
336
|
-
_respond({"ok": True})
|
|
337
|
-
continue
|
|
338
|
-
|
|
339
|
-
if cmd == "warmup":
|
|
340
|
-
# Pre-load engine + database + embeddings only.
|
|
341
|
-
# V3.3.2: Do NOT run a dummy recall — it triggers the ONNX
|
|
342
|
-
# cross-encoder export (~30s) which combined with engine init
|
|
343
|
-
# exceeds the worker timeout. The cross-encoder loads lazily
|
|
344
|
-
# in a background thread on the first real recall instead.
|
|
345
|
-
try:
|
|
346
|
-
engine = _get_engine()
|
|
347
|
-
fact_count = engine._db.get_fact_count(engine._profile_id) if engine._db else 0
|
|
348
|
-
_respond({"ok": True, "message": "Engine warm", "facts": fact_count})
|
|
349
|
-
except Exception as exc:
|
|
350
|
-
_respond({"ok": False, "error": f"Warmup failed: {exc}"})
|
|
351
|
-
continue
|
|
352
|
-
|
|
353
|
-
try:
|
|
354
|
-
if cmd == "recall":
|
|
355
|
-
result = _handle_recall(
|
|
356
|
-
req.get("query", ""), req.get("limit", 10),
|
|
357
|
-
req.get("session_id", ""), bool(req.get("fast", False)),
|
|
358
|
-
include_global=req.get("include_global"),
|
|
359
|
-
include_shared=req.get("include_shared"),
|
|
360
|
-
window=req.get("window"),
|
|
361
|
-
as_of=req.get("as_of"),
|
|
362
|
-
known_as_of=req.get("known_as_of"),
|
|
363
|
-
valid_at=req.get("valid_at"),
|
|
364
|
-
include_unknown=bool(req.get("include_unknown", False)),
|
|
365
|
-
)
|
|
366
|
-
_respond(result)
|
|
367
|
-
elif cmd == "store":
|
|
368
|
-
result = _handle_store(req.get("content", ""), req.get("metadata", {}))
|
|
369
|
-
_respond(result)
|
|
370
|
-
elif cmd == "delete_memory":
|
|
371
|
-
result = _handle_delete_memory(
|
|
372
|
-
req.get("fact_id", ""),
|
|
373
|
-
req.get("source_agent_id", req.get("agent_id", "system")),
|
|
374
|
-
)
|
|
375
|
-
_respond(result)
|
|
376
|
-
elif cmd == "update_memory":
|
|
377
|
-
result = _handle_update_memory(
|
|
378
|
-
req.get("fact_id", ""),
|
|
379
|
-
req.get("content", ""),
|
|
380
|
-
req.get("source_agent_id", req.get("agent_id", "system")),
|
|
381
|
-
)
|
|
382
|
-
_respond(result)
|
|
383
|
-
elif cmd == "get_memory_facts":
|
|
384
|
-
result = _handle_get_memory_facts(req.get("memory_id", ""))
|
|
385
|
-
_respond(result)
|
|
386
|
-
elif cmd == "summarize":
|
|
387
|
-
result = _handle_summarize(req.get("texts", []), req.get("mode", "a"))
|
|
388
|
-
_respond(result)
|
|
389
|
-
elif cmd == "synthesize":
|
|
390
|
-
result = _handle_synthesize(req.get("query", ""), req.get("facts", []))
|
|
391
|
-
_respond(result)
|
|
392
|
-
elif cmd == "status":
|
|
393
|
-
_respond(_handle_status())
|
|
394
|
-
else:
|
|
395
|
-
_respond({"ok": False, "error": f"Unknown command: {cmd}"})
|
|
396
|
-
except Exception as exc:
|
|
397
|
-
_respond({"ok": False, "error": str(exc)})
|
|
398
|
-
|
|
399
|
-
# V3.3.16: RSS watchdog — V3.4.24: cross-platform via platform_utils.
|
|
400
|
-
rss_mb = get_rss_mb()
|
|
401
|
-
if rss_mb > 0 and rss_mb > 1500:
|
|
402
|
-
sys.exit(0)
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
def _respond(data: dict) -> None:
|
|
406
|
-
sys.stdout.write(json.dumps(data) + "\n")
|
|
407
|
-
sys.stdout.flush()
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
if __name__ == "__main__":
|
|
411
|
-
try:
|
|
412
|
-
_worker_main()
|
|
413
|
-
except KeyboardInterrupt:
|
|
414
|
-
sys.exit(0)
|
|
@@ -1,121 +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
|
-
"""Agent registry — multi-agent profile isolation.
|
|
6
|
-
|
|
7
|
-
Tracks which agents are using which profiles and prevents
|
|
8
|
-
two agents from writing to the same profile simultaneously
|
|
9
|
-
via an advisory lock mechanism. Persisted as JSON for
|
|
10
|
-
survival across process restarts.
|
|
11
|
-
|
|
12
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
13
|
-
License: AGPL-3.0-or-later
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from __future__ import annotations
|
|
17
|
-
|
|
18
|
-
import json
|
|
19
|
-
import logging
|
|
20
|
-
import time
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
from typing import Any
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class ProfileLockError(Exception):
|
|
28
|
-
"""Raised when an agent tries to write-lock an already-locked profile."""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class AgentRegistry:
|
|
32
|
-
"""In-memory agent registry with JSON file persistence.
|
|
33
|
-
|
|
34
|
-
Each agent registers with an ID and a target profile.
|
|
35
|
-
Advisory write locks prevent two agents from mutating
|
|
36
|
-
the same profile at the same time.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
def __init__(self, persist_path: Path | None = None) -> None:
|
|
40
|
-
self._agents: dict[str, dict[str, Any]] = {}
|
|
41
|
-
self._write_locks: dict[str, str] = {} # profile_id -> agent_id
|
|
42
|
-
self._path = persist_path
|
|
43
|
-
if self._path and self._path.exists():
|
|
44
|
-
self._load()
|
|
45
|
-
|
|
46
|
-
# -- Public API ---------------------------------------------------------
|
|
47
|
-
|
|
48
|
-
def register_agent(self, agent_id: str, profile_id: str) -> None:
|
|
49
|
-
"""Register an agent for a profile. Acquires advisory write lock."""
|
|
50
|
-
if agent_id in self._agents:
|
|
51
|
-
self.unregister_agent(agent_id)
|
|
52
|
-
|
|
53
|
-
holder = self._write_locks.get(profile_id)
|
|
54
|
-
if holder and holder != agent_id:
|
|
55
|
-
raise ProfileLockError(
|
|
56
|
-
f"Profile '{profile_id}' is locked by agent '{holder}'."
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
self._agents[agent_id] = {
|
|
60
|
-
"profile_id": profile_id,
|
|
61
|
-
"registered_at": time.time(),
|
|
62
|
-
}
|
|
63
|
-
self._write_locks[profile_id] = agent_id
|
|
64
|
-
self._save()
|
|
65
|
-
logger.info("Agent '%s' registered for profile '%s'", agent_id, profile_id)
|
|
66
|
-
|
|
67
|
-
def unregister_agent(self, agent_id: str) -> None:
|
|
68
|
-
"""Remove an agent and release its write lock."""
|
|
69
|
-
entry = self._agents.pop(agent_id, None)
|
|
70
|
-
if entry:
|
|
71
|
-
profile_id = entry["profile_id"]
|
|
72
|
-
if self._write_locks.get(profile_id) == agent_id:
|
|
73
|
-
del self._write_locks[profile_id]
|
|
74
|
-
self._save()
|
|
75
|
-
logger.info("Agent '%s' unregistered", agent_id)
|
|
76
|
-
|
|
77
|
-
def get_agent_profile(self, agent_id: str) -> str:
|
|
78
|
-
"""Return the profile ID for a registered agent.
|
|
79
|
-
|
|
80
|
-
Raises KeyError if the agent is not registered.
|
|
81
|
-
"""
|
|
82
|
-
entry = self._agents.get(agent_id)
|
|
83
|
-
if entry is None:
|
|
84
|
-
raise KeyError(f"Agent '{agent_id}' is not registered.")
|
|
85
|
-
return entry["profile_id"]
|
|
86
|
-
|
|
87
|
-
def list_agents(self) -> list[dict[str, Any]]:
|
|
88
|
-
"""Return a snapshot of all registered agents."""
|
|
89
|
-
return [
|
|
90
|
-
{
|
|
91
|
-
"agent_id": aid,
|
|
92
|
-
"profile_id": info["profile_id"],
|
|
93
|
-
"registered_at": info["registered_at"],
|
|
94
|
-
}
|
|
95
|
-
for aid, info in self._agents.items()
|
|
96
|
-
]
|
|
97
|
-
|
|
98
|
-
# -- Persistence --------------------------------------------------------
|
|
99
|
-
|
|
100
|
-
def _save(self) -> None:
|
|
101
|
-
if not self._path:
|
|
102
|
-
return
|
|
103
|
-
self._path.parent.mkdir(parents=True, exist_ok=True)
|
|
104
|
-
data = {"agents": self._agents, "write_locks": self._write_locks}
|
|
105
|
-
self._path.write_text(json.dumps(data, indent=2), encoding="utf-8")
|
|
106
|
-
|
|
107
|
-
def _load(self) -> None:
|
|
108
|
-
if not self._path or not self._path.exists():
|
|
109
|
-
return
|
|
110
|
-
try:
|
|
111
|
-
data = json.loads(self._path.read_text(encoding="utf-8"))
|
|
112
|
-
self._agents = data.get("agents", {})
|
|
113
|
-
# D-01: write_locks from a prior process are meaningless after a
|
|
114
|
-
# process boundary — the agents that held them are dead. Starting
|
|
115
|
-
# with no inherited locks prevents mcp_client (and any other agent)
|
|
116
|
-
# from being permanently blocked on every daemon restart.
|
|
117
|
-
self._write_locks = {}
|
|
118
|
-
except (json.JSONDecodeError, KeyError):
|
|
119
|
-
logger.warning("Corrupt registry file at %s — starting fresh.", self._path)
|
|
120
|
-
self._agents = {}
|
|
121
|
-
self._write_locks = {}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Journal-first service boundary for a durable, immediately-queryable remember."""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import math
|
|
9
|
-
import time
|
|
10
|
-
from collections.abc import Mapping
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
from typing import Any, Protocol
|
|
13
|
-
|
|
14
|
-
from superlocalmemory.storage.admission_journal import (
|
|
15
|
-
Actor,
|
|
16
|
-
AdmissionJournal,
|
|
17
|
-
AdmissionJournalUnavailable,
|
|
18
|
-
PreparedAdmission,
|
|
19
|
-
RememberRequest,
|
|
20
|
-
TerminalAdmissionError,
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class AdmissionRejected(RuntimeError):
|
|
25
|
-
"""Canonical admission was not committed; the journal records its outcome."""
|
|
26
|
-
|
|
27
|
-
def __init__(self, error_code: str, *, retryable: bool = False) -> None:
|
|
28
|
-
super().__init__(error_code)
|
|
29
|
-
self.error_code = error_code
|
|
30
|
-
self.retryable = retryable
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@dataclass(frozen=True, slots=True)
|
|
34
|
-
class RememberReceipt:
|
|
35
|
-
"""Canonical receipt returned only after admission is queryable."""
|
|
36
|
-
|
|
37
|
-
payload: dict[str, Any]
|
|
38
|
-
|
|
39
|
-
@classmethod
|
|
40
|
-
def from_mapping(cls, receipt: Mapping[str, Any]) -> RememberReceipt:
|
|
41
|
-
return cls(payload=dict(receipt))
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@dataclass(frozen=True, slots=True)
|
|
45
|
-
class RememberAdmissionCommand:
|
|
46
|
-
"""Typed foreground input for a coordinator's bounded canonical transaction."""
|
|
47
|
-
|
|
48
|
-
journal_id: str
|
|
49
|
-
request_hash: str
|
|
50
|
-
request: RememberRequest
|
|
51
|
-
profile_id: str
|
|
52
|
-
idempotency_key: str
|
|
53
|
-
|
|
54
|
-
@classmethod
|
|
55
|
-
def from_prepared(
|
|
56
|
-
cls, prepared: PreparedAdmission, request: RememberRequest
|
|
57
|
-
) -> RememberAdmissionCommand:
|
|
58
|
-
return cls(
|
|
59
|
-
journal_id=prepared.journal_id,
|
|
60
|
-
request_hash=prepared.request_hash,
|
|
61
|
-
request=request,
|
|
62
|
-
profile_id=prepared.profile_id,
|
|
63
|
-
idempotency_key=prepared.idempotency_key,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class RememberCoordinator(Protocol):
|
|
68
|
-
def submit(self, command: RememberAdmissionCommand, *, wait_ms: int) -> Any: ...
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
class RememberService:
|
|
72
|
-
"""Apply the journaling pattern without doing enrichment inside admission."""
|
|
73
|
-
|
|
74
|
-
def __init__(self, journal: AdmissionJournal, coordinator: RememberCoordinator) -> None:
|
|
75
|
-
self._journal = journal
|
|
76
|
-
self._coordinator = coordinator
|
|
77
|
-
|
|
78
|
-
def remember(
|
|
79
|
-
self, request: RememberRequest, actor: Actor, *, deadline_ms: int
|
|
80
|
-
) -> RememberReceipt:
|
|
81
|
-
if deadline_ms <= 0:
|
|
82
|
-
raise ValueError("deadline_ms must be greater than zero")
|
|
83
|
-
deadline = time.monotonic() + deadline_ms / 1_000
|
|
84
|
-
prepared = self._journal.prepare(
|
|
85
|
-
request,
|
|
86
|
-
actor,
|
|
87
|
-
deadline=deadline,
|
|
88
|
-
)
|
|
89
|
-
if prepared.original_receipt is not None:
|
|
90
|
-
return RememberReceipt.from_mapping(prepared.original_receipt)
|
|
91
|
-
if prepared.state == "rejected":
|
|
92
|
-
raise AdmissionRejected(prepared.error_code or "COMMAND_REJECTED")
|
|
93
|
-
|
|
94
|
-
command_request = self._journal.request_for(
|
|
95
|
-
prepared,
|
|
96
|
-
deadline=deadline,
|
|
97
|
-
)
|
|
98
|
-
dispatched = self._journal.mark_dispatched(
|
|
99
|
-
prepared.journal_id,
|
|
100
|
-
deadline=deadline,
|
|
101
|
-
known_prepared=prepared.state == "prepared",
|
|
102
|
-
)
|
|
103
|
-
if dispatched.original_receipt is not None:
|
|
104
|
-
return RememberReceipt.from_mapping(dispatched.original_receipt)
|
|
105
|
-
try:
|
|
106
|
-
result = self._coordinator.submit(
|
|
107
|
-
RememberAdmissionCommand.from_prepared(prepared, command_request),
|
|
108
|
-
wait_ms=_remaining_milliseconds(deadline),
|
|
109
|
-
)
|
|
110
|
-
except TerminalAdmissionError as exc:
|
|
111
|
-
self._journal.mark_rejected(
|
|
112
|
-
prepared.journal_id,
|
|
113
|
-
exc.error_code,
|
|
114
|
-
deadline=deadline,
|
|
115
|
-
)
|
|
116
|
-
raise AdmissionRejected(exc.error_code) from exc
|
|
117
|
-
state = _result_value(result, "state")
|
|
118
|
-
receipt = _result_value(result, "receipt") or {}
|
|
119
|
-
if state in {"committed", "duplicate"}:
|
|
120
|
-
if not isinstance(receipt, Mapping):
|
|
121
|
-
raise AdmissionRejected("COMMAND_REJECTED: canonical result had no receipt")
|
|
122
|
-
try:
|
|
123
|
-
committed = self._journal.mark_committed(
|
|
124
|
-
prepared.journal_id,
|
|
125
|
-
receipt,
|
|
126
|
-
deadline=deadline,
|
|
127
|
-
)
|
|
128
|
-
except AdmissionJournalUnavailable:
|
|
129
|
-
# The canonical receipt is already durable and idempotent. Do
|
|
130
|
-
# not turn that committed write into an ambiguous client
|
|
131
|
-
# failure merely because the auxiliary journal exhausted the
|
|
132
|
-
# caller's remaining budget. The dispatched record is safe for
|
|
133
|
-
# retry/replay, which will recover the same immutable receipt.
|
|
134
|
-
return RememberReceipt.from_mapping(receipt)
|
|
135
|
-
return RememberReceipt.from_mapping(committed.original_receipt or receipt)
|
|
136
|
-
|
|
137
|
-
error_code = str(_result_value(result, "error_code") or "COMMAND_REJECTED")
|
|
138
|
-
if state == "rejected":
|
|
139
|
-
self._journal.mark_rejected(
|
|
140
|
-
prepared.journal_id,
|
|
141
|
-
error_code,
|
|
142
|
-
deadline=deadline,
|
|
143
|
-
)
|
|
144
|
-
raise AdmissionRejected(error_code, retryable=state != "rejected")
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
def _result_value(result: Any, key: str) -> Any:
|
|
148
|
-
if isinstance(result, Mapping):
|
|
149
|
-
return result.get(key)
|
|
150
|
-
return getattr(result, key, None)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def _remaining_seconds(deadline: float) -> float:
|
|
154
|
-
remaining = deadline - time.monotonic()
|
|
155
|
-
if remaining <= 0:
|
|
156
|
-
raise AdmissionJournalUnavailable("remember admission deadline expired")
|
|
157
|
-
return remaining
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def _remaining_milliseconds(deadline: float) -> int:
|
|
161
|
-
return max(1, math.ceil(_remaining_seconds(deadline) * 1_000))
|