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,377 +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
|
-
"""Recall worker pool — manages subprocess lifecycle for all callers.
|
|
6
|
-
|
|
7
|
-
Single shared worker process handles requests from dashboard, MCP, CLI.
|
|
8
|
-
Serializes concurrent requests via a threading lock (one at a time to
|
|
9
|
-
avoid interleaved stdout). Worker auto-kills after idle timeout.
|
|
10
|
-
|
|
11
|
-
Usage:
|
|
12
|
-
pool = WorkerPool.shared()
|
|
13
|
-
result = pool.recall("what is X?", limit=10)
|
|
14
|
-
result = pool.store("some content", metadata={})
|
|
15
|
-
|
|
16
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import json
|
|
22
|
-
import logging
|
|
23
|
-
import os
|
|
24
|
-
import subprocess
|
|
25
|
-
import sys
|
|
26
|
-
import threading
|
|
27
|
-
import time
|
|
28
|
-
|
|
29
|
-
logger = logging.getLogger(__name__)
|
|
30
|
-
|
|
31
|
-
_IDLE_TIMEOUT = 120 # 2 min — kill worker after idle
|
|
32
|
-
_REQUEST_TIMEOUT = 120 # 120 sec per request (V3.3.2: ONNX cold start can take 30-60s)
|
|
33
|
-
_WARMUP_TIMEOUT = 180 # 3 min — first cold start: engine + ONNX export + models
|
|
34
|
-
_WORKER_RECYCLE_AFTER = 1000 # Recycle worker after N requests (C++ fragmentation prevention)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class WorkerPool:
|
|
38
|
-
"""Manages a single recall_worker subprocess with idle auto-kill.
|
|
39
|
-
|
|
40
|
-
Thread-safe: concurrent callers are serialized via lock.
|
|
41
|
-
The worker subprocess holds all heavy memory (PyTorch, engine).
|
|
42
|
-
The calling process stays at ~60 MB.
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
_instance: WorkerPool | None = None
|
|
46
|
-
_instance_lock = threading.Lock()
|
|
47
|
-
|
|
48
|
-
def __init__(self) -> None:
|
|
49
|
-
self._lock = threading.Lock()
|
|
50
|
-
self._proc: subprocess.Popen | None = None
|
|
51
|
-
self._idle_timer: threading.Timer | None = None
|
|
52
|
-
self._last_used: float = 0.0
|
|
53
|
-
self._request_count: int = 0
|
|
54
|
-
|
|
55
|
-
@classmethod
|
|
56
|
-
def shared(cls) -> WorkerPool:
|
|
57
|
-
"""Get or create the singleton worker pool."""
|
|
58
|
-
if cls._instance is None:
|
|
59
|
-
with cls._instance_lock:
|
|
60
|
-
if cls._instance is None:
|
|
61
|
-
cls._instance = cls()
|
|
62
|
-
return cls._instance
|
|
63
|
-
|
|
64
|
-
# ------------------------------------------------------------------
|
|
65
|
-
# Public API
|
|
66
|
-
# ------------------------------------------------------------------
|
|
67
|
-
|
|
68
|
-
def recall(
|
|
69
|
-
self, query: str, limit: int = 10, session_id: str = "",
|
|
70
|
-
fast: bool = False,
|
|
71
|
-
include_global: bool | None = None,
|
|
72
|
-
include_shared: bool | None = None,
|
|
73
|
-
window: str | None = None,
|
|
74
|
-
as_of: str | None = None,
|
|
75
|
-
known_as_of: str | None = None,
|
|
76
|
-
valid_at: str | None = None,
|
|
77
|
-
include_unknown: bool = False,
|
|
78
|
-
) -> dict:
|
|
79
|
-
"""Run recall in worker subprocess. Returns result dict.
|
|
80
|
-
|
|
81
|
-
``session_id`` threads through to ``engine.recall``, where it gives
|
|
82
|
-
the recall continuity with earlier turns of the same session. It does
|
|
83
|
-
NOT create an outcome row — this docstring claimed one for several
|
|
84
|
-
releases and none was ever written.
|
|
85
|
-
|
|
86
|
-
v3.6.15 multi-scope: ``include_global``/``include_shared`` are forwarded
|
|
87
|
-
to the worker (and on to ``engine.recall``). ``None`` is sent verbatim
|
|
88
|
-
so the worker-side engine resolves the configured default — shared
|
|
89
|
-
memory is opt-in.
|
|
90
|
-
"""
|
|
91
|
-
msg: dict = {
|
|
92
|
-
"cmd": "recall", "query": query, "limit": limit,
|
|
93
|
-
"session_id": session_id or "",
|
|
94
|
-
}
|
|
95
|
-
if fast is not None:
|
|
96
|
-
msg["fast"] = bool(fast)
|
|
97
|
-
if include_global is not None:
|
|
98
|
-
msg["include_global"] = bool(include_global)
|
|
99
|
-
if include_shared is not None:
|
|
100
|
-
msg["include_shared"] = bool(include_shared)
|
|
101
|
-
if window:
|
|
102
|
-
msg["window"] = window
|
|
103
|
-
if as_of:
|
|
104
|
-
msg["as_of"] = as_of
|
|
105
|
-
if known_as_of:
|
|
106
|
-
msg["known_as_of"] = known_as_of
|
|
107
|
-
if valid_at:
|
|
108
|
-
msg["valid_at"] = valid_at
|
|
109
|
-
if include_unknown:
|
|
110
|
-
msg["include_unknown"] = True
|
|
111
|
-
return self._send(msg)
|
|
112
|
-
|
|
113
|
-
def store(self, content: str, metadata: dict | None = None) -> dict:
|
|
114
|
-
"""Run store in worker subprocess. Returns result dict."""
|
|
115
|
-
return self._send({
|
|
116
|
-
"cmd": "store", "content": content,
|
|
117
|
-
"metadata": metadata or {},
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
def delete_memory(self, fact_id: str, agent_id: str = "system") -> dict:
|
|
121
|
-
"""Delete by fact ID; ``agent_id`` is untrusted audit metadata."""
|
|
122
|
-
return self._send({
|
|
123
|
-
"cmd": "delete_memory",
|
|
124
|
-
"fact_id": fact_id,
|
|
125
|
-
"source_agent_id": agent_id,
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
def update_memory(self, fact_id: str, content: str, agent_id: str = "system") -> dict:
|
|
129
|
-
"""Update content; ``agent_id`` is untrusted audit metadata."""
|
|
130
|
-
return self._send({
|
|
131
|
-
"cmd": "update_memory",
|
|
132
|
-
"fact_id": fact_id,
|
|
133
|
-
"content": content,
|
|
134
|
-
"source_agent_id": agent_id,
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
def get_memory_facts(self, memory_id: str) -> dict:
|
|
138
|
-
"""Get original memory text + child atomic facts."""
|
|
139
|
-
return self._send({"cmd": "get_memory_facts", "memory_id": memory_id})
|
|
140
|
-
|
|
141
|
-
def summarize(self, texts: list[str]) -> dict:
|
|
142
|
-
"""Generate summary from texts (heuristic in A, LLM in B/C)."""
|
|
143
|
-
return self._send({"cmd": "summarize", "texts": texts})
|
|
144
|
-
|
|
145
|
-
def synthesize(self, query: str, facts: list[dict]) -> dict:
|
|
146
|
-
"""Generate synthesized answer from query + facts."""
|
|
147
|
-
return self._send({"cmd": "synthesize", "query": query, "facts": facts})
|
|
148
|
-
|
|
149
|
-
def status(self) -> dict:
|
|
150
|
-
"""Get engine status from worker."""
|
|
151
|
-
return self._send({"cmd": "status"})
|
|
152
|
-
|
|
153
|
-
def shutdown(self) -> None:
|
|
154
|
-
"""Gracefully kill the worker."""
|
|
155
|
-
with self._lock:
|
|
156
|
-
self._kill()
|
|
157
|
-
|
|
158
|
-
def warmup(self) -> None:
|
|
159
|
-
"""Pre-spawn and warm up the worker in a background thread.
|
|
160
|
-
|
|
161
|
-
Spawns the recall_worker subprocess so that PyTorch, models, and
|
|
162
|
-
the engine are all loaded BEFORE the first user request. This
|
|
163
|
-
amortizes the 30s cold-start at dashboard/MCP startup time.
|
|
164
|
-
|
|
165
|
-
Call from startup events — non-blocking, runs in background.
|
|
166
|
-
"""
|
|
167
|
-
def _do_warmup() -> None:
|
|
168
|
-
logger.info("Worker warmup starting (background)...")
|
|
169
|
-
try:
|
|
170
|
-
result = self._send_with_timeout(
|
|
171
|
-
{"cmd": "warmup"}, timeout=_WARMUP_TIMEOUT,
|
|
172
|
-
)
|
|
173
|
-
if result.get("ok"):
|
|
174
|
-
logger.info("Worker warmup complete (engine + models ready)")
|
|
175
|
-
else:
|
|
176
|
-
logger.warning("Worker warmup returned: %s", result)
|
|
177
|
-
except Exception as exc:
|
|
178
|
-
logger.warning("Worker warmup failed: %s", exc)
|
|
179
|
-
|
|
180
|
-
t = threading.Thread(target=_do_warmup, daemon=True, name="worker-warmup")
|
|
181
|
-
t.start()
|
|
182
|
-
|
|
183
|
-
@property
|
|
184
|
-
def worker_pid(self) -> int | None:
|
|
185
|
-
"""PID of the worker process, or None if not running."""
|
|
186
|
-
if self._proc and self._proc.poll() is None:
|
|
187
|
-
return self._proc.pid
|
|
188
|
-
return None
|
|
189
|
-
|
|
190
|
-
# ------------------------------------------------------------------
|
|
191
|
-
# Internals
|
|
192
|
-
# ------------------------------------------------------------------
|
|
193
|
-
|
|
194
|
-
def _send(self, request: dict) -> dict:
|
|
195
|
-
"""Send request to worker and get response. Thread-safe.
|
|
196
|
-
|
|
197
|
-
Auto-retries once on worker death (idle timeout, crash).
|
|
198
|
-
"""
|
|
199
|
-
resp = self._send_with_timeout(request, timeout=_REQUEST_TIMEOUT)
|
|
200
|
-
if not resp.get("ok") and "Worker" in resp.get("error", ""):
|
|
201
|
-
logger.info("Auto-restarting worker after failure, retrying request")
|
|
202
|
-
resp = self._send_with_timeout(request, timeout=_REQUEST_TIMEOUT)
|
|
203
|
-
return resp
|
|
204
|
-
|
|
205
|
-
def _send_with_timeout(self, request: dict, timeout: float) -> dict:
|
|
206
|
-
"""Send request with configurable timeout. Thread-safe."""
|
|
207
|
-
with self._lock:
|
|
208
|
-
# Worker recycling: restart after N requests to prevent
|
|
209
|
-
# C++ allocator fragmentation over long-running sessions.
|
|
210
|
-
if self._request_count >= _WORKER_RECYCLE_AFTER and self._proc is not None:
|
|
211
|
-
logger.info("Recycling recall worker after %d requests", self._request_count)
|
|
212
|
-
self._kill()
|
|
213
|
-
self._request_count = 0
|
|
214
|
-
|
|
215
|
-
self._ensure_worker()
|
|
216
|
-
if self._proc is None:
|
|
217
|
-
return {"ok": False, "error": "Worker failed to start"}
|
|
218
|
-
|
|
219
|
-
req_line = json.dumps(request) + "\n"
|
|
220
|
-
try:
|
|
221
|
-
self._proc.stdin.write(req_line)
|
|
222
|
-
self._proc.stdin.flush()
|
|
223
|
-
|
|
224
|
-
# Read response with timeout using a thread.
|
|
225
|
-
# selectors/select do NOT work with pipes on Windows,
|
|
226
|
-
# so we use the same thread-based approach as EmbeddingService.
|
|
227
|
-
resp_line = self._readline_with_timeout(
|
|
228
|
-
self._proc.stdout, timeout,
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
if not resp_line:
|
|
232
|
-
logger.warning("Worker returned empty, restarting. Run 'slm doctor' to diagnose.")
|
|
233
|
-
self._kill()
|
|
234
|
-
return {"ok": False, "error": "Worker died"}
|
|
235
|
-
|
|
236
|
-
self._reset_idle_timer()
|
|
237
|
-
self._request_count += 1
|
|
238
|
-
return json.loads(resp_line)
|
|
239
|
-
|
|
240
|
-
except (BrokenPipeError, OSError, json.JSONDecodeError) as exc:
|
|
241
|
-
logger.warning("Worker communication failed: %s. Run 'slm doctor' to diagnose.", exc)
|
|
242
|
-
self._kill()
|
|
243
|
-
return {"ok": False, "error": str(exc)}
|
|
244
|
-
|
|
245
|
-
@staticmethod
|
|
246
|
-
def _readline_with_timeout(stream, timeout_seconds: float) -> str:
|
|
247
|
-
"""Read one line from *stream* with a timeout.
|
|
248
|
-
|
|
249
|
-
Prefer a deadline-driven selector poll of the stream's file descriptor
|
|
250
|
-
(POSIX pipes). That path never spawns a helper thread, so a hung
|
|
251
|
-
worker cannot leak reader threads or pin the pipe FD across timeouts.
|
|
252
|
-
A thread fallback remains only for streams without a usable fileno
|
|
253
|
-
(unit-test mocks) and for Windows, where selectors cannot wait on
|
|
254
|
-
pipes.
|
|
255
|
-
|
|
256
|
-
Returns the line read, or ``""`` on timeout / error.
|
|
257
|
-
"""
|
|
258
|
-
import selectors
|
|
259
|
-
|
|
260
|
-
timeout_seconds = max(0.0, float(timeout_seconds))
|
|
261
|
-
fd: int | None
|
|
262
|
-
try:
|
|
263
|
-
raw_fd = stream.fileno()
|
|
264
|
-
fd = raw_fd if isinstance(raw_fd, int) else None
|
|
265
|
-
except (AttributeError, OSError, ValueError, TypeError):
|
|
266
|
-
fd = None
|
|
267
|
-
|
|
268
|
-
# Windows select()/selectors only accept sockets, not subprocess pipes.
|
|
269
|
-
if fd is not None and sys.platform != "win32":
|
|
270
|
-
try:
|
|
271
|
-
with selectors.DefaultSelector() as sel:
|
|
272
|
-
sel.register(fd, selectors.EVENT_READ)
|
|
273
|
-
events = sel.select(timeout=timeout_seconds)
|
|
274
|
-
if not events:
|
|
275
|
-
return ""
|
|
276
|
-
line = stream.readline()
|
|
277
|
-
return line if line else ""
|
|
278
|
-
except (OSError, ValueError):
|
|
279
|
-
return ""
|
|
280
|
-
|
|
281
|
-
result_container: list[str] = []
|
|
282
|
-
error_container: list[Exception] = []
|
|
283
|
-
|
|
284
|
-
def _read() -> None:
|
|
285
|
-
try:
|
|
286
|
-
result_container.append(stream.readline())
|
|
287
|
-
except Exception as exc:
|
|
288
|
-
error_container.append(exc)
|
|
289
|
-
|
|
290
|
-
reader = threading.Thread(target=_read, daemon=True)
|
|
291
|
-
reader.start()
|
|
292
|
-
reader.join(timeout=timeout_seconds)
|
|
293
|
-
|
|
294
|
-
if reader.is_alive():
|
|
295
|
-
return ""
|
|
296
|
-
if error_container:
|
|
297
|
-
raise error_container[0]
|
|
298
|
-
return result_container[0] if result_container else ""
|
|
299
|
-
|
|
300
|
-
def _ensure_worker(self) -> None:
|
|
301
|
-
"""Spawn worker if not running."""
|
|
302
|
-
if self._proc is not None and self._proc.poll() is None:
|
|
303
|
-
return
|
|
304
|
-
self._proc = None
|
|
305
|
-
try:
|
|
306
|
-
env = {
|
|
307
|
-
**os.environ,
|
|
308
|
-
"CUDA_VISIBLE_DEVICES": "",
|
|
309
|
-
"PYTORCH_MPS_HIGH_WATERMARK_RATIO": "0.0",
|
|
310
|
-
"PYTORCH_MPS_MEM_LIMIT": "0",
|
|
311
|
-
"PYTORCH_ENABLE_MPS_FALLBACK": "1",
|
|
312
|
-
"TOKENIZERS_PARALLELISM": "false",
|
|
313
|
-
"TORCH_DEVICE": "cpu",
|
|
314
|
-
}
|
|
315
|
-
from superlocalmemory.core.platform_utils import popen_platform_kwargs
|
|
316
|
-
self._proc = subprocess.Popen(
|
|
317
|
-
[sys.executable, "-m", "superlocalmemory.core.recall_worker"],
|
|
318
|
-
stdin=subprocess.PIPE,
|
|
319
|
-
stdout=subprocess.PIPE,
|
|
320
|
-
stderr=subprocess.DEVNULL,
|
|
321
|
-
text=True,
|
|
322
|
-
bufsize=1,
|
|
323
|
-
env=env,
|
|
324
|
-
**popen_platform_kwargs(),
|
|
325
|
-
)
|
|
326
|
-
logger.info("Recall worker spawned (PID %d)", self._proc.pid)
|
|
327
|
-
except Exception as exc:
|
|
328
|
-
logger.error("Failed to spawn recall worker: %s. Run 'slm doctor' to diagnose. Python: %s", exc, sys.executable)
|
|
329
|
-
self._proc = None
|
|
330
|
-
|
|
331
|
-
def _kill(self) -> None:
|
|
332
|
-
"""Terminate worker. ALL memory freed to OS."""
|
|
333
|
-
if self._idle_timer is not None:
|
|
334
|
-
self._idle_timer.cancel()
|
|
335
|
-
self._idle_timer = None
|
|
336
|
-
if self._proc is not None:
|
|
337
|
-
proc = self._proc
|
|
338
|
-
pid = proc.pid
|
|
339
|
-
try:
|
|
340
|
-
proc.stdin.write('{"cmd":"quit"}\n')
|
|
341
|
-
proc.stdin.flush()
|
|
342
|
-
proc.wait(timeout=3)
|
|
343
|
-
except Exception:
|
|
344
|
-
try:
|
|
345
|
-
proc.kill()
|
|
346
|
-
proc.wait(timeout=2)
|
|
347
|
-
except Exception:
|
|
348
|
-
pass
|
|
349
|
-
# L-CONC-1: deterministically close the pipe fds rather than leaving
|
|
350
|
-
# them to GC. This releases the OS handles immediately and unblocks
|
|
351
|
-
# any orphaned _readline_with_timeout reader thread (its readline
|
|
352
|
-
# returns/raises on the closed pipe), so repeated request timeouts
|
|
353
|
-
# cannot accumulate reader threads or file descriptors. Cross-platform.
|
|
354
|
-
for stream in (proc.stdin, proc.stdout, proc.stderr):
|
|
355
|
-
try:
|
|
356
|
-
if stream is not None:
|
|
357
|
-
stream.close()
|
|
358
|
-
except Exception:
|
|
359
|
-
pass
|
|
360
|
-
self._proc = None
|
|
361
|
-
logger.info("Recall worker killed (PID %s)", pid)
|
|
362
|
-
|
|
363
|
-
def _reset_idle_timer(self) -> None:
|
|
364
|
-
"""Kill worker after 2 min of no requests."""
|
|
365
|
-
if self._idle_timer is not None:
|
|
366
|
-
self._idle_timer.cancel()
|
|
367
|
-
self._idle_timer = threading.Timer(_IDLE_TIMEOUT, self._idle_kill)
|
|
368
|
-
self._idle_timer.daemon = True
|
|
369
|
-
self._idle_timer.start()
|
|
370
|
-
self._last_used = time.time()
|
|
371
|
-
|
|
372
|
-
def _idle_kill(self) -> None:
|
|
373
|
-
"""Called by idle timer — kill worker to free memory."""
|
|
374
|
-
with self._lock:
|
|
375
|
-
if self._proc is not None:
|
|
376
|
-
logger.info("Idle timeout — killing recall worker")
|
|
377
|
-
self._kill()
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""A small, per-session set of memories that biases the next recall.
|
|
5
|
-
|
|
6
|
-
WHAT THIS IS FOR
|
|
7
|
-
----------------
|
|
8
|
-
Turn 5 of a conversation currently knows nothing about turns 1-4. Every recall
|
|
9
|
-
starts from the query alone, so a memory the user was just discussing competes
|
|
10
|
-
from scratch against every other memory in the store.
|
|
11
|
-
|
|
12
|
-
``ContextCache`` does not fix this, because it does something different: on a
|
|
13
|
-
hit it answers *instead of* searching, and on a miss it contributes nothing.
|
|
14
|
-
This module biases a search that always runs in full. The distinction is the
|
|
15
|
-
whole point — a cache replaces retrieval, a working set shapes it.
|
|
16
|
-
|
|
17
|
-
The two are complementary and both stay: the cache short-circuits an exact
|
|
18
|
-
repeat of a query before the daemon is reached, this biases the ranking of
|
|
19
|
-
every query that does reach it.
|
|
20
|
-
|
|
21
|
-
WHY SO SMALL
|
|
22
|
-
------------
|
|
23
|
-
Seven slots per session, evicting the least-activated when full. Human working
|
|
24
|
-
memory is capacity-limited to a handful of items, and the limit is what makes it
|
|
25
|
-
useful: an unbounded "everything recently seen" set would boost most of the
|
|
26
|
-
store and therefore rank nothing.
|
|
27
|
-
|
|
28
|
-
Seven is the constant this ships with. It is a starting point, not a derived
|
|
29
|
-
optimum, and ``MAX_SLOTS`` is the single place to change it.
|
|
30
|
-
|
|
31
|
-
ADMISSION IS BY RANK, NOT BY SCORE
|
|
32
|
-
----------------------------------
|
|
33
|
-
An earlier design admitted a memory when its fused score cleared 0.60. That
|
|
34
|
-
threshold is unreachable, and measurably so: reciprocal-rank fusion of *n*
|
|
35
|
-
channels caps the top score at ``n/(k+1)``, which is 0.31 at ``rrf_k=15`` and
|
|
36
|
-
0.08 at ``rrf_k=60``. Nothing would ever have been admitted, the bias would
|
|
37
|
-
never have fired, and the symptom would have been silence rather than an error.
|
|
38
|
-
(The 0.60 that does exist in retrieval is the evidence floor's semantic cosine —
|
|
39
|
-
a different quantity on a different scale.)
|
|
40
|
-
|
|
41
|
-
So admission takes the memories that were actually *shown* at the top of an
|
|
42
|
-
answer. Rank survives every rescaling the pipeline applies to scores; an
|
|
43
|
-
absolute threshold does not.
|
|
44
|
-
|
|
45
|
-
WHY A LOCK, AND NOT "THE GIL IS ENOUGH"
|
|
46
|
-
---------------------------------------
|
|
47
|
-
``admit`` reads the slot list, decides an eviction, and writes it back. That is
|
|
48
|
-
not atomic under the GIL — it spans many bytecodes, and the daemon serves
|
|
49
|
-
recalls from a thread-pool executor, so two recalls in one session genuinely
|
|
50
|
-
interleave. Without the lock, both can pass the capacity check and both append,
|
|
51
|
-
leaving eight slots in a seven-slot set. A lock acquisition costs nanoseconds
|
|
52
|
-
against a recall measured in hundreds of milliseconds.
|
|
53
|
-
|
|
54
|
-
NEVER PERSISTED
|
|
55
|
-
---------------
|
|
56
|
-
There is no table behind this and there must not be. It is ephemeral by
|
|
57
|
-
definition; persisting it would create an unbounded write per recall for state
|
|
58
|
-
whose entire value is that it is cheap.
|
|
59
|
-
"""
|
|
60
|
-
|
|
61
|
-
from __future__ import annotations
|
|
62
|
-
|
|
63
|
-
import threading
|
|
64
|
-
import time
|
|
65
|
-
from dataclasses import dataclass
|
|
66
|
-
|
|
67
|
-
__all__ = [
|
|
68
|
-
"MAX_SLOTS",
|
|
69
|
-
"WorkingMemory",
|
|
70
|
-
"discard",
|
|
71
|
-
"discard_profile",
|
|
72
|
-
"get_or_create",
|
|
73
|
-
"registry_size",
|
|
74
|
-
]
|
|
75
|
-
|
|
76
|
-
#: Slots per session. See "WHY SO SMALL" above.
|
|
77
|
-
MAX_SLOTS = 7
|
|
78
|
-
|
|
79
|
-
#: How many shown memories a single answer may offer for admission. Matches the
|
|
80
|
-
#: prefix the settlement path records as "what this query showed", so the two
|
|
81
|
-
#: notions of "what the user actually saw" cannot drift apart.
|
|
82
|
-
ADMIT_TOP_N = 5
|
|
83
|
-
|
|
84
|
-
#: A session untouched for this long is dropped. The daemon runs for weeks.
|
|
85
|
-
SESSION_IDLE_EVICT_SECS = 86_400 # 24 h
|
|
86
|
-
|
|
87
|
-
#: Hard ceiling on tracked sessions, evicting least-recently-touched first.
|
|
88
|
-
#: Age alone does not bound anything inside the first 24 hours, and a burst of
|
|
89
|
-
#: short-lived session ids is exactly the shape of an agent workload.
|
|
90
|
-
MAX_SESSIONS = 512
|
|
91
|
-
|
|
92
|
-
#: Activation halves roughly every hour of disuse.
|
|
93
|
-
_RECENCY_HALFLIFE_SECS = 3_600.0
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@dataclass(frozen=True)
|
|
97
|
-
class _Slot:
|
|
98
|
-
"""One remembered memory. Frozen, so an update is a replacement.
|
|
99
|
-
|
|
100
|
-
Immutability is not decoration here: a reader holding this object while a
|
|
101
|
-
writer updates the same memory sees either the old slot or the new one,
|
|
102
|
-
never a half-applied mix of the two.
|
|
103
|
-
"""
|
|
104
|
-
|
|
105
|
-
fact_id: str
|
|
106
|
-
hits: int
|
|
107
|
-
last_seen: float
|
|
108
|
-
|
|
109
|
-
def activation(self, now: float) -> float:
|
|
110
|
-
"""How strongly this memory is currently held.
|
|
111
|
-
|
|
112
|
-
Repetition raises it, elapsed time lowers it. The decay is a smooth
|
|
113
|
-
reciprocal rather than a step, so eviction never depends on which side
|
|
114
|
-
of a boundary a timestamp happened to land.
|
|
115
|
-
"""
|
|
116
|
-
age = max(0.0, now - self.last_seen)
|
|
117
|
-
return self.hits / (1.0 + age / _RECENCY_HALFLIFE_SECS)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
class WorkingMemory:
|
|
121
|
-
"""The working set for one (profile, session) pair."""
|
|
122
|
-
|
|
123
|
-
__slots__ = ("_lock", "_slots", "_touched_at")
|
|
124
|
-
|
|
125
|
-
def __init__(self) -> None:
|
|
126
|
-
self._lock = threading.Lock()
|
|
127
|
-
self._slots: dict[str, _Slot] = {}
|
|
128
|
-
self._touched_at = time.monotonic()
|
|
129
|
-
|
|
130
|
-
# -- mutation ----------------------------------------------------------
|
|
131
|
-
|
|
132
|
-
def admit(self, fact_ids: list[str] | tuple[str, ...]) -> None:
|
|
133
|
-
"""Offer the memories an answer just showed, best-ranked first.
|
|
134
|
-
|
|
135
|
-
Already-held memories are reinforced rather than duplicated, which is
|
|
136
|
-
what makes a memory referenced across several turns hard to evict.
|
|
137
|
-
"""
|
|
138
|
-
if not fact_ids:
|
|
139
|
-
return
|
|
140
|
-
now = time.monotonic()
|
|
141
|
-
with self._lock:
|
|
142
|
-
self._touched_at = now
|
|
143
|
-
for fact_id in fact_ids[:ADMIT_TOP_N]:
|
|
144
|
-
if not fact_id:
|
|
145
|
-
continue
|
|
146
|
-
existing = self._slots.get(fact_id)
|
|
147
|
-
self._slots[fact_id] = _Slot(
|
|
148
|
-
fact_id=fact_id,
|
|
149
|
-
hits=(existing.hits + 1) if existing else 1,
|
|
150
|
-
last_seen=now,
|
|
151
|
-
)
|
|
152
|
-
self._evict_locked(now)
|
|
153
|
-
|
|
154
|
-
def touch(self, fact_id: str) -> None:
|
|
155
|
-
"""Reinforce a memory something downstream actually used.
|
|
156
|
-
|
|
157
|
-
Stronger evidence than having been displayed, and it arrives later, so
|
|
158
|
-
it is a separate entry point rather than a flag on ``admit``. A memory
|
|
159
|
-
that is not held is not admitted by being touched: this reinforces
|
|
160
|
-
attention, it does not create it.
|
|
161
|
-
"""
|
|
162
|
-
if not fact_id:
|
|
163
|
-
return
|
|
164
|
-
now = time.monotonic()
|
|
165
|
-
with self._lock:
|
|
166
|
-
self._touched_at = now
|
|
167
|
-
existing = self._slots.get(fact_id)
|
|
168
|
-
if existing is None:
|
|
169
|
-
return
|
|
170
|
-
self._slots[fact_id] = _Slot(
|
|
171
|
-
fact_id=fact_id, hits=existing.hits + 1, last_seen=now,
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
def _evict_locked(self, now: float) -> None:
|
|
175
|
-
"""Drop the least-activated slots. Caller holds the lock."""
|
|
176
|
-
while len(self._slots) > MAX_SLOTS:
|
|
177
|
-
weakest = min(
|
|
178
|
-
self._slots.values(),
|
|
179
|
-
key=lambda s: (s.activation(now), s.last_seen, s.fact_id),
|
|
180
|
-
)
|
|
181
|
-
self._slots.pop(weakest.fact_id, None)
|
|
182
|
-
|
|
183
|
-
# -- reads -------------------------------------------------------------
|
|
184
|
-
|
|
185
|
-
def boost_set(self) -> frozenset[str]:
|
|
186
|
-
"""The memories currently held. Read by the ranking bias."""
|
|
187
|
-
with self._lock:
|
|
188
|
-
return frozenset(self._slots)
|
|
189
|
-
|
|
190
|
-
def idle_secs(self, now: float | None = None) -> float:
|
|
191
|
-
with self._lock:
|
|
192
|
-
return max(0.0, (now or time.monotonic()) - self._touched_at)
|
|
193
|
-
|
|
194
|
-
def __len__(self) -> int:
|
|
195
|
-
with self._lock:
|
|
196
|
-
return len(self._slots)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
# ---------------------------------------------------------------------------
|
|
200
|
-
# Registry
|
|
201
|
-
#
|
|
202
|
-
# Keyed by (profile_id, session_id), never by session_id alone. Two profiles in
|
|
203
|
-
# one daemon can be handed the same session id, and a shared key would let one
|
|
204
|
-
# profile's memories bias the other's answers. It also gives erasure something
|
|
205
|
-
# to erase: ``discard_profile`` can find every set belonging to a profile.
|
|
206
|
-
# ---------------------------------------------------------------------------
|
|
207
|
-
|
|
208
|
-
_REGISTRY: dict[tuple[str, str], WorkingMemory] = {}
|
|
209
|
-
_REGISTRY_LOCK = threading.Lock()
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def get_or_create(profile_id: str, session_id: str) -> WorkingMemory:
|
|
213
|
-
"""The working set for this session, creating it on first use.
|
|
214
|
-
|
|
215
|
-
Both arguments are required and neither defaults. A default ``profile_id``
|
|
216
|
-
is how two profiles end up sharing one set.
|
|
217
|
-
"""
|
|
218
|
-
key = (profile_id or "", session_id or "")
|
|
219
|
-
with _REGISTRY_LOCK:
|
|
220
|
-
_sweep_locked()
|
|
221
|
-
existing = _REGISTRY.get(key)
|
|
222
|
-
if existing is not None:
|
|
223
|
-
return existing
|
|
224
|
-
created = WorkingMemory()
|
|
225
|
-
_REGISTRY[key] = created
|
|
226
|
-
return created
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
def peek(profile_id: str, session_id: str) -> WorkingMemory | None:
|
|
230
|
-
"""The working set if one exists, without creating one.
|
|
231
|
-
|
|
232
|
-
Reading must not allocate: a bias that runs on every recall would otherwise
|
|
233
|
-
register an entry for every session id it ever sees, including those that
|
|
234
|
-
never admit anything.
|
|
235
|
-
"""
|
|
236
|
-
with _REGISTRY_LOCK:
|
|
237
|
-
return _REGISTRY.get((profile_id or "", session_id or ""))
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def discard(profile_id: str, session_id: str) -> None:
|
|
241
|
-
"""Forget one session. Called when a session closes."""
|
|
242
|
-
with _REGISTRY_LOCK:
|
|
243
|
-
_REGISTRY.pop((profile_id or "", session_id or ""), None)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
def discard_profile(profile_id: str) -> int:
|
|
247
|
-
"""Forget every session belonging to a profile. Returns the count dropped.
|
|
248
|
-
|
|
249
|
-
Called from erasure. In-process state is still the erased subject's data:
|
|
250
|
-
leaving it behind would let a deleted profile's memories bias a later
|
|
251
|
-
session that reuses its session id, which is the residue defect this
|
|
252
|
-
project has already paid for once in a search index.
|
|
253
|
-
"""
|
|
254
|
-
target = profile_id or ""
|
|
255
|
-
with _REGISTRY_LOCK:
|
|
256
|
-
doomed = [k for k in _REGISTRY if k[0] == target]
|
|
257
|
-
for key in doomed:
|
|
258
|
-
_REGISTRY.pop(key, None)
|
|
259
|
-
return len(doomed)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
def registry_size() -> int:
|
|
263
|
-
with _REGISTRY_LOCK:
|
|
264
|
-
return len(_REGISTRY)
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
def _sweep_locked() -> None:
|
|
268
|
-
"""Bound the registry by idle time and then by count. Caller holds the lock."""
|
|
269
|
-
now = time.monotonic()
|
|
270
|
-
stale = [
|
|
271
|
-
key for key, wm in _REGISTRY.items()
|
|
272
|
-
if wm.idle_secs(now) > SESSION_IDLE_EVICT_SECS
|
|
273
|
-
]
|
|
274
|
-
for key in stale:
|
|
275
|
-
_REGISTRY.pop(key, None)
|
|
276
|
-
# Trim to one below the ceiling, because the caller is about to insert.
|
|
277
|
-
# Trimming to the ceiling itself leaves the registry one over after every
|
|
278
|
-
# insertion, which is a cap that is never actually enforced. Sweeping after
|
|
279
|
-
# the insert instead would make the new entry — idle for zero seconds, tied
|
|
280
|
-
# with every other new entry — a candidate for its own eviction.
|
|
281
|
-
headroom = MAX_SESSIONS - 1
|
|
282
|
-
if len(_REGISTRY) <= headroom:
|
|
283
|
-
return
|
|
284
|
-
by_age = sorted(
|
|
285
|
-
_REGISTRY.items(), key=lambda kv: (-kv[1].idle_secs(now), kv[0]),
|
|
286
|
-
)
|
|
287
|
-
for key, _wm in by_age[: len(_REGISTRY) - headroom]:
|
|
288
|
-
_REGISTRY.pop(key, None)
|
|
File without changes
|