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,338 +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
|
-
"""Enterprise-grade health monitoring for the SLM Unified Daemon.
|
|
6
|
-
|
|
7
|
-
Monitors:
|
|
8
|
-
- Global RSS budget (kill heaviest worker if over limit)
|
|
9
|
-
- Worker heartbeat (kill unresponsive workers after 60s)
|
|
10
|
-
- Structured JSON logging (daemon.json.log alongside text logs)
|
|
11
|
-
- Extensible health check registry (Phase C/D/E add checks)
|
|
12
|
-
|
|
13
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
14
|
-
License: AGPL-3.0-or-later
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import json
|
|
20
|
-
import logging
|
|
21
|
-
import os
|
|
22
|
-
import threading
|
|
23
|
-
import time
|
|
24
|
-
from datetime import datetime, timezone
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
from typing import Callable
|
|
27
|
-
|
|
28
|
-
from superlocalmemory.infra.data_root import state_path
|
|
29
|
-
|
|
30
|
-
logger = logging.getLogger("superlocalmemory.health_monitor")
|
|
31
|
-
|
|
32
|
-
# Try psutil — graceful fallback if not available
|
|
33
|
-
try:
|
|
34
|
-
import psutil
|
|
35
|
-
PSUTIL_AVAILABLE = True
|
|
36
|
-
except ImportError:
|
|
37
|
-
PSUTIL_AVAILABLE = False
|
|
38
|
-
logger.info("psutil not available — health monitoring limited")
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# ---------------------------------------------------------------------------
|
|
42
|
-
# Health Check Registry (extensible by other phases)
|
|
43
|
-
# ---------------------------------------------------------------------------
|
|
44
|
-
|
|
45
|
-
_HEALTH_CHECKS: list[Callable[[], dict]] = []
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def register_health_check(check_fn: Callable[[], dict]) -> None:
|
|
49
|
-
"""Register a health check function. Returns dict with name, status, detail."""
|
|
50
|
-
_HEALTH_CHECKS.append(check_fn)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def run_all_health_checks() -> list[dict]:
|
|
54
|
-
"""Run all registered health checks. Returns list of results."""
|
|
55
|
-
results = []
|
|
56
|
-
for check_fn in _HEALTH_CHECKS:
|
|
57
|
-
try:
|
|
58
|
-
results.append(check_fn())
|
|
59
|
-
except Exception as e:
|
|
60
|
-
results.append({
|
|
61
|
-
"name": getattr(check_fn, '__name__', 'unknown'),
|
|
62
|
-
"status": "error",
|
|
63
|
-
"detail": str(e),
|
|
64
|
-
})
|
|
65
|
-
return results
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
# ---------------------------------------------------------------------------
|
|
69
|
-
# Structured JSON Logger (additive — does NOT replace text logs)
|
|
70
|
-
# ---------------------------------------------------------------------------
|
|
71
|
-
|
|
72
|
-
_json_logger: logging.Logger | None = None
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def setup_structured_logging(log_dir: Path | None = None) -> None:
|
|
76
|
-
"""Set up JSON structured logging alongside existing text logs.
|
|
77
|
-
|
|
78
|
-
Creates a separate daemon.json.log file with RotatingFileHandler.
|
|
79
|
-
Text logs continue working unchanged.
|
|
80
|
-
"""
|
|
81
|
-
global _json_logger
|
|
82
|
-
|
|
83
|
-
log_dir = log_dir or state_path("logs")
|
|
84
|
-
log_dir.mkdir(parents=True, exist_ok=True)
|
|
85
|
-
json_log_path = log_dir / "daemon.json.log"
|
|
86
|
-
|
|
87
|
-
_json_logger = logging.getLogger("superlocalmemory.structured")
|
|
88
|
-
_json_logger.setLevel(logging.INFO)
|
|
89
|
-
_json_logger.propagate = False # Don't send to text handler
|
|
90
|
-
|
|
91
|
-
from logging.handlers import RotatingFileHandler
|
|
92
|
-
handler = RotatingFileHandler(
|
|
93
|
-
str(json_log_path), maxBytes=10 * 1024 * 1024, backupCount=5,
|
|
94
|
-
)
|
|
95
|
-
handler.setFormatter(logging.Formatter("%(message)s"))
|
|
96
|
-
_json_logger.addHandler(handler)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def log_structured(**fields) -> None:
|
|
100
|
-
"""Emit a structured JSON log entry.
|
|
101
|
-
|
|
102
|
-
Always includes: timestamp, level. Caller provides the rest.
|
|
103
|
-
Example fields: worker_pid, memory_rss_mb, operation, latency_ms, message.
|
|
104
|
-
"""
|
|
105
|
-
if _json_logger is None:
|
|
106
|
-
return
|
|
107
|
-
entry = {
|
|
108
|
-
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
109
|
-
"level": fields.pop("level", "info"),
|
|
110
|
-
**fields,
|
|
111
|
-
}
|
|
112
|
-
try:
|
|
113
|
-
_json_logger.info(json.dumps(entry, default=str))
|
|
114
|
-
except Exception:
|
|
115
|
-
pass
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
# ---------------------------------------------------------------------------
|
|
119
|
-
# Health Monitor Thread
|
|
120
|
-
# ---------------------------------------------------------------------------
|
|
121
|
-
|
|
122
|
-
class HealthMonitor:
|
|
123
|
-
"""Background thread monitoring worker health, RSS budget, heartbeats.
|
|
124
|
-
|
|
125
|
-
Self-healing: if the monitor itself crashes, it logs and retries
|
|
126
|
-
with exponential backoff (max 5 min sleep).
|
|
127
|
-
"""
|
|
128
|
-
|
|
129
|
-
# SLM worker command-line identifiers for child process filtering
|
|
130
|
-
_WORKER_IDENTIFIERS = (
|
|
131
|
-
"superlocalmemory.core.embedding_worker",
|
|
132
|
-
"superlocalmemory.core.reranker_worker",
|
|
133
|
-
"superlocalmemory.core.recall_worker",
|
|
134
|
-
)
|
|
135
|
-
# Workers that are LOAD-BEARING for recall quality — never kill these
|
|
136
|
-
# first; prefer killing the reranker (gracefully degrades) or GC instead.
|
|
137
|
-
_EMBEDDING_IDENTIFIER = "superlocalmemory.core.embedding_worker"
|
|
138
|
-
|
|
139
|
-
def __init__(
|
|
140
|
-
self,
|
|
141
|
-
global_rss_budget_mb: int = 0,
|
|
142
|
-
heartbeat_timeout_sec: int = 60,
|
|
143
|
-
check_interval_sec: int = 15,
|
|
144
|
-
enable_structured_logging: bool = True,
|
|
145
|
-
):
|
|
146
|
-
# Compute RAM-scaled default when 0 is passed (or when the caller
|
|
147
|
-
# explicitly passes 0 meaning "auto"). Floor at 2500 so low-RAM boxes
|
|
148
|
-
# keep the old conservative behaviour.
|
|
149
|
-
if global_rss_budget_mb <= 0:
|
|
150
|
-
if PSUTIL_AVAILABLE:
|
|
151
|
-
phys_mb = psutil.virtual_memory().total // (1024 * 1024)
|
|
152
|
-
global_rss_budget_mb = max(2500, int(phys_mb * 0.40))
|
|
153
|
-
else:
|
|
154
|
-
global_rss_budget_mb = 8000 # safe fallback when psutil absent
|
|
155
|
-
self._budget_mb = global_rss_budget_mb
|
|
156
|
-
self._heartbeat_timeout = heartbeat_timeout_sec
|
|
157
|
-
self._interval = check_interval_sec
|
|
158
|
-
self._enable_logging = enable_structured_logging
|
|
159
|
-
self._thread: threading.Thread | None = None
|
|
160
|
-
self._stop_event = threading.Event()
|
|
161
|
-
self._consecutive_failures = 0
|
|
162
|
-
|
|
163
|
-
def start(self) -> None:
|
|
164
|
-
"""Start the health monitor in a daemon thread."""
|
|
165
|
-
if not PSUTIL_AVAILABLE:
|
|
166
|
-
logger.warning("Health monitor disabled: psutil not installed")
|
|
167
|
-
return
|
|
168
|
-
|
|
169
|
-
if self._enable_logging:
|
|
170
|
-
setup_structured_logging()
|
|
171
|
-
|
|
172
|
-
self._thread = threading.Thread(
|
|
173
|
-
target=self._run_loop, daemon=True, name="health-monitor",
|
|
174
|
-
)
|
|
175
|
-
self._thread.start()
|
|
176
|
-
logger.info("Health monitor started (budget=%dMB, heartbeat=%ds)",
|
|
177
|
-
self._budget_mb, self._heartbeat_timeout)
|
|
178
|
-
|
|
179
|
-
# Register built-in health checks
|
|
180
|
-
register_health_check(self._check_daemon_health)
|
|
181
|
-
register_health_check(self._check_worker_health)
|
|
182
|
-
register_health_check(self._check_memory_budget)
|
|
183
|
-
|
|
184
|
-
def stop(self) -> None:
|
|
185
|
-
self._stop_event.set()
|
|
186
|
-
|
|
187
|
-
def _run_loop(self) -> None:
|
|
188
|
-
"""Main monitoring loop with self-healing."""
|
|
189
|
-
while not self._stop_event.is_set():
|
|
190
|
-
try:
|
|
191
|
-
self._check_once()
|
|
192
|
-
self._consecutive_failures = 0
|
|
193
|
-
except Exception as exc:
|
|
194
|
-
self._consecutive_failures += 1
|
|
195
|
-
backoff = min(300, 30 * self._consecutive_failures)
|
|
196
|
-
logger.error("Health check failed (%d consecutive): %s. Backoff %ds.",
|
|
197
|
-
self._consecutive_failures, exc, backoff)
|
|
198
|
-
log_structured(
|
|
199
|
-
level="error", operation="health_check",
|
|
200
|
-
message=f"Health check failed: {exc}",
|
|
201
|
-
consecutive_failures=self._consecutive_failures,
|
|
202
|
-
)
|
|
203
|
-
self._stop_event.wait(backoff)
|
|
204
|
-
continue
|
|
205
|
-
|
|
206
|
-
self._stop_event.wait(self._interval)
|
|
207
|
-
|
|
208
|
-
def _check_once(self) -> None:
|
|
209
|
-
"""Single health check cycle."""
|
|
210
|
-
proc = psutil.Process(os.getpid())
|
|
211
|
-
daemon_rss_mb = proc.memory_info().rss / (1024 * 1024)
|
|
212
|
-
|
|
213
|
-
# Find SLM worker children only (not adapters or other children)
|
|
214
|
-
children = proc.children(recursive=True)
|
|
215
|
-
slm_workers = []
|
|
216
|
-
for child in children:
|
|
217
|
-
try:
|
|
218
|
-
cmdline = " ".join(child.cmdline()).lower()
|
|
219
|
-
if any(ident in cmdline for ident in self._WORKER_IDENTIFIERS):
|
|
220
|
-
rss_mb = child.memory_info().rss / (1024 * 1024)
|
|
221
|
-
slm_workers.append({
|
|
222
|
-
"pid": child.pid,
|
|
223
|
-
"rss_mb": round(rss_mb, 1),
|
|
224
|
-
"cmdline": cmdline[:200],
|
|
225
|
-
})
|
|
226
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
227
|
-
continue
|
|
228
|
-
|
|
229
|
-
total_rss_mb = daemon_rss_mb + sum(w["rss_mb"] for w in slm_workers)
|
|
230
|
-
|
|
231
|
-
# Structured log entry
|
|
232
|
-
log_structured(
|
|
233
|
-
level="info",
|
|
234
|
-
operation="health_check",
|
|
235
|
-
memory_rss_mb=round(daemon_rss_mb, 1),
|
|
236
|
-
total_rss_mb=round(total_rss_mb, 1),
|
|
237
|
-
worker_count=len(slm_workers),
|
|
238
|
-
workers=slm_workers,
|
|
239
|
-
budget_mb=self._budget_mb,
|
|
240
|
-
)
|
|
241
|
-
|
|
242
|
-
# RSS budget enforcement — spare the embedding worker (load-bearing for
|
|
243
|
-
# recall quality). Kill the reranker first (degrades gracefully); only
|
|
244
|
-
# fall back to the embedder if it is the only worker remaining.
|
|
245
|
-
if total_rss_mb > self._budget_mb and slm_workers:
|
|
246
|
-
non_embedder = [
|
|
247
|
-
w for w in slm_workers
|
|
248
|
-
if self._EMBEDDING_IDENTIFIER not in w["cmdline"]
|
|
249
|
-
]
|
|
250
|
-
candidate = (
|
|
251
|
-
max(non_embedder, key=lambda w: w["rss_mb"])
|
|
252
|
-
if non_embedder
|
|
253
|
-
else max(slm_workers, key=lambda w: w["rss_mb"])
|
|
254
|
-
)
|
|
255
|
-
logger.warning(
|
|
256
|
-
"RSS budget exceeded (%.0fMB > %dMB). Killing worker PID %d (%.0fMB)",
|
|
257
|
-
total_rss_mb, self._budget_mb, candidate["pid"], candidate["rss_mb"],
|
|
258
|
-
)
|
|
259
|
-
log_structured(
|
|
260
|
-
level="warning",
|
|
261
|
-
operation="rss_budget_kill",
|
|
262
|
-
killed_pid=candidate["pid"],
|
|
263
|
-
killed_rss_mb=candidate["rss_mb"],
|
|
264
|
-
total_rss_mb=round(total_rss_mb, 1),
|
|
265
|
-
spared_embedder=bool(non_embedder),
|
|
266
|
-
)
|
|
267
|
-
try:
|
|
268
|
-
psutil.Process(candidate["pid"]).terminate()
|
|
269
|
-
except psutil.NoSuchProcess:
|
|
270
|
-
pass
|
|
271
|
-
|
|
272
|
-
# Heartbeat checks delegated to WorkerPool (Phase B wiring)
|
|
273
|
-
# WorkerPool tracks last_heartbeat per worker. HealthMonitor
|
|
274
|
-
# reads it here. Actual heartbeat protocol is in worker_pool.py.
|
|
275
|
-
try:
|
|
276
|
-
from superlocalmemory.core.worker_pool import WorkerPool
|
|
277
|
-
pool = WorkerPool.shared()
|
|
278
|
-
last_hb = getattr(pool, '_last_heartbeat', {})
|
|
279
|
-
now = time.monotonic()
|
|
280
|
-
for wpid, last_time in list(last_hb.items()):
|
|
281
|
-
if now - last_time > self._heartbeat_timeout:
|
|
282
|
-
logger.warning("Worker PID %d unresponsive (no heartbeat for %ds). Killing.",
|
|
283
|
-
wpid, int(now - last_time))
|
|
284
|
-
log_structured(
|
|
285
|
-
level="warning",
|
|
286
|
-
operation="heartbeat_kill",
|
|
287
|
-
worker_pid=wpid,
|
|
288
|
-
seconds_since_heartbeat=round(now - last_time),
|
|
289
|
-
)
|
|
290
|
-
try:
|
|
291
|
-
psutil.Process(wpid).terminate()
|
|
292
|
-
except psutil.NoSuchProcess:
|
|
293
|
-
pass
|
|
294
|
-
del last_hb[wpid]
|
|
295
|
-
except Exception:
|
|
296
|
-
pass # WorkerPool not initialized yet — fine
|
|
297
|
-
|
|
298
|
-
# -- Built-in health checks for registry --
|
|
299
|
-
|
|
300
|
-
def _check_daemon_health(self) -> dict:
|
|
301
|
-
if not PSUTIL_AVAILABLE:
|
|
302
|
-
return {"name": "daemon", "status": "unknown", "detail": "psutil unavailable"}
|
|
303
|
-
proc = psutil.Process(os.getpid())
|
|
304
|
-
rss_mb = proc.memory_info().rss / (1024 * 1024)
|
|
305
|
-
return {
|
|
306
|
-
"name": "daemon",
|
|
307
|
-
"status": "ok" if rss_mb < 500 else "warning",
|
|
308
|
-
"detail": f"PID {os.getpid()}, RSS {rss_mb:.0f}MB",
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
def _check_worker_health(self) -> dict:
|
|
312
|
-
try:
|
|
313
|
-
from superlocalmemory.core.worker_pool import WorkerPool
|
|
314
|
-
pool = WorkerPool.shared()
|
|
315
|
-
wpid = pool.worker_pid
|
|
316
|
-
if wpid:
|
|
317
|
-
return {"name": "workers", "status": "ok", "detail": f"Worker PID {wpid}"}
|
|
318
|
-
return {"name": "workers", "status": "warning", "detail": "No active worker"}
|
|
319
|
-
except Exception as e:
|
|
320
|
-
return {"name": "workers", "status": "error", "detail": str(e)}
|
|
321
|
-
|
|
322
|
-
def _check_memory_budget(self) -> dict:
|
|
323
|
-
if not PSUTIL_AVAILABLE:
|
|
324
|
-
return {"name": "memory", "status": "unknown", "detail": "psutil unavailable"}
|
|
325
|
-
proc = psutil.Process(os.getpid())
|
|
326
|
-
total_rss = proc.memory_info().rss
|
|
327
|
-
for child in proc.children(recursive=True):
|
|
328
|
-
try:
|
|
329
|
-
total_rss += child.memory_info().rss
|
|
330
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
331
|
-
pass
|
|
332
|
-
total_mb = total_rss / (1024 * 1024)
|
|
333
|
-
status = "ok" if total_mb < self._budget_mb else "critical"
|
|
334
|
-
return {
|
|
335
|
-
"name": "memory",
|
|
336
|
-
"status": status,
|
|
337
|
-
"detail": f"{total_mb:.0f}MB / {self._budget_mb}MB budget",
|
|
338
|
-
}
|
|
@@ -1,65 +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
|
-
"""Engine lifecycle hooks -- pre/post operation dispatch.
|
|
6
|
-
|
|
7
|
-
Pre-hooks are synchronous and can reject operations (raise exceptions).
|
|
8
|
-
Post-hooks are fire-and-forget -- errors are logged, never propagated.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from __future__ import annotations
|
|
12
|
-
|
|
13
|
-
import logging
|
|
14
|
-
from typing import Any, Callable
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class HookRegistry:
|
|
20
|
-
"""Registry for engine lifecycle hooks.
|
|
21
|
-
|
|
22
|
-
Usage:
|
|
23
|
-
registry = HookRegistry()
|
|
24
|
-
registry.register_pre("store", abac_check)
|
|
25
|
-
registry.register_pre("store", trust_gate_check)
|
|
26
|
-
registry.register_post("store", audit_log)
|
|
27
|
-
registry.register_post("store", event_bus_publish)
|
|
28
|
-
|
|
29
|
-
# In engine.store():
|
|
30
|
-
registry.run_pre("store", context) # raises if any pre-hook fails
|
|
31
|
-
# ... core operation ...
|
|
32
|
-
registry.run_post("store", context) # never raises
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
def __init__(self) -> None:
|
|
36
|
-
self._pre: dict[str, list[Callable]] = {}
|
|
37
|
-
self._post: dict[str, list[Callable]] = {}
|
|
38
|
-
|
|
39
|
-
def register_pre(self, operation: str, hook: Callable[[dict[str, Any]], None]) -> None:
|
|
40
|
-
"""Register a pre-operation hook. Hook receives context dict.
|
|
41
|
-
Hook can raise to reject the operation."""
|
|
42
|
-
self._pre.setdefault(operation, []).append(hook)
|
|
43
|
-
|
|
44
|
-
def register_post(self, operation: str, hook: Callable[[dict[str, Any]], None]) -> None:
|
|
45
|
-
"""Register a post-operation hook. Hook receives context dict.
|
|
46
|
-
Errors are logged, never propagated."""
|
|
47
|
-
self._post.setdefault(operation, []).append(hook)
|
|
48
|
-
|
|
49
|
-
def run_pre(self, operation: str, context: dict[str, Any]) -> None:
|
|
50
|
-
"""Run all pre-hooks for an operation. Raises on first failure."""
|
|
51
|
-
for hook in self._pre.get(operation, []):
|
|
52
|
-
hook(context) # Let exceptions propagate -- this is intentional
|
|
53
|
-
|
|
54
|
-
def run_post(self, operation: str, context: dict[str, Any]) -> None:
|
|
55
|
-
"""Run all post-hooks for an operation. Errors logged, never raised."""
|
|
56
|
-
for hook in self._post.get(operation, []):
|
|
57
|
-
try:
|
|
58
|
-
hook(context)
|
|
59
|
-
except Exception as exc:
|
|
60
|
-
logger.debug("Post-hook error (%s): %s", operation, exc)
|
|
61
|
-
|
|
62
|
-
def clear(self) -> None:
|
|
63
|
-
"""Remove all hooks. Useful for testing."""
|
|
64
|
-
self._pre.clear()
|
|
65
|
-
self._post.clear()
|
|
@@ -1,133 +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 — Ingest Gate (v3.6.6)
|
|
4
|
-
|
|
5
|
-
"""Ingest gate for the remember/store write path (v3.6.6 F-4).
|
|
6
|
-
|
|
7
|
-
Responsibilities:
|
|
8
|
-
1. Hard reject content > 1MB (nobody's memory is a megabyte).
|
|
9
|
-
2. Clamp content > 24000 chars to head 70% + tail 30% + truncation marker.
|
|
10
|
-
Head+tail (not head-only) preserves OPEN ITEMS that session-close facts put
|
|
11
|
-
at the END. Only pathological pastes (167KB JSON, 50KB logs) are touched;
|
|
12
|
-
normal dense memories (6-15K session handoffs) pass through intact.
|
|
13
|
-
Full original preserved in result.full_content for storage in memories table.
|
|
14
|
-
3. Prompt-template firewall: reject content matching _PROMPT_TEMPLATE_PATTERNS
|
|
15
|
-
(extends v3.6.4 remember-write-02 quality gate).
|
|
16
|
-
|
|
17
|
-
Kill-switch: SLM_INGEST_NO_GATE=1 bypasses rules 2 and 3 (but NOT the 1MB hard cap).
|
|
18
|
-
|
|
19
|
-
Usage::
|
|
20
|
-
from superlocalmemory.core.ingest_gate import apply_ingest_gate
|
|
21
|
-
result = apply_ingest_gate(content)
|
|
22
|
-
if result.rejected:
|
|
23
|
-
return {"success": False, "error": result.rejection_reason}
|
|
24
|
-
store(result.fact_content, full_content=result.full_content)
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
from __future__ import annotations
|
|
28
|
-
|
|
29
|
-
import os
|
|
30
|
-
from dataclasses import dataclass, field
|
|
31
|
-
|
|
32
|
-
# v3.6.6: clamp only pathological monsters; preserve normal dense memories.
|
|
33
|
-
# 24K chars ≈ 6K tokens — well beyond any legitimate single memory.
|
|
34
|
-
_MAX_VERBATIM_CHARS = 24000
|
|
35
|
-
_HEAD_FRACTION = 0.70 # head 70% + tail 30% so OPEN ITEMS at the end survive
|
|
36
|
-
_MAX_INGEST_BYTES = 1_048_576 # 1MB — hard cap, NOT bypassed by kill-switch
|
|
37
|
-
_TRUNCATION_MARKER = "\n…[content truncated at ingest; full text in source memory]…\n"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@dataclass
|
|
41
|
-
class IngestGateResult:
|
|
42
|
-
"""Result of applying the ingest gate to content.
|
|
43
|
-
|
|
44
|
-
fact_content: Content to store in atomic_facts.content (may be truncated).
|
|
45
|
-
full_content: Original unmodified content (for memories table storage).
|
|
46
|
-
rejected: True if content should be rejected outright.
|
|
47
|
-
rejection_reason: Human-readable reason for rejection (when rejected=True).
|
|
48
|
-
truncated: True if fact_content was head-sliced.
|
|
49
|
-
"""
|
|
50
|
-
fact_content: str
|
|
51
|
-
full_content: str
|
|
52
|
-
rejected: bool = False
|
|
53
|
-
rejection_reason: str = ""
|
|
54
|
-
truncated: bool = False
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def apply_ingest_gate(
|
|
58
|
-
content: str,
|
|
59
|
-
max_verbatim_chars: int = _MAX_VERBATIM_CHARS,
|
|
60
|
-
max_ingest_bytes: int = _MAX_INGEST_BYTES,
|
|
61
|
-
) -> IngestGateResult:
|
|
62
|
-
"""Apply the ingest quality gate to content before storing.
|
|
63
|
-
|
|
64
|
-
Returns IngestGateResult. Callers MUST check result.rejected before
|
|
65
|
-
proceeding with storage.
|
|
66
|
-
|
|
67
|
-
Kill-switch SLM_INGEST_NO_GATE=1 bypasses the verbatim size clamp and
|
|
68
|
-
template firewall but NOT the 1MB hard cap (safety boundary).
|
|
69
|
-
"""
|
|
70
|
-
gate_active = os.environ.get("SLM_INGEST_NO_GATE", "0") != "1"
|
|
71
|
-
|
|
72
|
-
# --- Hard cap: 1MB regardless of kill-switch ---
|
|
73
|
-
try:
|
|
74
|
-
byte_len = len(content.encode("utf-8", errors="replace"))
|
|
75
|
-
except Exception:
|
|
76
|
-
byte_len = len(content)
|
|
77
|
-
if byte_len > max_ingest_bytes:
|
|
78
|
-
return IngestGateResult(
|
|
79
|
-
fact_content=content,
|
|
80
|
-
full_content=content,
|
|
81
|
-
rejected=True,
|
|
82
|
-
rejection_reason=(
|
|
83
|
-
f"Content size {byte_len} bytes exceeds maximum "
|
|
84
|
-
f"{max_ingest_bytes} bytes (1MB). "
|
|
85
|
-
"Nobody's memory is a megabyte."
|
|
86
|
-
),
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
# --- Gate bypassed ---
|
|
90
|
-
if not gate_active:
|
|
91
|
-
return IngestGateResult(
|
|
92
|
-
fact_content=content,
|
|
93
|
-
full_content=content,
|
|
94
|
-
rejected=False,
|
|
95
|
-
truncated=False,
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
# --- Prompt-template firewall ---
|
|
99
|
-
# Extends the v3.6.4 remember-write-02 quality gate.
|
|
100
|
-
try:
|
|
101
|
-
from superlocalmemory.core.injection import is_prompt_template
|
|
102
|
-
if is_prompt_template(content):
|
|
103
|
-
return IngestGateResult(
|
|
104
|
-
fact_content=content,
|
|
105
|
-
full_content=content,
|
|
106
|
-
rejected=True,
|
|
107
|
-
rejection_reason=(
|
|
108
|
-
"Content matches internal prompt-template patterns "
|
|
109
|
-
"(low-quality gate). Prompt machinery must not be stored as memory."
|
|
110
|
-
),
|
|
111
|
-
)
|
|
112
|
-
except Exception:
|
|
113
|
-
pass # Defensive: gate failure must never block a store
|
|
114
|
-
|
|
115
|
-
# --- Verbatim size clamp (head 70% + tail 30%) ---
|
|
116
|
-
if len(content) > max_verbatim_chars:
|
|
117
|
-
budget = max_verbatim_chars - len(_TRUNCATION_MARKER)
|
|
118
|
-
head_len = int(budget * _HEAD_FRACTION)
|
|
119
|
-
tail_len = budget - head_len
|
|
120
|
-
fact_content = content[:head_len] + _TRUNCATION_MARKER + content[-tail_len:]
|
|
121
|
-
return IngestGateResult(
|
|
122
|
-
fact_content=fact_content,
|
|
123
|
-
full_content=content,
|
|
124
|
-
rejected=False,
|
|
125
|
-
truncated=True,
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
return IngestGateResult(
|
|
129
|
-
fact_content=content,
|
|
130
|
-
full_content=content,
|
|
131
|
-
rejected=False,
|
|
132
|
-
truncated=False,
|
|
133
|
-
)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"""Pre-admission scrub policy that removes secret material from content.
|
|
2
|
-
|
|
3
|
-
A single ordered stage that redacts secrets BEFORE content can reach any durable
|
|
4
|
-
or queryable representation (atomic facts, memory records, ingestion receipts,
|
|
5
|
-
journal, exports, backups, mesh). Unlike PII redaction — an opt-in operator
|
|
6
|
-
policy — secret scrubbing is unconditional: a credential persisted verbatim at
|
|
7
|
-
rest is always incorrect.
|
|
8
|
-
|
|
9
|
-
The detector is the ``security_primitives.redact_secrets`` redactor; this module
|
|
10
|
-
wraps it in an immutable result so callers can log the fact of redaction without
|
|
11
|
-
ever handling the secret value.
|
|
12
|
-
"""
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
from dataclasses import dataclass
|
|
16
|
-
|
|
17
|
-
from superlocalmemory.core.security_primitives import redact_secrets
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass(frozen=True, slots=True)
|
|
21
|
-
class ScrubResult:
|
|
22
|
-
"""Outcome of a pre-admission scrub. Never carries the original secret."""
|
|
23
|
-
|
|
24
|
-
content: str
|
|
25
|
-
redacted: bool
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def scrub_secrets_for_ingest(content: str) -> ScrubResult:
|
|
29
|
-
"""Redact secret material from ``content`` before durable admission.
|
|
30
|
-
|
|
31
|
-
Returns a :class:`ScrubResult` whose ``content`` is safe to persist. When
|
|
32
|
-
nothing matched, ``content`` is returned unchanged and ``redacted`` is False,
|
|
33
|
-
so the caller can keep the original object and skip a log line.
|
|
34
|
-
"""
|
|
35
|
-
if not content:
|
|
36
|
-
return ScrubResult(content=content, redacted=False)
|
|
37
|
-
scrubbed = redact_secrets(content)
|
|
38
|
-
return ScrubResult(content=scrubbed, redacted=scrubbed != content)
|