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,228 +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
|
-
"""Sliding-window rate limiter for per-agent request throttling.
|
|
5
|
-
|
|
6
|
-
Pure stdlib -- no external dependencies. Thread-safe.
|
|
7
|
-
|
|
8
|
-
Defaults (configurable via env vars):
|
|
9
|
-
SLM_RATE_LIMIT_WRITE = 100 req / window
|
|
10
|
-
SLM_RATE_LIMIT_READ = 300 req / window
|
|
11
|
-
SLM_RATE_LIMIT_WINDOW = 60 seconds
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import logging
|
|
15
|
-
import os
|
|
16
|
-
import threading
|
|
17
|
-
import time
|
|
18
|
-
from collections import defaultdict
|
|
19
|
-
from typing import Dict, List, Tuple
|
|
20
|
-
|
|
21
|
-
logger = logging.getLogger("superlocalmemory.ratelimit")
|
|
22
|
-
|
|
23
|
-
# ---------------------------------------------------------------------------
|
|
24
|
-
# Module-level defaults (overridable via environment)
|
|
25
|
-
# ---------------------------------------------------------------------------
|
|
26
|
-
WRITE_LIMIT = int(os.environ.get("SLM_RATE_LIMIT_WRITE", "100"))
|
|
27
|
-
READ_LIMIT = int(os.environ.get("SLM_RATE_LIMIT_READ", "300"))
|
|
28
|
-
WINDOW_SECONDS = int(os.environ.get("SLM_RATE_LIMIT_WINDOW", "60"))
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class RateLimiter:
|
|
32
|
-
"""Thread-safe sliding-window rate limiter.
|
|
33
|
-
|
|
34
|
-
Each *client_id* (agent name, IP, etc.) gets its own independent
|
|
35
|
-
request window. Expired timestamps are pruned lazily on every call
|
|
36
|
-
to ``allow()`` or ``is_allowed()``.
|
|
37
|
-
|
|
38
|
-
Args:
|
|
39
|
-
max_requests: Maximum requests allowed per window.
|
|
40
|
-
window_seconds: Length of the sliding window in seconds.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
def __init__(
|
|
44
|
-
self,
|
|
45
|
-
max_requests: int = 100,
|
|
46
|
-
window_seconds: int = 60,
|
|
47
|
-
) -> None:
|
|
48
|
-
self.max_requests = max_requests
|
|
49
|
-
self.window = window_seconds
|
|
50
|
-
self._requests: Dict[str, List[float]] = defaultdict(list)
|
|
51
|
-
self._lock = threading.Lock()
|
|
52
|
-
|
|
53
|
-
# ----- public API -----
|
|
54
|
-
|
|
55
|
-
def allow(self, client_id: str) -> bool:
|
|
56
|
-
"""Check **and record** a request for *client_id*.
|
|
57
|
-
|
|
58
|
-
Returns ``True`` when the request is allowed, ``False`` when the
|
|
59
|
-
client has exceeded its limit for the current window.
|
|
60
|
-
"""
|
|
61
|
-
allowed, _ = self.is_allowed(client_id)
|
|
62
|
-
return allowed
|
|
63
|
-
|
|
64
|
-
def is_allowed(self, client_id: str) -> Tuple[bool, int]:
|
|
65
|
-
"""Check and record a request.
|
|
66
|
-
|
|
67
|
-
Returns:
|
|
68
|
-
``(allowed, remaining)`` -- whether the request is permitted
|
|
69
|
-
and how many requests remain in the current window.
|
|
70
|
-
"""
|
|
71
|
-
now = time.time()
|
|
72
|
-
cutoff = now - self.window
|
|
73
|
-
|
|
74
|
-
with self._lock:
|
|
75
|
-
# Prune expired timestamps
|
|
76
|
-
self._requests[client_id] = [
|
|
77
|
-
t for t in self._requests[client_id] if t > cutoff
|
|
78
|
-
]
|
|
79
|
-
|
|
80
|
-
current = len(self._requests[client_id])
|
|
81
|
-
|
|
82
|
-
if current >= self.max_requests:
|
|
83
|
-
return False, 0
|
|
84
|
-
|
|
85
|
-
self._requests[client_id].append(now)
|
|
86
|
-
return True, self.max_requests - current - 1
|
|
87
|
-
|
|
88
|
-
def remaining(self, client_id: str) -> int:
|
|
89
|
-
"""Return how many requests *client_id* has left without recording one."""
|
|
90
|
-
now = time.time()
|
|
91
|
-
cutoff = now - self.window
|
|
92
|
-
|
|
93
|
-
with self._lock:
|
|
94
|
-
active = [t for t in self._requests.get(client_id, []) if t > cutoff]
|
|
95
|
-
return max(0, self.max_requests - len(active))
|
|
96
|
-
|
|
97
|
-
def reset(self, client_id: str) -> None:
|
|
98
|
-
"""Clear all recorded requests for *client_id*."""
|
|
99
|
-
with self._lock:
|
|
100
|
-
self._requests.pop(client_id, None)
|
|
101
|
-
|
|
102
|
-
def cleanup(self) -> int:
|
|
103
|
-
"""Remove stale entries for clients with no recent requests.
|
|
104
|
-
|
|
105
|
-
Returns:
|
|
106
|
-
Number of client entries removed.
|
|
107
|
-
"""
|
|
108
|
-
now = time.time()
|
|
109
|
-
cutoff = now - self.window * 2 # keep 2 windows of data
|
|
110
|
-
|
|
111
|
-
with self._lock:
|
|
112
|
-
stale = [
|
|
113
|
-
k
|
|
114
|
-
for k, v in self._requests.items()
|
|
115
|
-
if not v or max(v) < cutoff
|
|
116
|
-
]
|
|
117
|
-
for k in stale:
|
|
118
|
-
del self._requests[k]
|
|
119
|
-
return len(stale)
|
|
120
|
-
|
|
121
|
-
def configure(
|
|
122
|
-
self,
|
|
123
|
-
max_requests: int | None = None,
|
|
124
|
-
window_seconds: int | None = None,
|
|
125
|
-
) -> None:
|
|
126
|
-
"""Reconfigure limits at runtime (thread-safe).
|
|
127
|
-
|
|
128
|
-
Recorded request timestamps are preserved; only the ceilings change,
|
|
129
|
-
so a raised limit takes effect immediately for the current window.
|
|
130
|
-
"""
|
|
131
|
-
with self._lock:
|
|
132
|
-
if max_requests is not None:
|
|
133
|
-
self.max_requests = max(1, int(max_requests))
|
|
134
|
-
if window_seconds is not None:
|
|
135
|
-
self.window = max(1, int(window_seconds))
|
|
136
|
-
|
|
137
|
-
def get_stats(self) -> dict:
|
|
138
|
-
"""Return a snapshot of limiter state."""
|
|
139
|
-
with self._lock:
|
|
140
|
-
return {
|
|
141
|
-
"max_requests": self.max_requests,
|
|
142
|
-
"window_seconds": self.window,
|
|
143
|
-
"tracked_clients": len(self._requests),
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
# ---------------------------------------------------------------------------
|
|
148
|
-
# Module-level convenience singletons
|
|
149
|
-
# ---------------------------------------------------------------------------
|
|
150
|
-
write_limiter = RateLimiter(max_requests=WRITE_LIMIT, window_seconds=WINDOW_SECONDS)
|
|
151
|
-
read_limiter = RateLimiter(max_requests=READ_LIMIT, window_seconds=WINDOW_SECONDS)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
# ---------------------------------------------------------------------------
|
|
155
|
-
# Runtime-configurable limits (task #47) — dashboard-editable thresholds.
|
|
156
|
-
#
|
|
157
|
-
# The enforcement middleware builds its own limiter instances; it registers
|
|
158
|
-
# them here by role so a single set_limits() call reconfigures every live
|
|
159
|
-
# limiter at once (no restart). Loopback limiters derive from write/read,
|
|
160
|
-
# matching the startup derivation in unified_daemon.
|
|
161
|
-
# ---------------------------------------------------------------------------
|
|
162
|
-
|
|
163
|
-
_MANAGED: List[Tuple[str, "RateLimiter"]] = []
|
|
164
|
-
_MANAGED_LOCK = threading.Lock()
|
|
165
|
-
_CURRENT: Dict[str, int] = {
|
|
166
|
-
"write": WRITE_LIMIT, "read": READ_LIMIT, "window": WINDOW_SECONDS,
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
def _loopback_write(write: int) -> int:
|
|
171
|
-
return max(300, int(write) * 10)
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
def _loopback_read(read: int) -> int:
|
|
175
|
-
return max(2000, int(read) * 20)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def register_managed(role: str, limiter: "RateLimiter") -> None:
|
|
179
|
-
"""Register an enforcement limiter so set_limits() can reconfigure it.
|
|
180
|
-
|
|
181
|
-
role is one of: 'write', 'read', 'lb_write', 'lb_read'.
|
|
182
|
-
"""
|
|
183
|
-
with _MANAGED_LOCK:
|
|
184
|
-
_MANAGED.append((role, limiter))
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def reset_managed() -> None:
|
|
188
|
-
"""Drop all registered limiters (app teardown / test isolation)."""
|
|
189
|
-
with _MANAGED_LOCK:
|
|
190
|
-
_MANAGED.clear()
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
def get_limits() -> Dict[str, int]:
|
|
194
|
-
"""Return the current effective write/read/window limits."""
|
|
195
|
-
with _MANAGED_LOCK:
|
|
196
|
-
return dict(_CURRENT)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
def set_limits(
|
|
200
|
-
write: int | None = None,
|
|
201
|
-
read: int | None = None,
|
|
202
|
-
window: int | None = None,
|
|
203
|
-
) -> Dict[str, int]:
|
|
204
|
-
"""Update limits and reconfigure every registered limiter live.
|
|
205
|
-
|
|
206
|
-
Partial updates are supported (pass only what changes). Loopback
|
|
207
|
-
limiters re-derive from the new write/read. Returns the new effective
|
|
208
|
-
limits. Values are floored at 1.
|
|
209
|
-
"""
|
|
210
|
-
with _MANAGED_LOCK:
|
|
211
|
-
if write is not None:
|
|
212
|
-
_CURRENT["write"] = max(1, int(write))
|
|
213
|
-
if read is not None:
|
|
214
|
-
_CURRENT["read"] = max(1, int(read))
|
|
215
|
-
if window is not None:
|
|
216
|
-
_CURRENT["window"] = max(1, int(window))
|
|
217
|
-
w, r, win = _CURRENT["write"], _CURRENT["read"], _CURRENT["window"]
|
|
218
|
-
lb_w, lb_r = _loopback_write(w), _loopback_read(r)
|
|
219
|
-
for role, limiter in _MANAGED:
|
|
220
|
-
if role == "write":
|
|
221
|
-
limiter.configure(max_requests=w, window_seconds=win)
|
|
222
|
-
elif role == "read":
|
|
223
|
-
limiter.configure(max_requests=r, window_seconds=win)
|
|
224
|
-
elif role == "lb_write":
|
|
225
|
-
limiter.configure(max_requests=lb_w, window_seconds=win)
|
|
226
|
-
elif role == "lb_read":
|
|
227
|
-
limiter.configure(max_requests=lb_r, window_seconds=win)
|
|
228
|
-
return dict(_CURRENT)
|
|
@@ -1,401 +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 V4 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Boot self-heal: idempotently remove provably-dead SLM lock/PID artifacts.
|
|
6
|
-
|
|
7
|
-
H1 from the No-Deadlock Hardening Plan:
|
|
8
|
-
- Called on every daemon boot BEFORE the writer claim.
|
|
9
|
-
- Removes ONLY artifacts whose owner PID is provably dead.
|
|
10
|
-
- Never removes an artifact whose owner is a verified-live SLM process.
|
|
11
|
-
- Never kills any process — file removal only.
|
|
12
|
-
- PID-reuse safety: verifies process create_time or command-line when a PID
|
|
13
|
-
is numerically alive to avoid treating an unrelated process as ours.
|
|
14
|
-
|
|
15
|
-
H4 from the plan (mesh TTL expiry):
|
|
16
|
-
- expire_stale_mesh_locks() purges expired mesh_locks rows on boot.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import json
|
|
22
|
-
import logging
|
|
23
|
-
import os
|
|
24
|
-
import socket
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
|
|
27
|
-
logger = logging.getLogger(__name__)
|
|
28
|
-
|
|
29
|
-
# Plain-text single-PID files to check.
|
|
30
|
-
_PLAIN_PID_NAMES: tuple[str, ...] = (
|
|
31
|
-
".reranker-worker.pid",
|
|
32
|
-
".embedding.lock",
|
|
33
|
-
".config.json.lock",
|
|
34
|
-
"daemon.pid",
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
# Unix socket artifact names.
|
|
38
|
-
_SOCKET_NAMES: tuple[str, ...] = ("hook_daemon.sock",)
|
|
39
|
-
|
|
40
|
-
# SLM process fingerprints for command-line checks.
|
|
41
|
-
# Covers the main daemon, packaged CLI entry points, and all named workers.
|
|
42
|
-
_SLM_EXECUTABLE_NAMES: tuple[str, ...] = (
|
|
43
|
-
"slm",
|
|
44
|
-
"superlocalmemory",
|
|
45
|
-
"unified_daemon.py",
|
|
46
|
-
"remember_runtime.py",
|
|
47
|
-
"reranker_worker.py",
|
|
48
|
-
"embedding_worker.py",
|
|
49
|
-
"recall_worker.py",
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
# ---------------------------------------------------------------------------
|
|
54
|
-
# Low-level PID helpers (additive; reuse CLI helpers where possible)
|
|
55
|
-
# ---------------------------------------------------------------------------
|
|
56
|
-
|
|
57
|
-
def _is_pid_alive(pid: int) -> bool:
|
|
58
|
-
"""Return True iff *pid* exists in the kernel process table.
|
|
59
|
-
|
|
60
|
-
G-09: PermissionError means the process EXISTS but we cannot signal it
|
|
61
|
-
(e.g. different user). We treat it as ALIVE to avoid wrongly removing
|
|
62
|
-
a live process's artifact.
|
|
63
|
-
"""
|
|
64
|
-
try:
|
|
65
|
-
import psutil
|
|
66
|
-
return psutil.pid_exists(pid)
|
|
67
|
-
except ImportError:
|
|
68
|
-
try:
|
|
69
|
-
os.kill(pid, 0)
|
|
70
|
-
return True
|
|
71
|
-
except ProcessLookupError:
|
|
72
|
-
return False
|
|
73
|
-
except PermissionError:
|
|
74
|
-
# Process exists but we lack permission to signal it — treat as alive.
|
|
75
|
-
return True
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def _pid_create_time(pid: int) -> float | None:
|
|
79
|
-
"""Return process create_time (seconds since epoch) or None if unavailable."""
|
|
80
|
-
try:
|
|
81
|
-
import psutil
|
|
82
|
-
return psutil.Process(pid).create_time()
|
|
83
|
-
except Exception:
|
|
84
|
-
return None
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def _pid_cmdline(pid: int) -> str:
|
|
88
|
-
"""Return space-joined cmdline for *pid*, empty string on error."""
|
|
89
|
-
try:
|
|
90
|
-
import psutil
|
|
91
|
-
return " ".join(psutil.Process(pid).cmdline())
|
|
92
|
-
except Exception:
|
|
93
|
-
return ""
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
def _pid_cmdline_parts(pid: int) -> list[str]:
|
|
97
|
-
"""Return argv components for *pid*, or an empty list on failure."""
|
|
98
|
-
try:
|
|
99
|
-
import psutil
|
|
100
|
-
return [str(part) for part in psutil.Process(pid).cmdline()]
|
|
101
|
-
except Exception:
|
|
102
|
-
return []
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def _pid_is_slm(pid: int) -> bool:
|
|
106
|
-
"""Return True iff *pid* is alive AND its command line looks like an SLM process."""
|
|
107
|
-
if not _is_pid_alive(pid):
|
|
108
|
-
return False
|
|
109
|
-
argv = _pid_cmdline_parts(pid)
|
|
110
|
-
if not argv:
|
|
111
|
-
return False
|
|
112
|
-
executable = Path(argv[0]).name.lower()
|
|
113
|
-
if executable in _SLM_EXECUTABLE_NAMES:
|
|
114
|
-
return True
|
|
115
|
-
if not (executable.startswith("python") or executable.startswith("pypy")):
|
|
116
|
-
return False
|
|
117
|
-
|
|
118
|
-
# Parse interpreter arguments in order. Only a leading ``-m`` module or
|
|
119
|
-
# the first script operand can establish identity; anything after ``-c``
|
|
120
|
-
# or a script operand belongs to the executed program, not the interpreter.
|
|
121
|
-
index = 1
|
|
122
|
-
options_with_values = {"-W", "-X", "--check-hash-based-pycs"}
|
|
123
|
-
while index < len(argv):
|
|
124
|
-
part = argv[index]
|
|
125
|
-
if part == "--":
|
|
126
|
-
if index + 1 >= len(argv):
|
|
127
|
-
return False
|
|
128
|
-
return Path(argv[index + 1]).name.lower() in _SLM_EXECUTABLE_NAMES
|
|
129
|
-
if part == "-":
|
|
130
|
-
return False
|
|
131
|
-
if part == "-m":
|
|
132
|
-
if index + 1 >= len(argv):
|
|
133
|
-
return False
|
|
134
|
-
module = argv[index + 1].lower()
|
|
135
|
-
return module == "superlocalmemory" or module.startswith(
|
|
136
|
-
"superlocalmemory."
|
|
137
|
-
)
|
|
138
|
-
if part.startswith("-m") and len(part) > 2:
|
|
139
|
-
module = part[2:].lower()
|
|
140
|
-
return module == "superlocalmemory" or module.startswith(
|
|
141
|
-
"superlocalmemory."
|
|
142
|
-
)
|
|
143
|
-
if part.startswith("-c"):
|
|
144
|
-
return False
|
|
145
|
-
if part in options_with_values:
|
|
146
|
-
index += 2
|
|
147
|
-
continue
|
|
148
|
-
if part.startswith("-W") or part.startswith("-X"):
|
|
149
|
-
index += 1
|
|
150
|
-
continue
|
|
151
|
-
if part.startswith("-"):
|
|
152
|
-
index += 1
|
|
153
|
-
continue
|
|
154
|
-
return Path(part).name.lower() in _SLM_EXECUTABLE_NAMES
|
|
155
|
-
return False
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def _pid_matches_claimed_at(pid: int, claimed_at_ms: int) -> bool:
|
|
159
|
-
"""Return True iff process create_time matches *claimed_at_ms* within 300 s.
|
|
160
|
-
|
|
161
|
-
Converts the millisecond timestamp from the writer-lock JSON to seconds
|
|
162
|
-
and compares against the kernel's process-start epoch.
|
|
163
|
-
|
|
164
|
-
G-03: window widened from 10 s → 300 s. This is a SECONDARY signal only —
|
|
165
|
-
create_time mismatch alone never removes a verified-live SLM process.
|
|
166
|
-
It is only checked to detect PID reuse when the PID is alive but NOT
|
|
167
|
-
identified as SLM by _pid_is_slm().
|
|
168
|
-
"""
|
|
169
|
-
actual = _pid_create_time(pid)
|
|
170
|
-
if actual is None:
|
|
171
|
-
# psutil unavailable — cannot verify, assume matches (safe default).
|
|
172
|
-
return True
|
|
173
|
-
claimed_s = claimed_at_ms / 1000.0
|
|
174
|
-
return abs(actual - claimed_s) <= 300.0
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
# ---------------------------------------------------------------------------
|
|
178
|
-
# Per-artifact-type PID extraction
|
|
179
|
-
# ---------------------------------------------------------------------------
|
|
180
|
-
|
|
181
|
-
def _read_json_pid(path: Path) -> tuple[int | None, int | None]:
|
|
182
|
-
"""Read ``(pid, claimed_at_ms)`` from a JSON writer-lock metadata file.
|
|
183
|
-
|
|
184
|
-
The ``*.writer.lock`` files written by WriteCoordinator contain::
|
|
185
|
-
|
|
186
|
-
{"pid": N, "owner_id": "...", "claimed_at_ms": N, "database": "..."}
|
|
187
|
-
|
|
188
|
-
Returns ``(None, None)`` when the file is absent, empty, or malformed.
|
|
189
|
-
"""
|
|
190
|
-
try:
|
|
191
|
-
raw = path.read_bytes()
|
|
192
|
-
if not raw.strip():
|
|
193
|
-
return None, None
|
|
194
|
-
data = json.loads(raw)
|
|
195
|
-
pid = int(data["pid"])
|
|
196
|
-
claimed_at_ms_raw = data.get("claimed_at_ms")
|
|
197
|
-
claimed_at_ms = int(claimed_at_ms_raw) if claimed_at_ms_raw else None
|
|
198
|
-
return pid, claimed_at_ms
|
|
199
|
-
except Exception:
|
|
200
|
-
return None, None
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def _read_plain_pid(path: Path) -> int | None:
|
|
204
|
-
"""Read a plain-text (integer) PID file. Returns ``None`` on any error."""
|
|
205
|
-
try:
|
|
206
|
-
return int(path.read_text(encoding="utf-8").strip())
|
|
207
|
-
except Exception:
|
|
208
|
-
return None
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def _socket_has_listener(sock_path: Path) -> bool:
|
|
212
|
-
"""Return True iff a Unix-domain socket file has an active listener.
|
|
213
|
-
|
|
214
|
-
G-06: retry 3× with short backoff (total < 1.5 s) before returning False.
|
|
215
|
-
The daemon may be mid-bind when we check at boot; a single probe can give
|
|
216
|
-
a false-negative that causes a valid socket to be deleted.
|
|
217
|
-
|
|
218
|
-
Backoff schedule: attempt 0 (immediate), attempt 1 (+0.2 s), attempt 2 (+0.4 s).
|
|
219
|
-
Per-attempt connect timeout: 0.3 s. Total wall time ≤ 0.9 s + 0.6 s = 1.5 s.
|
|
220
|
-
"""
|
|
221
|
-
import time
|
|
222
|
-
|
|
223
|
-
_DELAYS = (0.0, 0.2, 0.4) # pre-attempt sleep seconds
|
|
224
|
-
for delay in _DELAYS:
|
|
225
|
-
if delay > 0:
|
|
226
|
-
time.sleep(delay)
|
|
227
|
-
try:
|
|
228
|
-
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
229
|
-
s.settimeout(0.3)
|
|
230
|
-
s.connect(str(sock_path))
|
|
231
|
-
s.close()
|
|
232
|
-
return True
|
|
233
|
-
except (ConnectionRefusedError, FileNotFoundError, OSError):
|
|
234
|
-
continue
|
|
235
|
-
except Exception:
|
|
236
|
-
continue
|
|
237
|
-
return False
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
# ---------------------------------------------------------------------------
|
|
241
|
-
# Safe-remove helper
|
|
242
|
-
# ---------------------------------------------------------------------------
|
|
243
|
-
|
|
244
|
-
def _safe_unlink(path: Path, report: dict, reason: str) -> None:
|
|
245
|
-
"""Remove *path* and record the result in *report*. Never raises."""
|
|
246
|
-
try:
|
|
247
|
-
path.unlink(missing_ok=True)
|
|
248
|
-
report["removed"].append({"path": str(path), "reason": reason})
|
|
249
|
-
logger.info("self_heal: removed stale artifact %s (%s)", path.name, reason)
|
|
250
|
-
except OSError as exc:
|
|
251
|
-
report["errors"].append({"path": str(path), "error": str(exc)})
|
|
252
|
-
logger.warning("self_heal: could not remove %s: %s", path, exc)
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
# ---------------------------------------------------------------------------
|
|
256
|
-
# Public API — H1
|
|
257
|
-
# ---------------------------------------------------------------------------
|
|
258
|
-
|
|
259
|
-
def reap_stale_artifacts(data_dir: Path) -> dict:
|
|
260
|
-
"""Idempotently remove SLM artifacts whose owner PID is provably dead.
|
|
261
|
-
|
|
262
|
-
Safety invariants (never violated):
|
|
263
|
-
- A live, verified SLM process's artifacts are NEVER removed.
|
|
264
|
-
- No process is ever signalled or killed; only file paths are unlinked.
|
|
265
|
-
- PID-reuse is detected and treated as a dead owner (removes the stale
|
|
266
|
-
artifact, never the live unrelated process).
|
|
267
|
-
|
|
268
|
-
Returns a report dict::
|
|
269
|
-
|
|
270
|
-
{
|
|
271
|
-
"removed": [{"path": str, "reason": str}, ...],
|
|
272
|
-
"kept": [str, ...], # paths left because owner is alive
|
|
273
|
-
"errors": [{"path": str, "error": str}, ...],
|
|
274
|
-
}
|
|
275
|
-
"""
|
|
276
|
-
report: dict = {"removed": [], "kept": [], "errors": []}
|
|
277
|
-
data_dir = Path(data_dir)
|
|
278
|
-
if not data_dir.is_dir():
|
|
279
|
-
return report
|
|
280
|
-
|
|
281
|
-
# --- JSON writer-lock metadata files (*.writer.lock) --------------------
|
|
282
|
-
# The portalocker flock is already auto-released when the holder dies;
|
|
283
|
-
# these JSON bodies are purely informational. Removing them when the
|
|
284
|
-
# recorded PID is dead or reused clears up stale metadata without
|
|
285
|
-
# affecting the actual OS advisory lock.
|
|
286
|
-
for lock_file in data_dir.glob("*.writer.lock"):
|
|
287
|
-
pid, claimed_at_ms = _read_json_pid(lock_file)
|
|
288
|
-
if pid is None:
|
|
289
|
-
# Empty or unreadable — safe to remove.
|
|
290
|
-
_safe_unlink(lock_file, report, "unreadable_metadata")
|
|
291
|
-
continue
|
|
292
|
-
if not _is_pid_alive(pid):
|
|
293
|
-
_safe_unlink(lock_file, report, "dead_owner_pid")
|
|
294
|
-
elif _pid_is_slm(pid):
|
|
295
|
-
# G-03: live AND verified SLM owner → KEEP unconditionally.
|
|
296
|
-
# create_time check is skipped — a live SLM process always wins.
|
|
297
|
-
report["kept"].append(str(lock_file))
|
|
298
|
-
elif claimed_at_ms is not None and not _pid_matches_claimed_at(pid, claimed_at_ms):
|
|
299
|
-
# Alive but NOT SLM and create_time mismatch → PID was reused.
|
|
300
|
-
_safe_unlink(lock_file, report, "pid_reused")
|
|
301
|
-
else:
|
|
302
|
-
# Alive but cmdline is not SLM → reused by an unrelated process.
|
|
303
|
-
_safe_unlink(lock_file, report, "pid_reused_non_slm")
|
|
304
|
-
|
|
305
|
-
# --- Plain-text PID files -----------------------------------------------
|
|
306
|
-
for name in _PLAIN_PID_NAMES:
|
|
307
|
-
path = data_dir / name
|
|
308
|
-
if not path.exists():
|
|
309
|
-
continue
|
|
310
|
-
pid = _read_plain_pid(path)
|
|
311
|
-
if pid is None:
|
|
312
|
-
_safe_unlink(path, report, "unreadable_pid_file")
|
|
313
|
-
continue
|
|
314
|
-
if not _is_pid_alive(pid):
|
|
315
|
-
_safe_unlink(path, report, "dead_owner_pid")
|
|
316
|
-
elif not _pid_is_slm(pid):
|
|
317
|
-
# PID alive but command is not SLM → reused by an unrelated process.
|
|
318
|
-
_safe_unlink(path, report, "pid_reused_non_slm")
|
|
319
|
-
else:
|
|
320
|
-
report["kept"].append(str(path))
|
|
321
|
-
|
|
322
|
-
# --- Unix socket artifacts -----------------------------------------------
|
|
323
|
-
for name in _SOCKET_NAMES:
|
|
324
|
-
path = data_dir / name
|
|
325
|
-
if not path.exists():
|
|
326
|
-
continue
|
|
327
|
-
if not _socket_has_listener(path):
|
|
328
|
-
_safe_unlink(path, report, "no_listener")
|
|
329
|
-
else:
|
|
330
|
-
report["kept"].append(str(path))
|
|
331
|
-
|
|
332
|
-
return report
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
# ---------------------------------------------------------------------------
|
|
336
|
-
# Public API — H4 (team-mode mesh-lock expiry)
|
|
337
|
-
# ---------------------------------------------------------------------------
|
|
338
|
-
|
|
339
|
-
_MESH_NEVER_EXPIRES = "9999-12-31T23:59:59Z"
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def expire_stale_mesh_locks(db_path: Path) -> int:
|
|
343
|
-
"""Delete expired TTL rows from ``mesh_locks`` on boot.
|
|
344
|
-
|
|
345
|
-
A row is stale iff:
|
|
346
|
-
- ``expires_at`` is not NULL,
|
|
347
|
-
- ``expires_at`` is not the legacy ``_NEVER_EXPIRES`` sentinel, and
|
|
348
|
-
- ``expires_at <= now_iso`` (i.e. the lease has elapsed).
|
|
349
|
-
|
|
350
|
-
Keeps fencing intact: only the TTL expiry gate is touched. Any row whose
|
|
351
|
-
lease is still valid is left untouched. Fail-soft — returns 0 on error
|
|
352
|
-
(e.g. if the mesh_locks table does not exist yet).
|
|
353
|
-
|
|
354
|
-
Returns the count of deleted rows.
|
|
355
|
-
"""
|
|
356
|
-
import sqlite3
|
|
357
|
-
from datetime import datetime, timezone
|
|
358
|
-
|
|
359
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
360
|
-
try:
|
|
361
|
-
conn = sqlite3.connect(str(db_path), timeout=2.0)
|
|
362
|
-
try:
|
|
363
|
-
# G-07: BEGIN IMMEDIATE prevents a concurrent write from seeing our
|
|
364
|
-
# DELETE mid-flight. On OperationalError (DB locked by another
|
|
365
|
-
# writer) we log a warning and return 0 — fail-soft, non-blocking.
|
|
366
|
-
try:
|
|
367
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
368
|
-
except sqlite3.OperationalError as _lock_exc:
|
|
369
|
-
logger.warning(
|
|
370
|
-
"expire_stale_mesh_locks: DB locked, skipping this boot: %s",
|
|
371
|
-
_lock_exc,
|
|
372
|
-
)
|
|
373
|
-
return 0
|
|
374
|
-
cur = conn.execute(
|
|
375
|
-
"DELETE FROM mesh_locks "
|
|
376
|
-
"WHERE expires_at IS NOT NULL "
|
|
377
|
-
" AND expires_at != ? "
|
|
378
|
-
" AND expires_at <= ?",
|
|
379
|
-
(_MESH_NEVER_EXPIRES, now),
|
|
380
|
-
)
|
|
381
|
-
conn.commit()
|
|
382
|
-
deleted = cur.rowcount or 0
|
|
383
|
-
if deleted:
|
|
384
|
-
logger.info(
|
|
385
|
-
"self_heal: expired %d stale mesh_lock row(s) from %s",
|
|
386
|
-
deleted, db_path.name,
|
|
387
|
-
)
|
|
388
|
-
return deleted
|
|
389
|
-
finally:
|
|
390
|
-
conn.close()
|
|
391
|
-
except Exception as exc:
|
|
392
|
-
logger.debug(
|
|
393
|
-
"expire_stale_mesh_locks: %s (table may not exist yet)", exc,
|
|
394
|
-
)
|
|
395
|
-
return 0
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
__all__ = [
|
|
399
|
-
"reap_stale_artifacts",
|
|
400
|
-
"expire_stale_mesh_locks",
|
|
401
|
-
]
|