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,174 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Schema-version singleton: read, write, and version-conflict guard.
|
|
5
|
-
|
|
6
|
-
Encapsulates the one-row ``schema_version`` table written to the learning DB
|
|
7
|
-
after each zero-failure migration run. A stored version that exceeds the
|
|
8
|
-
runner's supported ceiling means a newer build wrote the database and this
|
|
9
|
-
installation must not operate on it.
|
|
10
|
-
|
|
11
|
-
Design:
|
|
12
|
-
- ``_read_schema_version_from_db`` is strictly read-only (no writes).
|
|
13
|
-
- ``_ensure_schema_version_table`` + ``_write_schema_version`` are only
|
|
14
|
-
called by the runner after a confirmed zero-failure apply_all.
|
|
15
|
-
- Missing table or unreadable DB → version 0 (legacy; safe to upgrade).
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import sqlite3
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
|
|
23
|
-
#: Highest schema_version this runner can write. Matches the trailing serial of
|
|
24
|
-
#: the latest migration (M050). Increment when adding new migrations or
|
|
25
|
-
#: table-level breaking changes.
|
|
26
|
-
#:
|
|
27
|
-
#: This sat at 42 while M043, M044 and M045 shipped, so for three migrations the
|
|
28
|
-
#: ceiling did not move and nothing prevented an older build from opening a
|
|
29
|
-
#: newer store. That was tolerable only because those three were additive: a
|
|
30
|
-
#: build that did not know about a new column or table simply never read it.
|
|
31
|
-
#:
|
|
32
|
-
#: M046 is not additive. It rebuilds ``atomic_facts`` with a constraint that
|
|
33
|
-
#: rejects the value an older build classifies planned events as, so an older
|
|
34
|
-
#: writer against a migrated store fails its INSERT. The ceiling is what turns
|
|
35
|
-
#: that from a lost memory into a refusal to start, which is why it moves here
|
|
36
|
-
#: and why it moves to the trailing serial rather than to 43.
|
|
37
|
-
#:
|
|
38
|
-
#: M049 is additive — a unique index on ``schema_version`` plus the removal of
|
|
39
|
-
#: the duplicate rows that index could not otherwise be created over — so an
|
|
40
|
-
#: older build could in principle read a store it has touched. The ceiling
|
|
41
|
-
#: still moves, because the convention is "trailing serial, always": the cost of
|
|
42
|
-
#: moving it for an additive migration is an older build declining a store it
|
|
43
|
-
#: could have read, and the cost of NOT moving it for one that turns out not to
|
|
44
|
-
#: be additive is a silent bad write. Those are not comparable, and judging
|
|
45
|
-
#: additivity per migration is exactly the judgement that let it fall three
|
|
46
|
-
#: behind.
|
|
47
|
-
SUPPORTED_SCHEMA_VERSION: int = 50
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
class SchemaVersionError(RuntimeError):
|
|
51
|
-
"""Raised when the DB's recorded schema_version exceeds the supported max.
|
|
52
|
-
|
|
53
|
-
The caller must not attempt any write after catching this — the DB was
|
|
54
|
-
produced by a newer installation and this build is too old for it.
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
# NOTE: this singleton lives in its OWN table ``slm_schema_version`` rather than
|
|
59
|
-
# ``schema_version``. The legacy multi-row migration-history table
|
|
60
|
-
# ``schema_version`` (columns version/applied_at/description, seeded by
|
|
61
|
-
# schema.py + the schema_v34x migrations) already exists on every real database
|
|
62
|
-
# — fresh installs and upgrades alike — so a ``CREATE TABLE IF NOT EXISTS
|
|
63
|
-
# schema_version`` here would no-op against that legacy shape and every
|
|
64
|
-
# ``id``-keyed read/write would fail ("no column named id"). A distinct table
|
|
65
|
-
# name decouples the version-ceiling guard from that legacy history table.
|
|
66
|
-
_SCHEMA_VERSION_DDL = """\
|
|
67
|
-
CREATE TABLE IF NOT EXISTS slm_schema_version (
|
|
68
|
-
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
69
|
-
version INTEGER NOT NULL DEFAULT 0,
|
|
70
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
71
|
-
);
|
|
72
|
-
INSERT OR IGNORE INTO slm_schema_version (id, version, updated_at)
|
|
73
|
-
VALUES (1, 0, datetime('now'));
|
|
74
|
-
"""
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def read_schema_version(db_path: Path) -> int:
|
|
78
|
-
"""Read the stored schema_version without any write. Returns 0 if absent."""
|
|
79
|
-
try:
|
|
80
|
-
conn = sqlite3.connect(str(db_path))
|
|
81
|
-
try:
|
|
82
|
-
row = conn.execute(
|
|
83
|
-
"SELECT version FROM slm_schema_version WHERE id = 1"
|
|
84
|
-
).fetchone()
|
|
85
|
-
return int(row[0]) if row is not None else 0
|
|
86
|
-
except sqlite3.OperationalError:
|
|
87
|
-
return 0 # slm_schema_version table does not exist (legacy DB)
|
|
88
|
-
finally:
|
|
89
|
-
conn.close()
|
|
90
|
-
except sqlite3.Error:
|
|
91
|
-
return 0 # cannot open DB; let the runner surface the open error
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def ensure_schema_version_table(conn: sqlite3.Connection) -> None:
|
|
95
|
-
"""Create the schema_version table if absent and seed the singleton row."""
|
|
96
|
-
conn.executescript(_SCHEMA_VERSION_DDL)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def write_schema_version(conn: sqlite3.Connection, version: int) -> None:
|
|
100
|
-
"""Overwrite the singleton version record."""
|
|
101
|
-
conn.execute(
|
|
102
|
-
"UPDATE slm_schema_version "
|
|
103
|
-
"SET version = ?, updated_at = datetime('now') WHERE id = 1",
|
|
104
|
-
(version,),
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def _detect_all_installs() -> list:
|
|
109
|
-
"""Delegate to core.install_detector; fail-open (returns [] on any error)."""
|
|
110
|
-
try:
|
|
111
|
-
from superlocalmemory.core.install_detector import (
|
|
112
|
-
_detect_all_installs as _real,
|
|
113
|
-
)
|
|
114
|
-
return _real()
|
|
115
|
-
except Exception: # import error, timeout, etc.
|
|
116
|
-
return []
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
def _format_install_block(installs: list) -> str:
|
|
120
|
-
"""Return a formatted multi-line string listing all detected installs."""
|
|
121
|
-
if not installs:
|
|
122
|
-
return ""
|
|
123
|
-
|
|
124
|
-
_upgrade_hints = {
|
|
125
|
-
"pipx": " pipx upgrade superlocalmemory",
|
|
126
|
-
"venv": " pip install -U superlocalmemory (in ~/.slm-venv)",
|
|
127
|
-
"npm": " npm install -g superlocalmemory@latest",
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
lines = ["\nAll detected installs:"]
|
|
131
|
-
seen_types: set[str] = set()
|
|
132
|
-
for entry in installs:
|
|
133
|
-
install_type = entry.get("type", "unknown")
|
|
134
|
-
version = entry.get("version", "unknown")
|
|
135
|
-
path = entry.get("path", "")
|
|
136
|
-
lines.append(f" {install_type:<6} ({version}): {path}")
|
|
137
|
-
seen_types.add(install_type)
|
|
138
|
-
|
|
139
|
-
lines.append("\nUpgrade all installs to the latest version:")
|
|
140
|
-
for install_type, cmd in _upgrade_hints.items():
|
|
141
|
-
if install_type in seen_types:
|
|
142
|
-
lines.append(cmd)
|
|
143
|
-
|
|
144
|
-
return "\n".join(lines)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
def check_version_or_raise(db_path: Path) -> None:
|
|
148
|
-
"""Raise SchemaVersionError if the DB's stored version exceeds supported max.
|
|
149
|
-
|
|
150
|
-
When raising, the error message lists every SLM installation detected on
|
|
151
|
-
this machine so the user knows which copies to upgrade.
|
|
152
|
-
|
|
153
|
-
Non-mutating. Must be called before any write at startup.
|
|
154
|
-
"""
|
|
155
|
-
stored = read_schema_version(db_path)
|
|
156
|
-
if stored > SUPPORTED_SCHEMA_VERSION:
|
|
157
|
-
installs = _detect_all_installs()
|
|
158
|
-
install_block = _format_install_block(installs)
|
|
159
|
-
raise SchemaVersionError(
|
|
160
|
-
f"Database schema_version={stored} exceeds the maximum "
|
|
161
|
-
f"supported version={SUPPORTED_SCHEMA_VERSION}. "
|
|
162
|
-
"This installation is too old for this database."
|
|
163
|
-
+ install_block
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
__all__ = (
|
|
168
|
-
"SUPPORTED_SCHEMA_VERSION",
|
|
169
|
-
"SchemaVersionError",
|
|
170
|
-
"read_schema_version",
|
|
171
|
-
"ensure_schema_version_table",
|
|
172
|
-
"write_schema_version",
|
|
173
|
-
"check_version_or_raise",
|
|
174
|
-
)
|
|
@@ -1,170 +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
|
|
4
|
-
|
|
5
|
-
"""Exposure log for fact retrieval events.
|
|
6
|
-
|
|
7
|
-
Tracks when facts are accessed (recall, auto_invoke, search).
|
|
8
|
-
The historical table name is retained for compatibility. A ``recall`` row is
|
|
9
|
-
exposure telemetry only and must never be interpreted as positive feedback.
|
|
10
|
-
All SQL parameterized (Rule 11). Silent errors (Rule 19).
|
|
11
|
-
|
|
12
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
13
|
-
License: AGPL-3.0-or-later
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from __future__ import annotations
|
|
17
|
-
|
|
18
|
-
import logging
|
|
19
|
-
import uuid
|
|
20
|
-
from typing import TYPE_CHECKING
|
|
21
|
-
|
|
22
|
-
if TYPE_CHECKING:
|
|
23
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger(__name__)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def _new_log_id() -> str:
|
|
29
|
-
"""Generate a short unique log ID."""
|
|
30
|
-
return uuid.uuid4().hex[:16]
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class AccessLog:
|
|
34
|
-
"""CRUD operations for fact_access_log table."""
|
|
35
|
-
|
|
36
|
-
def __init__(self, db: DatabaseManager) -> None:
|
|
37
|
-
self._db = db
|
|
38
|
-
|
|
39
|
-
def store_access(
|
|
40
|
-
self,
|
|
41
|
-
fact_id: str,
|
|
42
|
-
profile_id: str,
|
|
43
|
-
access_type: str = "recall",
|
|
44
|
-
session_id: str = "",
|
|
45
|
-
) -> str:
|
|
46
|
-
"""Record a fact access event. Returns log_id.
|
|
47
|
-
|
|
48
|
-
Validates access_type against allowed values.
|
|
49
|
-
Returns empty string on failure (Rule 19).
|
|
50
|
-
"""
|
|
51
|
-
allowed = ("recall", "auto_invoke", "search", "consolidation")
|
|
52
|
-
if access_type not in allowed:
|
|
53
|
-
access_type = "recall"
|
|
54
|
-
|
|
55
|
-
log_id = _new_log_id()
|
|
56
|
-
try:
|
|
57
|
-
self._db.execute(
|
|
58
|
-
"INSERT INTO fact_access_log "
|
|
59
|
-
"(log_id, fact_id, profile_id, access_type, session_id) "
|
|
60
|
-
"VALUES (?, ?, ?, ?, ?)",
|
|
61
|
-
(log_id, fact_id, profile_id, access_type, session_id),
|
|
62
|
-
)
|
|
63
|
-
return log_id
|
|
64
|
-
except Exception as exc:
|
|
65
|
-
logger.debug("store_access failed for fact_id=%s: %s", fact_id, exc)
|
|
66
|
-
return ""
|
|
67
|
-
|
|
68
|
-
def store_access_batch(
|
|
69
|
-
self,
|
|
70
|
-
fact_ids: list[str],
|
|
71
|
-
profile_id: str,
|
|
72
|
-
access_type: str = "recall",
|
|
73
|
-
session_id: str = "",
|
|
74
|
-
) -> int:
|
|
75
|
-
"""Record access events for multiple facts. Returns count stored.
|
|
76
|
-
|
|
77
|
-
Catches exceptions per-fact (Rule 19: silent errors).
|
|
78
|
-
"""
|
|
79
|
-
count = 0
|
|
80
|
-
for fact_id in fact_ids:
|
|
81
|
-
result = self.store_access(
|
|
82
|
-
fact_id, profile_id, access_type, session_id,
|
|
83
|
-
)
|
|
84
|
-
if result:
|
|
85
|
-
count += 1
|
|
86
|
-
return count
|
|
87
|
-
|
|
88
|
-
def get_latest_access_time(
|
|
89
|
-
self, fact_id: str, profile_id: str,
|
|
90
|
-
) -> str | None:
|
|
91
|
-
"""Most recent access timestamp for a fact.
|
|
92
|
-
|
|
93
|
-
Returns ISO datetime string or None if never accessed.
|
|
94
|
-
"""
|
|
95
|
-
try:
|
|
96
|
-
rows = self._db.execute(
|
|
97
|
-
"SELECT MAX(accessed_at) AS latest "
|
|
98
|
-
"FROM fact_access_log "
|
|
99
|
-
"WHERE fact_id = ? AND profile_id = ?",
|
|
100
|
-
(fact_id, profile_id),
|
|
101
|
-
)
|
|
102
|
-
if rows and rows[0]["latest"] is not None:
|
|
103
|
-
return str(rows[0]["latest"])
|
|
104
|
-
return None
|
|
105
|
-
except Exception as exc:
|
|
106
|
-
logger.debug("get_latest_access_time failed: %s", exc)
|
|
107
|
-
return None
|
|
108
|
-
|
|
109
|
-
def get_access_count(
|
|
110
|
-
self, fact_id: str, profile_id: str,
|
|
111
|
-
) -> int:
|
|
112
|
-
"""Total access count for a fact."""
|
|
113
|
-
try:
|
|
114
|
-
rows = self._db.execute(
|
|
115
|
-
"SELECT COUNT(*) AS c "
|
|
116
|
-
"FROM fact_access_log "
|
|
117
|
-
"WHERE fact_id = ? AND profile_id = ?",
|
|
118
|
-
(fact_id, profile_id),
|
|
119
|
-
)
|
|
120
|
-
if rows:
|
|
121
|
-
return int(rows[0]["c"])
|
|
122
|
-
return 0
|
|
123
|
-
except Exception as exc:
|
|
124
|
-
logger.debug("get_access_count failed: %s", exc)
|
|
125
|
-
return 0
|
|
126
|
-
|
|
127
|
-
def get_all_access_times(
|
|
128
|
-
self, profile_id: str, limit: int = 1000,
|
|
129
|
-
) -> dict[str, str]:
|
|
130
|
-
"""Latest access time for all facts in a profile.
|
|
131
|
-
|
|
132
|
-
Returns {fact_id: latest_accessed_at} dict.
|
|
133
|
-
"""
|
|
134
|
-
try:
|
|
135
|
-
rows = self._db.execute(
|
|
136
|
-
"SELECT fact_id, MAX(accessed_at) AS latest "
|
|
137
|
-
"FROM fact_access_log "
|
|
138
|
-
"WHERE profile_id = ? "
|
|
139
|
-
"GROUP BY fact_id "
|
|
140
|
-
"ORDER BY latest DESC "
|
|
141
|
-
"LIMIT ?",
|
|
142
|
-
(profile_id, limit),
|
|
143
|
-
)
|
|
144
|
-
return {str(r["fact_id"]): str(r["latest"]) for r in rows}
|
|
145
|
-
except Exception as exc:
|
|
146
|
-
logger.debug("get_all_access_times failed: %s", exc)
|
|
147
|
-
return {}
|
|
148
|
-
|
|
149
|
-
def get_frequently_accessed(
|
|
150
|
-
self, profile_id: str, min_count: int = 3, limit: int = 100,
|
|
151
|
-
) -> list[tuple[str, int]]:
|
|
152
|
-
"""Facts accessed at least min_count times.
|
|
153
|
-
|
|
154
|
-
Returns [(fact_id, access_count)] sorted by count desc.
|
|
155
|
-
"""
|
|
156
|
-
try:
|
|
157
|
-
rows = self._db.execute(
|
|
158
|
-
"SELECT fact_id, COUNT(*) AS cnt "
|
|
159
|
-
"FROM fact_access_log "
|
|
160
|
-
"WHERE profile_id = ? "
|
|
161
|
-
"GROUP BY fact_id "
|
|
162
|
-
"HAVING cnt >= ? "
|
|
163
|
-
"ORDER BY cnt DESC "
|
|
164
|
-
"LIMIT ?",
|
|
165
|
-
(profile_id, min_count, limit),
|
|
166
|
-
)
|
|
167
|
-
return [(str(r["fact_id"]), int(r["cnt"])) for r in rows]
|
|
168
|
-
except Exception as exc:
|
|
169
|
-
logger.debug("get_frequently_accessed failed: %s", exc)
|
|
170
|
-
return []
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Production encryption codec for durable remember admission commands."""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import os
|
|
9
|
-
import stat
|
|
10
|
-
import time
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
|
|
13
|
-
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|
14
|
-
|
|
15
|
-
from superlocalmemory.infra.data_root import state_path
|
|
16
|
-
|
|
17
|
-
_KEY_BYTES = 32
|
|
18
|
-
_NONCE_BYTES = 12
|
|
19
|
-
_FORMAT_VERSION = b"\x01"
|
|
20
|
-
_ASSOCIATED_DATA = b"superlocalmemory:remember-admission:v1"
|
|
21
|
-
_KEY_READ_ATTEMPTS = 100
|
|
22
|
-
_KEY_READ_RETRY_SECONDS = 0.005
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class AdmissionKeyError(RuntimeError):
|
|
26
|
-
"""The machine-local admission key cannot be created or loaded safely."""
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class MachineKeyCommandCodec:
|
|
30
|
-
"""AES-256-GCM codec backed by a machine-local, permission-bound key.
|
|
31
|
-
|
|
32
|
-
The key is intentionally separate from cache encryption keys. Exclusive
|
|
33
|
-
creation makes concurrent daemon startup converge on one key, while the
|
|
34
|
-
format byte and AEAD associated data prevent cross-protocol ciphertext use.
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
def __init__(self, key_path: str | Path | None = None) -> None:
|
|
38
|
-
self.key_path = Path(key_path) if key_path is not None else state_path(
|
|
39
|
-
"admission-key.bin"
|
|
40
|
-
)
|
|
41
|
-
self._key = _load_or_create_key(self.key_path)
|
|
42
|
-
|
|
43
|
-
def encrypt(self, plaintext: bytes) -> bytes:
|
|
44
|
-
if not isinstance(plaintext, bytes):
|
|
45
|
-
raise TypeError("plaintext must be bytes")
|
|
46
|
-
nonce = os.urandom(_NONCE_BYTES)
|
|
47
|
-
ciphertext = AESGCM(self._key).encrypt(nonce, plaintext, _ASSOCIATED_DATA)
|
|
48
|
-
return _FORMAT_VERSION + nonce + ciphertext
|
|
49
|
-
|
|
50
|
-
def decrypt(self, ciphertext: bytes) -> bytes:
|
|
51
|
-
if not isinstance(ciphertext, bytes):
|
|
52
|
-
raise TypeError("ciphertext must be bytes")
|
|
53
|
-
minimum = len(_FORMAT_VERSION) + _NONCE_BYTES + 16
|
|
54
|
-
if len(ciphertext) < minimum or ciphertext[:1] != _FORMAT_VERSION:
|
|
55
|
-
raise ValueError("unsupported admission ciphertext format")
|
|
56
|
-
nonce = ciphertext[1 : 1 + _NONCE_BYTES]
|
|
57
|
-
payload = ciphertext[1 + _NONCE_BYTES :]
|
|
58
|
-
return AESGCM(self._key).decrypt(nonce, payload, _ASSOCIATED_DATA)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def _load_or_create_key(path: Path) -> bytes:
|
|
62
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
63
|
-
if os.name != "nt":
|
|
64
|
-
os.chmod(path.parent, 0o700)
|
|
65
|
-
|
|
66
|
-
try:
|
|
67
|
-
fd = os.open(
|
|
68
|
-
path,
|
|
69
|
-
os.O_WRONLY
|
|
70
|
-
| os.O_CREAT
|
|
71
|
-
| os.O_EXCL
|
|
72
|
-
| getattr(os, "O_BINARY", 0),
|
|
73
|
-
0o600,
|
|
74
|
-
)
|
|
75
|
-
except FileExistsError:
|
|
76
|
-
fd = -1
|
|
77
|
-
except OSError as exc:
|
|
78
|
-
try:
|
|
79
|
-
info = path.lstat()
|
|
80
|
-
except OSError:
|
|
81
|
-
raise AdmissionKeyError("admission key cannot be created") from exc
|
|
82
|
-
if stat.S_ISLNK(info.st_mode) or not stat.S_ISREG(info.st_mode):
|
|
83
|
-
raise AdmissionKeyError(
|
|
84
|
-
"admission key path must be a regular file"
|
|
85
|
-
) from exc
|
|
86
|
-
raise AdmissionKeyError("admission key cannot be created") from exc
|
|
87
|
-
else:
|
|
88
|
-
try:
|
|
89
|
-
key = os.urandom(_KEY_BYTES)
|
|
90
|
-
view = memoryview(key)
|
|
91
|
-
written = 0
|
|
92
|
-
while written < _KEY_BYTES:
|
|
93
|
-
count = os.write(fd, view[written:])
|
|
94
|
-
if count <= 0:
|
|
95
|
-
raise AdmissionKeyError("admission key write was incomplete")
|
|
96
|
-
written += count
|
|
97
|
-
os.fsync(fd)
|
|
98
|
-
except BaseException:
|
|
99
|
-
try:
|
|
100
|
-
path.unlink()
|
|
101
|
-
except OSError:
|
|
102
|
-
pass
|
|
103
|
-
raise
|
|
104
|
-
finally:
|
|
105
|
-
os.close(fd)
|
|
106
|
-
|
|
107
|
-
for attempt in range(_KEY_READ_ATTEMPTS):
|
|
108
|
-
try:
|
|
109
|
-
info = path.lstat()
|
|
110
|
-
except OSError as exc:
|
|
111
|
-
raise AdmissionKeyError("admission key is unavailable") from exc
|
|
112
|
-
if stat.S_ISLNK(info.st_mode) or not stat.S_ISREG(info.st_mode):
|
|
113
|
-
raise AdmissionKeyError("admission key path must be a regular file")
|
|
114
|
-
if os.name != "nt":
|
|
115
|
-
if info.st_uid != os.getuid():
|
|
116
|
-
raise AdmissionKeyError("admission key is not owned by the current user")
|
|
117
|
-
os.chmod(path, 0o600)
|
|
118
|
-
try:
|
|
119
|
-
key = path.read_bytes()
|
|
120
|
-
except OSError as exc:
|
|
121
|
-
raise AdmissionKeyError("admission key cannot be read") from exc
|
|
122
|
-
if len(key) == _KEY_BYTES:
|
|
123
|
-
return key
|
|
124
|
-
# A process that lost O_EXCL may observe the winning creator between
|
|
125
|
-
# file creation and its final fsync/close. Wait only for that bounded
|
|
126
|
-
# window; a persistently truncated or oversized key still fails closed.
|
|
127
|
-
if attempt + 1 < _KEY_READ_ATTEMPTS:
|
|
128
|
-
time.sleep(_KEY_READ_RETRY_SECONDS)
|
|
129
|
-
raise AdmissionKeyError("admission key has an invalid length")
|