superlocalmemory 4.1.13 → 4.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,542 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Operational Recovery & Admin Remediation helpers (resilience slice).
|
|
5
|
-
|
|
6
|
-
Provides two primary functions used by HTTP endpoints, MCP tools, and CLI:
|
|
7
|
-
|
|
8
|
-
list_failed_operations(db_path, profile_id=None) -> dict
|
|
9
|
-
- dead_letter: ingestion ops that exhausted automatic retries (M031)
|
|
10
|
-
- degraded_manifests: completion_manifests in DEGRADED state
|
|
11
|
-
- exhausted_obligations: projection_obligations FAILED with attempts >= MAX
|
|
12
|
-
|
|
13
|
-
resolve_operation(db_path, engine, operation_id, action) -> dict
|
|
14
|
-
action ∈ {"retry", "force_reconcile", "cancel"}
|
|
15
|
-
- retry: re-enqueue a dead-lettered ingestion op via IngestionCommand.retry()
|
|
16
|
-
- force_reconcile: immediate obligation redrive (bypasses 30s throttle)
|
|
17
|
-
- cancel: mark op terminally cancelled and remove from failure surfaces
|
|
18
|
-
|
|
19
|
-
Design constraints (NON-NEGOTIABLE):
|
|
20
|
-
- No schema migration — surface via existing tables only
|
|
21
|
-
- Pure reads in list_failed_operations (no mutation)
|
|
22
|
-
- Additive & backward-compatible — healthy-path unaffected
|
|
23
|
-
- Immutable return dicts; explicit error handling; no silent swallowing
|
|
24
|
-
|
|
25
|
-
Part of SuperLocalMemory V4 | Operational Recovery
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
from __future__ import annotations
|
|
29
|
-
|
|
30
|
-
import logging
|
|
31
|
-
import sqlite3
|
|
32
|
-
import time
|
|
33
|
-
from pathlib import Path
|
|
34
|
-
from typing import Any
|
|
35
|
-
|
|
36
|
-
logger = logging.getLogger(__name__)
|
|
37
|
-
|
|
38
|
-
# Maximum automatic materialization/apply attempts (mirrors service.py + ingestion_command.py)
|
|
39
|
-
_MAX_ATTEMPTS = 10
|
|
40
|
-
|
|
41
|
-
_VALID_ACTIONS = frozenset({"retry", "force_reconcile", "cancel"})
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# ---------------------------------------------------------------------------
|
|
45
|
-
# Public API — list_failed_operations
|
|
46
|
-
# ---------------------------------------------------------------------------
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def list_failed_operations(
|
|
50
|
-
db_path: str | Path,
|
|
51
|
-
profile_id: str | None = None,
|
|
52
|
-
) -> dict[str, Any]:
|
|
53
|
-
"""Collect all failure-surface items from memory.db.
|
|
54
|
-
|
|
55
|
-
Returns an immutable-shaped dict:
|
|
56
|
-
{
|
|
57
|
-
"dead_letter": [{"category": "dead_letter", "operation_id": ..., ...}],
|
|
58
|
-
"degraded_manifests": [...],
|
|
59
|
-
"exhausted_obligations": [...],
|
|
60
|
-
"total": int,
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
Each entry carries at minimum: category, operation_id, profile_id, error/state,
|
|
64
|
-
attempts (where applicable), and when (unix epoch float).
|
|
65
|
-
|
|
66
|
-
Raises nothing — all errors are logged and returned as empty lists.
|
|
67
|
-
"""
|
|
68
|
-
db_path = Path(db_path)
|
|
69
|
-
dead_letter: list[dict] = []
|
|
70
|
-
degraded_manifests: list[dict] = []
|
|
71
|
-
exhausted_obligations: list[dict] = []
|
|
72
|
-
|
|
73
|
-
try:
|
|
74
|
-
conn = sqlite3.connect(str(db_path))
|
|
75
|
-
conn.row_factory = sqlite3.Row
|
|
76
|
-
try:
|
|
77
|
-
dead_letter = _fetch_dead_letter(conn, profile_id)
|
|
78
|
-
degraded_manifests = _fetch_degraded_manifests(conn, profile_id)
|
|
79
|
-
exhausted_obligations = _fetch_exhausted_obligations(conn, profile_id)
|
|
80
|
-
finally:
|
|
81
|
-
conn.close()
|
|
82
|
-
except Exception as exc: # noqa: BLE001
|
|
83
|
-
logger.error("list_failed_operations: DB query failed: %s", exc)
|
|
84
|
-
|
|
85
|
-
total = len(dead_letter) + len(degraded_manifests) + len(exhausted_obligations)
|
|
86
|
-
return {
|
|
87
|
-
"dead_letter": dead_letter,
|
|
88
|
-
"degraded_manifests": degraded_manifests,
|
|
89
|
-
"exhausted_obligations": exhausted_obligations,
|
|
90
|
-
"total": total,
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def _fetch_dead_letter(
|
|
95
|
-
conn: sqlite3.Connection,
|
|
96
|
-
profile_id: str | None,
|
|
97
|
-
) -> list[dict]:
|
|
98
|
-
"""Read dead_letter_operations rows (M031 table)."""
|
|
99
|
-
try:
|
|
100
|
-
if profile_id is not None:
|
|
101
|
-
rows = conn.execute(
|
|
102
|
-
"SELECT original_op_id, error, attempt_count, profile_id, "
|
|
103
|
-
"dead_lettered_at FROM dead_letter_operations WHERE profile_id = ? "
|
|
104
|
-
"ORDER BY dead_lettered_at DESC LIMIT 200",
|
|
105
|
-
(profile_id,),
|
|
106
|
-
).fetchall()
|
|
107
|
-
else:
|
|
108
|
-
rows = conn.execute(
|
|
109
|
-
"SELECT original_op_id, error, attempt_count, profile_id, "
|
|
110
|
-
"dead_lettered_at FROM dead_letter_operations "
|
|
111
|
-
"ORDER BY dead_lettered_at DESC LIMIT 200",
|
|
112
|
-
).fetchall()
|
|
113
|
-
except sqlite3.Error:
|
|
114
|
-
# Table may not exist on older DBs — fail gracefully
|
|
115
|
-
return []
|
|
116
|
-
|
|
117
|
-
result: list[dict] = []
|
|
118
|
-
for row in rows:
|
|
119
|
-
entry = {
|
|
120
|
-
"category": "dead_letter",
|
|
121
|
-
"operation_id": row["original_op_id"],
|
|
122
|
-
"error": row["error"] or "",
|
|
123
|
-
"attempts": row["attempt_count"] or 0,
|
|
124
|
-
"profile_id": row["profile_id"] or "",
|
|
125
|
-
"when": row["dead_lettered_at"],
|
|
126
|
-
"what_happened": "Ingestion failed after maximum retries — needs manual action.",
|
|
127
|
-
}
|
|
128
|
-
result.append(entry)
|
|
129
|
-
return result
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def _fetch_degraded_manifests(
|
|
133
|
-
conn: sqlite3.Connection,
|
|
134
|
-
profile_id: str | None,
|
|
135
|
-
) -> list[dict]:
|
|
136
|
-
"""Read completion_manifests rows in DEGRADED state (M033 table)."""
|
|
137
|
-
try:
|
|
138
|
-
if profile_id is not None:
|
|
139
|
-
rows = conn.execute(
|
|
140
|
-
"SELECT operation_id, profile_id, state, updated_at "
|
|
141
|
-
"FROM completion_manifests WHERE state = 'DEGRADED' AND profile_id = ? "
|
|
142
|
-
"ORDER BY updated_at DESC LIMIT 200",
|
|
143
|
-
(profile_id,),
|
|
144
|
-
).fetchall()
|
|
145
|
-
else:
|
|
146
|
-
rows = conn.execute(
|
|
147
|
-
"SELECT operation_id, profile_id, state, updated_at "
|
|
148
|
-
"FROM completion_manifests WHERE state = 'DEGRADED' "
|
|
149
|
-
"ORDER BY updated_at DESC LIMIT 200",
|
|
150
|
-
).fetchall()
|
|
151
|
-
except sqlite3.Error:
|
|
152
|
-
return []
|
|
153
|
-
|
|
154
|
-
result: list[dict] = []
|
|
155
|
-
for row in rows:
|
|
156
|
-
entry = {
|
|
157
|
-
"category": "degraded_manifest",
|
|
158
|
-
"operation_id": row["operation_id"],
|
|
159
|
-
"state": row["state"],
|
|
160
|
-
"profile_id": row["profile_id"] or "",
|
|
161
|
-
"when": row["updated_at"],
|
|
162
|
-
"what_happened": "Operation completed partially — some projections did not apply.",
|
|
163
|
-
}
|
|
164
|
-
result.append(entry)
|
|
165
|
-
return result
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def _fetch_exhausted_obligations(
|
|
169
|
-
conn: sqlite3.Connection,
|
|
170
|
-
profile_id: str | None,
|
|
171
|
-
) -> list[dict]:
|
|
172
|
-
"""Read projection_obligations rows that are FAILED and exhausted (M033 table).
|
|
173
|
-
|
|
174
|
-
Exhausted = state='failed' AND attempts >= _MAX_ATTEMPTS AND NOT admin-cancelled.
|
|
175
|
-
We exclude admin-cancelled obligations (detail contains 'admin_cancel') so they
|
|
176
|
-
don't resurface after cancellation.
|
|
177
|
-
"""
|
|
178
|
-
try:
|
|
179
|
-
if profile_id is not None:
|
|
180
|
-
rows = conn.execute(
|
|
181
|
-
"SELECT DISTINCT operation_id, profile_id, "
|
|
182
|
-
"MAX(attempts) AS attempts, MAX(updated_at) AS updated_at, detail "
|
|
183
|
-
"FROM projection_obligations "
|
|
184
|
-
"WHERE state = 'failed' AND attempts >= ? AND profile_id = ? "
|
|
185
|
-
"GROUP BY operation_id "
|
|
186
|
-
"ORDER BY updated_at DESC LIMIT 200",
|
|
187
|
-
(_MAX_ATTEMPTS, profile_id),
|
|
188
|
-
).fetchall()
|
|
189
|
-
else:
|
|
190
|
-
rows = conn.execute(
|
|
191
|
-
"SELECT DISTINCT operation_id, profile_id, "
|
|
192
|
-
"MAX(attempts) AS attempts, MAX(updated_at) AS updated_at, detail "
|
|
193
|
-
"FROM projection_obligations "
|
|
194
|
-
"WHERE state = 'failed' AND attempts >= ? "
|
|
195
|
-
"GROUP BY operation_id "
|
|
196
|
-
"ORDER BY updated_at DESC LIMIT 200",
|
|
197
|
-
(_MAX_ATTEMPTS,),
|
|
198
|
-
).fetchall()
|
|
199
|
-
except sqlite3.Error:
|
|
200
|
-
return []
|
|
201
|
-
|
|
202
|
-
result: list[dict] = []
|
|
203
|
-
for row in rows:
|
|
204
|
-
# Skip admin-cancelled obligations
|
|
205
|
-
detail_raw = row["detail"] if row["detail"] is not None else ""
|
|
206
|
-
if '"admin_cancel"' in detail_raw or '"admin_cancelled"' in detail_raw:
|
|
207
|
-
continue
|
|
208
|
-
entry = {
|
|
209
|
-
"category": "exhausted_obligation",
|
|
210
|
-
"operation_id": row["operation_id"],
|
|
211
|
-
"attempts": row["attempts"] or 0,
|
|
212
|
-
"profile_id": row["profile_id"] or "",
|
|
213
|
-
"when": row["updated_at"],
|
|
214
|
-
"what_happened": (
|
|
215
|
-
"Background sync failed after maximum retries — "
|
|
216
|
-
"use Force Re-sync or Cancel."
|
|
217
|
-
),
|
|
218
|
-
}
|
|
219
|
-
result.append(entry)
|
|
220
|
-
return result
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
# ---------------------------------------------------------------------------
|
|
224
|
-
# Public API — resolve_operation
|
|
225
|
-
# ---------------------------------------------------------------------------
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
def resolve_operation(
|
|
229
|
-
db_path: str | Path,
|
|
230
|
-
engine: Any,
|
|
231
|
-
operation_id: str,
|
|
232
|
-
action: str,
|
|
233
|
-
) -> dict[str, Any]:
|
|
234
|
-
"""Resolve a failed/stuck operation.
|
|
235
|
-
|
|
236
|
-
Parameters
|
|
237
|
-
----------
|
|
238
|
-
db_path
|
|
239
|
-
Path to memory.db (used for DLQ + obligation queries).
|
|
240
|
-
engine
|
|
241
|
-
The running engine instance (may be None for cancel-only operations).
|
|
242
|
-
operation_id
|
|
243
|
-
The operation to act upon.
|
|
244
|
-
action
|
|
245
|
-
One of: "retry", "force_reconcile", "cancel".
|
|
246
|
-
|
|
247
|
-
Returns a dict: {"success": bool, "action": str, "operation_id": str, ...}
|
|
248
|
-
Raises ValueError for invalid action.
|
|
249
|
-
"""
|
|
250
|
-
if action not in _VALID_ACTIONS:
|
|
251
|
-
raise ValueError(
|
|
252
|
-
f"invalid action {action!r}; must be one of {sorted(_VALID_ACTIONS)}"
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
db_path = Path(db_path)
|
|
256
|
-
|
|
257
|
-
if action == "cancel":
|
|
258
|
-
return _action_cancel(db_path, operation_id)
|
|
259
|
-
if action == "retry":
|
|
260
|
-
return _action_retry(db_path, engine, operation_id)
|
|
261
|
-
if action == "force_reconcile":
|
|
262
|
-
return _action_force_reconcile(db_path, engine, operation_id)
|
|
263
|
-
|
|
264
|
-
# Unreachable — guarded by _VALID_ACTIONS check above
|
|
265
|
-
raise ValueError(f"unhandled action {action!r}") # pragma: no cover
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def _action_cancel(db_path: Path, operation_id: str) -> dict:
|
|
269
|
-
"""Cancel an operation: remove from DLQ, mark obligations as admin-cancelled."""
|
|
270
|
-
found = False
|
|
271
|
-
try:
|
|
272
|
-
conn = sqlite3.connect(str(db_path))
|
|
273
|
-
try:
|
|
274
|
-
# Remove from dead_letter_operations
|
|
275
|
-
cursor = conn.execute(
|
|
276
|
-
"DELETE FROM dead_letter_operations WHERE original_op_id = ?",
|
|
277
|
-
(operation_id,),
|
|
278
|
-
)
|
|
279
|
-
if cursor.rowcount > 0:
|
|
280
|
-
found = True
|
|
281
|
-
|
|
282
|
-
# Mark exhausted obligations as cancelled (so they don't resurface)
|
|
283
|
-
import json
|
|
284
|
-
cancel_detail = json.dumps({"admin_cancel": True, "cancelled_at": time.time()})
|
|
285
|
-
cursor2 = conn.execute(
|
|
286
|
-
"UPDATE projection_obligations SET state = 'failed', "
|
|
287
|
-
"detail = ?, attempts = MAX(attempts, ?) "
|
|
288
|
-
"WHERE operation_id = ? AND state = 'failed'",
|
|
289
|
-
(cancel_detail, _MAX_ATTEMPTS, operation_id),
|
|
290
|
-
)
|
|
291
|
-
if cursor2.rowcount > 0:
|
|
292
|
-
found = True
|
|
293
|
-
|
|
294
|
-
# Mark degraded manifest if present
|
|
295
|
-
cursor3 = conn.execute(
|
|
296
|
-
"UPDATE completion_manifests SET state = 'FAILED' "
|
|
297
|
-
"WHERE operation_id = ? AND state = 'DEGRADED'",
|
|
298
|
-
(operation_id,),
|
|
299
|
-
)
|
|
300
|
-
if cursor3.rowcount > 0:
|
|
301
|
-
found = True
|
|
302
|
-
|
|
303
|
-
conn.commit()
|
|
304
|
-
finally:
|
|
305
|
-
conn.close()
|
|
306
|
-
except Exception as exc: # noqa: BLE001
|
|
307
|
-
logger.error("resolve_operation cancel %s: %s", operation_id, exc)
|
|
308
|
-
return {
|
|
309
|
-
"success": False,
|
|
310
|
-
"action": "cancel",
|
|
311
|
-
"operation_id": operation_id,
|
|
312
|
-
"reason": str(exc),
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if not found:
|
|
316
|
-
return {
|
|
317
|
-
"success": False,
|
|
318
|
-
"action": "cancel",
|
|
319
|
-
"operation_id": operation_id,
|
|
320
|
-
"reason": "not_found — operation not in any failure surface",
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return {
|
|
324
|
-
"success": True,
|
|
325
|
-
"action": "cancel",
|
|
326
|
-
"operation_id": operation_id,
|
|
327
|
-
"message": "Operation cancelled. It will no longer appear in the attention list.",
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
def _action_retry(db_path: Path, engine: Any, operation_id: str) -> dict:
|
|
332
|
-
"""Retry a dead-lettered ingestion operation via IngestionCommand.retry()."""
|
|
333
|
-
# Check that the operation exists in DLQ
|
|
334
|
-
try:
|
|
335
|
-
conn = sqlite3.connect(str(db_path))
|
|
336
|
-
try:
|
|
337
|
-
row = conn.execute(
|
|
338
|
-
"SELECT id FROM dead_letter_operations WHERE original_op_id = ? LIMIT 1",
|
|
339
|
-
(operation_id,),
|
|
340
|
-
).fetchone()
|
|
341
|
-
finally:
|
|
342
|
-
conn.close()
|
|
343
|
-
except Exception as exc:
|
|
344
|
-
logger.error("resolve_operation retry DLQ check %s: %s", operation_id, exc)
|
|
345
|
-
return {
|
|
346
|
-
"success": False,
|
|
347
|
-
"action": "retry",
|
|
348
|
-
"operation_id": operation_id,
|
|
349
|
-
"reason": str(exc),
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
if row is None:
|
|
353
|
-
return {
|
|
354
|
-
"success": False,
|
|
355
|
-
"action": "retry",
|
|
356
|
-
"operation_id": operation_id,
|
|
357
|
-
"reason": "not_found — operation not in dead-letter queue",
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
# Attempt retry via IngestionCommand
|
|
361
|
-
if engine is not None:
|
|
362
|
-
try:
|
|
363
|
-
# Build a fully-wired ingestion command from the live engine
|
|
364
|
-
# (db + queryable writer + materializer). Constructing
|
|
365
|
-
# IngestionCommand directly would miss the required
|
|
366
|
-
# write_queryable/materialize collaborators.
|
|
367
|
-
from superlocalmemory.core.engine_ingestion import (
|
|
368
|
-
build_engine_ingestion_command,
|
|
369
|
-
)
|
|
370
|
-
from superlocalmemory.core.ingestion_command import IngestionState
|
|
371
|
-
cmd = build_engine_ingestion_command(engine)
|
|
372
|
-
operation = cmd.retry(operation_id)
|
|
373
|
-
# G-10: only remove from DLQ if the retry actually moved the
|
|
374
|
-
# operation out of FAILED state. If it is still FAILED, leave
|
|
375
|
-
# the DLQ row so it surfaces again on the next /ops list call
|
|
376
|
-
# and the operator can investigate.
|
|
377
|
-
if operation.state is IngestionState.FAILED:
|
|
378
|
-
return {
|
|
379
|
-
"success": False,
|
|
380
|
-
"action": "retry",
|
|
381
|
-
"operation_id": operation_id,
|
|
382
|
-
"reason": (
|
|
383
|
-
"retry_still_failed — operation remains in FAILED state;"
|
|
384
|
-
" DLQ row preserved for further investigation"
|
|
385
|
-
),
|
|
386
|
-
}
|
|
387
|
-
# Operation moved out of FAILED → remove from DLQ
|
|
388
|
-
conn = sqlite3.connect(str(db_path))
|
|
389
|
-
try:
|
|
390
|
-
conn.execute(
|
|
391
|
-
"DELETE FROM dead_letter_operations WHERE original_op_id = ?",
|
|
392
|
-
(operation_id,),
|
|
393
|
-
)
|
|
394
|
-
conn.commit()
|
|
395
|
-
finally:
|
|
396
|
-
conn.close()
|
|
397
|
-
return {
|
|
398
|
-
"success": True,
|
|
399
|
-
"action": "retry",
|
|
400
|
-
"operation_id": operation_id,
|
|
401
|
-
"message": f"Operation re-queued for retry (state: {operation.state.value}).",
|
|
402
|
-
}
|
|
403
|
-
except Exception as exc:
|
|
404
|
-
logger.error("resolve_operation retry %s: %s", operation_id, exc)
|
|
405
|
-
return {
|
|
406
|
-
"success": False,
|
|
407
|
-
"action": "retry",
|
|
408
|
-
"operation_id": operation_id,
|
|
409
|
-
"reason": str(exc),
|
|
410
|
-
}
|
|
411
|
-
else:
|
|
412
|
-
# No engine — best effort: just clear the DLQ row so it doesn't resurface
|
|
413
|
-
try:
|
|
414
|
-
conn = sqlite3.connect(str(db_path))
|
|
415
|
-
try:
|
|
416
|
-
conn.execute(
|
|
417
|
-
"DELETE FROM dead_letter_operations WHERE original_op_id = ?",
|
|
418
|
-
(operation_id,),
|
|
419
|
-
)
|
|
420
|
-
conn.commit()
|
|
421
|
-
finally:
|
|
422
|
-
conn.close()
|
|
423
|
-
except Exception as exc:
|
|
424
|
-
logger.warning("resolve_operation retry (no engine) %s: %s", operation_id, exc)
|
|
425
|
-
return {
|
|
426
|
-
"success": True,
|
|
427
|
-
"action": "retry",
|
|
428
|
-
"operation_id": operation_id,
|
|
429
|
-
"message": "DLQ entry cleared. Daemon will retry on next cycle.",
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
def _action_force_reconcile(db_path: Path, engine: Any, operation_id: str) -> dict:
|
|
434
|
-
"""Force an immediate projection reconcile for this operation_id."""
|
|
435
|
-
if engine is None:
|
|
436
|
-
return {
|
|
437
|
-
"success": False,
|
|
438
|
-
"action": "force_reconcile",
|
|
439
|
-
"operation_id": operation_id,
|
|
440
|
-
"reason": "engine not available — daemon must be running for force_reconcile",
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
try:
|
|
444
|
-
from superlocalmemory.core.transactions.concrete_owners import (
|
|
445
|
-
build_transaction_service,
|
|
446
|
-
)
|
|
447
|
-
from superlocalmemory.server.unified_daemon import _context_for_operation
|
|
448
|
-
|
|
449
|
-
db_obj = getattr(engine, "_db", None)
|
|
450
|
-
if db_obj is None:
|
|
451
|
-
return {
|
|
452
|
-
"success": False,
|
|
453
|
-
"action": "force_reconcile",
|
|
454
|
-
"operation_id": operation_id,
|
|
455
|
-
"reason": "engine._db not available",
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
context = _context_for_operation(engine, operation_id)
|
|
459
|
-
if context is None:
|
|
460
|
-
return {
|
|
461
|
-
"success": False,
|
|
462
|
-
"action": "force_reconcile",
|
|
463
|
-
"operation_id": operation_id,
|
|
464
|
-
"reason": "not_found — no canonical record for this operation",
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
service = build_transaction_service(engine)
|
|
468
|
-
service.reconcile_operation(db_obj, context)
|
|
469
|
-
return {
|
|
470
|
-
"success": True,
|
|
471
|
-
"action": "force_reconcile",
|
|
472
|
-
"operation_id": operation_id,
|
|
473
|
-
"message": "Reconcile triggered immediately (30s throttle bypassed).",
|
|
474
|
-
}
|
|
475
|
-
except Exception as exc:
|
|
476
|
-
logger.error("resolve_operation force_reconcile %s: %s", operation_id, exc)
|
|
477
|
-
return {
|
|
478
|
-
"success": False,
|
|
479
|
-
"action": "force_reconcile",
|
|
480
|
-
"operation_id": operation_id,
|
|
481
|
-
"reason": str(exc),
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
# ---------------------------------------------------------------------------
|
|
486
|
-
# Counts helpers (for /health and /status surface)
|
|
487
|
-
# ---------------------------------------------------------------------------
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
def get_failure_counts(db_path: str | Path) -> dict[str, int]:
|
|
491
|
-
"""Fast count query for /health and /status surface.
|
|
492
|
-
|
|
493
|
-
Returns {"dead_letter_count": int, "degraded_operations": int,
|
|
494
|
-
"exhausted_obligations": int}.
|
|
495
|
-
All counts default to 0 on error (never raises).
|
|
496
|
-
"""
|
|
497
|
-
db_path = Path(db_path)
|
|
498
|
-
counts = {"dead_letter_count": 0, "degraded_operations": 0, "exhausted_obligations": 0}
|
|
499
|
-
try:
|
|
500
|
-
conn = sqlite3.connect(str(db_path))
|
|
501
|
-
conn.row_factory = sqlite3.Row
|
|
502
|
-
try:
|
|
503
|
-
try:
|
|
504
|
-
row = conn.execute(
|
|
505
|
-
"SELECT COUNT(*) AS c FROM dead_letter_operations"
|
|
506
|
-
).fetchone()
|
|
507
|
-
counts["dead_letter_count"] = int(row["c"]) if row else 0
|
|
508
|
-
except sqlite3.Error:
|
|
509
|
-
pass
|
|
510
|
-
|
|
511
|
-
try:
|
|
512
|
-
row = conn.execute(
|
|
513
|
-
"SELECT COUNT(*) AS c FROM completion_manifests WHERE state = 'DEGRADED'"
|
|
514
|
-
).fetchone()
|
|
515
|
-
counts["degraded_operations"] = int(row["c"]) if row else 0
|
|
516
|
-
except sqlite3.Error:
|
|
517
|
-
pass
|
|
518
|
-
|
|
519
|
-
try:
|
|
520
|
-
row = conn.execute(
|
|
521
|
-
"SELECT COUNT(DISTINCT operation_id) AS c "
|
|
522
|
-
"FROM projection_obligations "
|
|
523
|
-
"WHERE state = 'failed' AND attempts >= ? "
|
|
524
|
-
"AND (detail IS NULL OR detail NOT LIKE '%admin_cancel%')",
|
|
525
|
-
(_MAX_ATTEMPTS,),
|
|
526
|
-
).fetchone()
|
|
527
|
-
counts["exhausted_obligations"] = int(row["c"]) if row else 0
|
|
528
|
-
except sqlite3.Error:
|
|
529
|
-
pass
|
|
530
|
-
finally:
|
|
531
|
-
conn.close()
|
|
532
|
-
except Exception as exc: # noqa: BLE001
|
|
533
|
-
logger.debug("get_failure_counts: %s", exc)
|
|
534
|
-
|
|
535
|
-
return counts
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
__all__ = [
|
|
539
|
-
"list_failed_operations",
|
|
540
|
-
"resolve_operation",
|
|
541
|
-
"get_failure_counts",
|
|
542
|
-
]
|
|
@@ -1,105 +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 — PII redaction on ingest (C4)
|
|
4
|
-
|
|
5
|
-
"""Opt-in PII redaction for ingested memory content.
|
|
6
|
-
|
|
7
|
-
For team / company deployments an operator may need memory to never persist
|
|
8
|
-
personal identifiers (email, phone, national ID, payment card, IP). This
|
|
9
|
-
module provides a pure, well-bounded scrubber that replaces detected PII with
|
|
10
|
-
``[PII:TYPE]`` markers. It is complementary to ``security_primitives.
|
|
11
|
-
redact_secrets`` (which handles API keys / tokens and always runs).
|
|
12
|
-
|
|
13
|
-
Design goals:
|
|
14
|
-
* **Low false-positive rate.** Card numbers are Luhn-validated; SSNs use the
|
|
15
|
-
canonical grouping; phone matching requires a plausible separator shape.
|
|
16
|
-
* **Deterministic + pure.** No I/O, no config — the caller decides when to run
|
|
17
|
-
it (gated by SLM_PII_REDACTION / config), so it is trivially testable.
|
|
18
|
-
* **Order matters.** Emails are redacted before phone/number sweeps so an
|
|
19
|
-
email's local part is never mistaken for a number.
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
from __future__ import annotations
|
|
23
|
-
|
|
24
|
-
import re
|
|
25
|
-
|
|
26
|
-
# Order-sensitive: earlier patterns win over later ones on overlapping spans.
|
|
27
|
-
_EMAIL = re.compile(r"\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b")
|
|
28
|
-
_SSN = re.compile(r"\b\d{3}-\d{2}-\d{4}\b")
|
|
29
|
-
_IPV4 = re.compile(
|
|
30
|
-
r"\b(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)\b"
|
|
31
|
-
)
|
|
32
|
-
# Phone: conservative to avoid eating ISO dates (4-2-2) / version strings.
|
|
33
|
-
# Only unambiguous shapes match:
|
|
34
|
-
# * international +CC then grouped digits
|
|
35
|
-
# * parenthesized (415) 555-0132
|
|
36
|
-
# * strict US 415-555-0132 / 415.555.0132 (3-3-4, dot/dash only — a
|
|
37
|
-
# space separator is excluded so "2026-07-22 12" style runs never match).
|
|
38
|
-
_PHONE = re.compile(
|
|
39
|
-
r"(?<!\w)(?:"
|
|
40
|
-
r"\+\d{1,3}[\s.\-]?\d{1,4}[\s.\-]?\d{2,4}[\s.\-]?\d{2,4}"
|
|
41
|
-
r"|\(\d{3}\)[\s.\-]?\d{3}[\s.\-]?\d{4}"
|
|
42
|
-
r"|\d{3}[.\-]\d{3}[.\-]\d{4}"
|
|
43
|
-
r")(?!\w)"
|
|
44
|
-
)
|
|
45
|
-
# Candidate card: 13–19 digits, optionally grouped by space/dash. Luhn-checked.
|
|
46
|
-
_CARD_CANDIDATE = re.compile(r"(?<!\w)(?:\d[ -]?){13,19}(?!\w)")
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def _luhn_ok(digits: str) -> bool:
|
|
50
|
-
"""Return True if ``digits`` (0-9 only) passes the Luhn checksum."""
|
|
51
|
-
if not (13 <= len(digits) <= 19):
|
|
52
|
-
return False
|
|
53
|
-
total = 0
|
|
54
|
-
parity = len(digits) % 2
|
|
55
|
-
for i, ch in enumerate(digits):
|
|
56
|
-
d = ord(ch) - 48
|
|
57
|
-
if i % 2 == parity:
|
|
58
|
-
d *= 2
|
|
59
|
-
if d > 9:
|
|
60
|
-
d -= 9
|
|
61
|
-
total += d
|
|
62
|
-
return total % 10 == 0
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def _redact_cards(text: str, counter: list[int]) -> str:
|
|
66
|
-
def _sub(m: re.Match[str]) -> str:
|
|
67
|
-
raw = m.group(0)
|
|
68
|
-
digits = re.sub(r"\D", "", raw)
|
|
69
|
-
if _luhn_ok(digits):
|
|
70
|
-
counter[0] += 1
|
|
71
|
-
return "[PII:CARD]"
|
|
72
|
-
return raw
|
|
73
|
-
return _CARD_CANDIDATE.sub(_sub, text)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def redact_pii(text: str) -> tuple[str, int]:
|
|
77
|
-
"""Return ``(redacted_text, num_redactions)``.
|
|
78
|
-
|
|
79
|
-
Never raises; a non-string or empty input is returned unchanged with 0.
|
|
80
|
-
"""
|
|
81
|
-
if not isinstance(text, str) or not text:
|
|
82
|
-
return text, 0
|
|
83
|
-
|
|
84
|
-
counter = [0]
|
|
85
|
-
|
|
86
|
-
def _count_sub(pattern: re.Pattern[str], label: str, s: str) -> str:
|
|
87
|
-
def _sub(_m: re.Match[str]) -> str:
|
|
88
|
-
counter[0] += 1
|
|
89
|
-
return label
|
|
90
|
-
return pattern.sub(_sub, s)
|
|
91
|
-
|
|
92
|
-
out = text
|
|
93
|
-
# Email first (protects local parts from the number sweeps).
|
|
94
|
-
out = _count_sub(_EMAIL, "[PII:EMAIL]", out)
|
|
95
|
-
# Payment cards before generic phone/number matching (Luhn-gated).
|
|
96
|
-
out = _redact_cards(out, counter)
|
|
97
|
-
out = _count_sub(_SSN, "[PII:SSN]", out)
|
|
98
|
-
out = _count_sub(_IPV4, "[PII:IP]", out)
|
|
99
|
-
out = _count_sub(_PHONE, "[PII:PHONE]", out)
|
|
100
|
-
return out, counter[0]
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def redact_pii_text(text: str) -> str:
|
|
104
|
-
"""Convenience wrapper returning only the redacted string."""
|
|
105
|
-
return redact_pii(text)[0]
|