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,300 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Namespace-aware identity for the local SuperLocalMemory daemon.
|
|
5
|
-
|
|
6
|
-
PID files and listening ports are liveness hints, not ownership credentials.
|
|
7
|
-
This module binds a daemon process to one canonical SLM data root and one
|
|
8
|
-
random process instance through a private, atomically written descriptor.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from __future__ import annotations
|
|
12
|
-
|
|
13
|
-
import getpass
|
|
14
|
-
import hashlib
|
|
15
|
-
import hmac
|
|
16
|
-
import json
|
|
17
|
-
import logging
|
|
18
|
-
import os
|
|
19
|
-
import secrets
|
|
20
|
-
import subprocess
|
|
21
|
-
import sys
|
|
22
|
-
import time
|
|
23
|
-
import uuid
|
|
24
|
-
from dataclasses import asdict, dataclass
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
from typing import Any, Mapping
|
|
27
|
-
|
|
28
|
-
from superlocalmemory.infra.data_root import canonical_data_root
|
|
29
|
-
from superlocalmemory.infra.process_identity import process_start_token_for
|
|
30
|
-
|
|
31
|
-
DAEMON_DESCRIPTOR_SCHEMA = 1
|
|
32
|
-
DAEMON_PROTOCOL = 1
|
|
33
|
-
DAEMON_SERVICE = "superlocalmemory-daemon"
|
|
34
|
-
_NAMESPACE_DOMAIN = b"superlocalmemory-daemon-namespace-v1\0"
|
|
35
|
-
_CAPABILITY_DOMAIN = b"superlocalmemory-daemon-capability-v1\0"
|
|
36
|
-
|
|
37
|
-
logger = logging.getLogger(__name__)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def _canonical_path(value: str | Path) -> Path:
|
|
41
|
-
expanded = Path(value).expanduser().resolve(strict=False)
|
|
42
|
-
return Path(os.path.normcase(str(expanded)))
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def namespace_id_for(data_root: str | Path) -> str:
|
|
46
|
-
"""Return a stable, non-reversible identifier for a canonical data root."""
|
|
47
|
-
canonical = _canonical_path(data_root)
|
|
48
|
-
normalized = os.path.normcase(str(canonical)).encode("utf-8")
|
|
49
|
-
return hashlib.sha256(_NAMESPACE_DOMAIN + normalized).hexdigest()
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def capability_fingerprint(capability: str) -> str:
|
|
53
|
-
"""Hash the private local capability before exposing it through health."""
|
|
54
|
-
return hashlib.sha256(_CAPABILITY_DOMAIN + capability.encode("utf-8")).hexdigest()
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def owner_id() -> str:
|
|
58
|
-
"""Cross-platform local owner identifier used for accidental isolation."""
|
|
59
|
-
getuid = getattr(os, "getuid", None)
|
|
60
|
-
if getuid is not None:
|
|
61
|
-
return f"uid:{getuid()}"
|
|
62
|
-
return f"user:{getpass.getuser()}"
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def process_create_time_for(pid: int) -> float:
|
|
66
|
-
"""Return OS process creation time, falling back only when unavailable."""
|
|
67
|
-
try:
|
|
68
|
-
import psutil
|
|
69
|
-
|
|
70
|
-
return float(psutil.Process(pid).create_time())
|
|
71
|
-
except Exception:
|
|
72
|
-
return time.time()
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
@dataclass(frozen=True)
|
|
76
|
-
class DaemonDescriptor:
|
|
77
|
-
schema: int
|
|
78
|
-
service: str
|
|
79
|
-
daemon_protocol: int
|
|
80
|
-
namespace_id: str
|
|
81
|
-
instance_id: str
|
|
82
|
-
capability: str
|
|
83
|
-
capability_fingerprint: str
|
|
84
|
-
owner_id: str
|
|
85
|
-
data_root: str
|
|
86
|
-
pid: int
|
|
87
|
-
process_create_time: float
|
|
88
|
-
port: int
|
|
89
|
-
state: str
|
|
90
|
-
version: str
|
|
91
|
-
started_at: float
|
|
92
|
-
# Clock-independent process identity. Optional and defaulted so a
|
|
93
|
-
# descriptor written by an older release still parses; platforms without a
|
|
94
|
-
# boot-relative start time (Windows) legitimately store None and fall back
|
|
95
|
-
# to the creation-time comparison. See infra/process_identity.py.
|
|
96
|
-
process_start_token: str | None = None
|
|
97
|
-
|
|
98
|
-
def public_health_fields(self) -> dict[str, Any]:
|
|
99
|
-
"""Identity fields safe to expose on the loopback health endpoint."""
|
|
100
|
-
return {
|
|
101
|
-
"service": self.service,
|
|
102
|
-
"daemon_protocol": self.daemon_protocol,
|
|
103
|
-
"namespace_id": self.namespace_id,
|
|
104
|
-
"instance_id": self.instance_id,
|
|
105
|
-
"capability_fingerprint": self.capability_fingerprint,
|
|
106
|
-
"owner_id": self.owner_id,
|
|
107
|
-
"pid": self.pid,
|
|
108
|
-
"port": self.port,
|
|
109
|
-
"state": self.state,
|
|
110
|
-
"version": self.version,
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def build_descriptor(
|
|
115
|
-
*,
|
|
116
|
-
data_root: str | Path | None = None,
|
|
117
|
-
port: int,
|
|
118
|
-
version: str,
|
|
119
|
-
pid: int | None = None,
|
|
120
|
-
process_create_time: float | None = None,
|
|
121
|
-
process_start_token: str | None = None,
|
|
122
|
-
instance_id: str | None = None,
|
|
123
|
-
capability: str | None = None,
|
|
124
|
-
state: str = "starting",
|
|
125
|
-
started_at: float | None = None,
|
|
126
|
-
) -> DaemonDescriptor:
|
|
127
|
-
"""Build one daemon-process descriptor for the selected namespace."""
|
|
128
|
-
root = _canonical_path(data_root) if data_root is not None else canonical_data_root()
|
|
129
|
-
actual_pid = int(pid if pid is not None else os.getpid())
|
|
130
|
-
actual_capability = capability or secrets.token_urlsafe(32)
|
|
131
|
-
return DaemonDescriptor(
|
|
132
|
-
schema=DAEMON_DESCRIPTOR_SCHEMA,
|
|
133
|
-
service=DAEMON_SERVICE,
|
|
134
|
-
daemon_protocol=DAEMON_PROTOCOL,
|
|
135
|
-
namespace_id=namespace_id_for(root),
|
|
136
|
-
instance_id=instance_id or str(uuid.uuid4()),
|
|
137
|
-
capability=actual_capability,
|
|
138
|
-
capability_fingerprint=capability_fingerprint(actual_capability),
|
|
139
|
-
owner_id=owner_id(),
|
|
140
|
-
data_root=str(root),
|
|
141
|
-
pid=actual_pid,
|
|
142
|
-
process_create_time=float(
|
|
143
|
-
process_create_time
|
|
144
|
-
if process_create_time is not None
|
|
145
|
-
else process_create_time_for(actual_pid)
|
|
146
|
-
),
|
|
147
|
-
port=int(port),
|
|
148
|
-
state=state,
|
|
149
|
-
version=version,
|
|
150
|
-
started_at=float(started_at if started_at is not None else time.time()),
|
|
151
|
-
process_start_token=(
|
|
152
|
-
process_start_token
|
|
153
|
-
if process_start_token is not None
|
|
154
|
-
else process_start_token_for(actual_pid)
|
|
155
|
-
),
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def descriptor_path(data_root: str | Path | None = None) -> Path:
|
|
160
|
-
root = _canonical_path(data_root) if data_root is not None else canonical_data_root()
|
|
161
|
-
return root / "daemon.json"
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
def _restrict_to_owner(path: Path) -> None:
|
|
165
|
-
"""Restrict a sensitive file to the current user on every platform.
|
|
166
|
-
|
|
167
|
-
``daemon.json`` holds the capability token that authorizes write requests.
|
|
168
|
-
POSIX gets a 0600 chmod. On Windows chmod is a no-op, so use icacls to strip
|
|
169
|
-
inherited ACEs and grant the current user only — otherwise the token can be
|
|
170
|
-
read by other local accounts (privilege escalation on shared machines).
|
|
171
|
-
Files under %USERPROFILE% usually inherit user-only ACLs already; this is
|
|
172
|
-
defense-in-depth. Fail-soft — a hardening failure warns, never crashes.
|
|
173
|
-
"""
|
|
174
|
-
if sys.platform == "win32":
|
|
175
|
-
try:
|
|
176
|
-
user = getpass.getuser()
|
|
177
|
-
subprocess.run(
|
|
178
|
-
["icacls", str(path), "/inheritance:r"],
|
|
179
|
-
check=False, capture_output=True,
|
|
180
|
-
)
|
|
181
|
-
if user:
|
|
182
|
-
subprocess.run(
|
|
183
|
-
["icacls", str(path), "/grant:r", f"{user}:F"],
|
|
184
|
-
check=False, capture_output=True,
|
|
185
|
-
)
|
|
186
|
-
except Exception as exc: # noqa: BLE001
|
|
187
|
-
logger.warning(
|
|
188
|
-
"could not restrict ACL on %s (%s); the capability token may be "
|
|
189
|
-
"readable by other local users", path, exc,
|
|
190
|
-
)
|
|
191
|
-
else:
|
|
192
|
-
try:
|
|
193
|
-
os.chmod(path, 0o600)
|
|
194
|
-
except OSError as exc:
|
|
195
|
-
logger.warning("could not chmod %s to 0600: %s", path, exc)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
def write_descriptor(
|
|
199
|
-
descriptor: DaemonDescriptor,
|
|
200
|
-
*,
|
|
201
|
-
data_root: str | Path | None = None,
|
|
202
|
-
) -> Path:
|
|
203
|
-
"""Atomically publish a mode-0600 descriptor in its owned namespace."""
|
|
204
|
-
root = _canonical_path(data_root or descriptor.data_root)
|
|
205
|
-
root.mkdir(parents=True, exist_ok=True)
|
|
206
|
-
destination = root / "daemon.json"
|
|
207
|
-
temporary = root / f".daemon.{os.getpid()}.{secrets.token_hex(8)}.tmp"
|
|
208
|
-
payload = json.dumps(asdict(descriptor), sort_keys=True, separators=(",", ":"))
|
|
209
|
-
fd = os.open(temporary, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
|
|
210
|
-
try:
|
|
211
|
-
with os.fdopen(fd, "w", encoding="utf-8") as stream:
|
|
212
|
-
stream.write(payload)
|
|
213
|
-
stream.flush()
|
|
214
|
-
os.fsync(stream.fileno())
|
|
215
|
-
os.replace(temporary, destination)
|
|
216
|
-
_restrict_to_owner(destination)
|
|
217
|
-
finally:
|
|
218
|
-
temporary.unlink(missing_ok=True)
|
|
219
|
-
return destination
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
def read_descriptor(
|
|
223
|
-
*, data_root: str | Path | None = None,
|
|
224
|
-
) -> DaemonDescriptor | None:
|
|
225
|
-
"""Read and validate the local descriptor; malformed state fails closed."""
|
|
226
|
-
path = descriptor_path(data_root)
|
|
227
|
-
try:
|
|
228
|
-
raw = json.loads(path.read_text(encoding="utf-8"))
|
|
229
|
-
descriptor = DaemonDescriptor(**raw)
|
|
230
|
-
except (OSError, ValueError, TypeError, json.JSONDecodeError):
|
|
231
|
-
return None
|
|
232
|
-
if descriptor.schema != DAEMON_DESCRIPTOR_SCHEMA:
|
|
233
|
-
return None
|
|
234
|
-
if descriptor.service != DAEMON_SERVICE:
|
|
235
|
-
return None
|
|
236
|
-
if descriptor.daemon_protocol != DAEMON_PROTOCOL:
|
|
237
|
-
return None
|
|
238
|
-
expected_root = (
|
|
239
|
-
_canonical_path(data_root) if data_root is not None else canonical_data_root()
|
|
240
|
-
)
|
|
241
|
-
if Path(descriptor.data_root).resolve(strict=False) != expected_root:
|
|
242
|
-
return None
|
|
243
|
-
if descriptor.namespace_id != namespace_id_for(expected_root):
|
|
244
|
-
return None
|
|
245
|
-
if descriptor.capability_fingerprint != capability_fingerprint(
|
|
246
|
-
descriptor.capability
|
|
247
|
-
):
|
|
248
|
-
return None
|
|
249
|
-
if descriptor.owner_id != owner_id():
|
|
250
|
-
return None
|
|
251
|
-
if not (1 <= descriptor.port <= 65535) or descriptor.pid <= 0:
|
|
252
|
-
return None
|
|
253
|
-
if descriptor.process_start_token is not None and not isinstance(
|
|
254
|
-
descriptor.process_start_token, str
|
|
255
|
-
):
|
|
256
|
-
return None
|
|
257
|
-
return descriptor
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
def descriptor_matches_health(
|
|
261
|
-
descriptor: DaemonDescriptor,
|
|
262
|
-
health: Mapping[str, Any],
|
|
263
|
-
) -> bool:
|
|
264
|
-
"""Require exact owned-daemon identity before a client attaches."""
|
|
265
|
-
expected = descriptor.public_health_fields()
|
|
266
|
-
identity_keys = (
|
|
267
|
-
"service",
|
|
268
|
-
"daemon_protocol",
|
|
269
|
-
"namespace_id",
|
|
270
|
-
"instance_id",
|
|
271
|
-
"capability_fingerprint",
|
|
272
|
-
"owner_id",
|
|
273
|
-
"version",
|
|
274
|
-
"pid",
|
|
275
|
-
"port",
|
|
276
|
-
)
|
|
277
|
-
for key in identity_keys:
|
|
278
|
-
left = str(expected[key])
|
|
279
|
-
right = str(health.get(key, ""))
|
|
280
|
-
if not hmac.compare_digest(left, right):
|
|
281
|
-
return False
|
|
282
|
-
return True
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
def clear_descriptor(
|
|
286
|
-
instance_id: str,
|
|
287
|
-
*,
|
|
288
|
-
data_root: str | Path | None = None,
|
|
289
|
-
) -> bool:
|
|
290
|
-
"""Delete the descriptor only when the caller still owns that instance."""
|
|
291
|
-
descriptor = read_descriptor(data_root=data_root)
|
|
292
|
-
if descriptor is None or not hmac.compare_digest(
|
|
293
|
-
descriptor.instance_id, instance_id
|
|
294
|
-
):
|
|
295
|
-
return False
|
|
296
|
-
try:
|
|
297
|
-
descriptor_path(data_root).unlink()
|
|
298
|
-
return True
|
|
299
|
-
except OSError:
|
|
300
|
-
return False
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Single authority for SuperLocalMemory runtime-state paths.
|
|
5
|
-
|
|
6
|
-
The resolver is intentionally stdlib-only so CLI, daemon, MCP, and hook entry
|
|
7
|
-
points can use it before importing the engine. Environment selection is an
|
|
8
|
-
explicit process contract and always wins over persisted configuration.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from __future__ import annotations
|
|
12
|
-
|
|
13
|
-
import json
|
|
14
|
-
import logging
|
|
15
|
-
import os
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
DATA_ROOT_ALIASES = ("SLM_DATA_DIR", "SL_MEMORY_PATH", "SLM_HOME")
|
|
19
|
-
_DURABLE_IDENTITY_NAMES = frozenset(
|
|
20
|
-
{
|
|
21
|
-
".install_token",
|
|
22
|
-
".signer_key",
|
|
23
|
-
"api_key",
|
|
24
|
-
"credentials.json",
|
|
25
|
-
},
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger(__name__)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class DataRootConflictError(RuntimeError):
|
|
32
|
-
"""Raised when two state-bearing roots make startup ambiguous."""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def _canonical_path(value: str | Path) -> Path:
|
|
36
|
-
expanded = Path(value).expanduser().resolve(strict=False)
|
|
37
|
-
return Path(os.path.normcase(str(expanded)))
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def environment_data_root() -> Path | None:
|
|
41
|
-
"""Return the winning environment root, or ``None`` when none is set."""
|
|
42
|
-
for name in DATA_ROOT_ALIASES:
|
|
43
|
-
value = os.environ.get(name, "").strip()
|
|
44
|
-
if value:
|
|
45
|
-
return _canonical_path(value)
|
|
46
|
-
return None
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def _legacy_configured_root(default_root: Path) -> Path | None:
|
|
50
|
-
"""Read the bounded legacy ``config.json:base_dir`` relocation hint.
|
|
51
|
-
|
|
52
|
-
Only an absolute path is accepted. Relative paths historically depended on
|
|
53
|
-
the caller's working directory and cannot safely identify a process
|
|
54
|
-
namespace. Corrupt or unreadable configuration never changes the root.
|
|
55
|
-
"""
|
|
56
|
-
config_path = default_root / "config.json"
|
|
57
|
-
try:
|
|
58
|
-
payload = json.loads(config_path.read_text(encoding="utf-8"))
|
|
59
|
-
value = payload.get("base_dir") if isinstance(payload, dict) else None
|
|
60
|
-
if not isinstance(value, str) or not value.strip():
|
|
61
|
-
return None
|
|
62
|
-
candidate = Path(value).expanduser()
|
|
63
|
-
if not candidate.is_absolute():
|
|
64
|
-
return None
|
|
65
|
-
return _canonical_path(candidate)
|
|
66
|
-
except (OSError, ValueError, TypeError):
|
|
67
|
-
return None
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def canonical_data_root(
|
|
71
|
-
configured_base_dir: str | Path | None = None,
|
|
72
|
-
*,
|
|
73
|
-
home: str | Path | None = None,
|
|
74
|
-
) -> Path:
|
|
75
|
-
"""Resolve the one runtime-state namespace for the current process.
|
|
76
|
-
|
|
77
|
-
Precedence:
|
|
78
|
-
1. ``SLM_DATA_DIR``
|
|
79
|
-
2. ``SL_MEMORY_PATH`` (legacy input shim)
|
|
80
|
-
3. ``SLM_HOME`` (legacy input shim)
|
|
81
|
-
4. explicit configured base directory
|
|
82
|
-
5. legacy default-root ``config.json:base_dir``
|
|
83
|
-
6. ``~/.superlocalmemory``
|
|
84
|
-
|
|
85
|
-
The function performs no writes and never moves data.
|
|
86
|
-
"""
|
|
87
|
-
selected = environment_data_root()
|
|
88
|
-
if selected is not None:
|
|
89
|
-
return selected
|
|
90
|
-
if configured_base_dir is not None:
|
|
91
|
-
return _canonical_path(configured_base_dir)
|
|
92
|
-
home_path = _canonical_path(home if home is not None else Path.home())
|
|
93
|
-
default_root = _canonical_path(home_path / ".superlocalmemory")
|
|
94
|
-
return _legacy_configured_root(default_root) or default_root
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
def _durable_markers(root: Path) -> tuple[Path, ...]:
|
|
98
|
-
"""Return bounded evidence that ``root`` contains durable SLM state.
|
|
99
|
-
|
|
100
|
-
The startup guard deliberately ignores ``config.json`` on its own because
|
|
101
|
-
the default-root file is the compatibility locator for legacy custom
|
|
102
|
-
roots. Database sidecars count even if the base file was lost.
|
|
103
|
-
"""
|
|
104
|
-
try:
|
|
105
|
-
children = tuple(root.iterdir())
|
|
106
|
-
except FileNotFoundError:
|
|
107
|
-
return ()
|
|
108
|
-
except OSError as exc:
|
|
109
|
-
raise DataRootConflictError(
|
|
110
|
-
f"SuperLocalMemory cannot inspect possible state root {root}: {exc}. "
|
|
111
|
-
"Startup is blocked until the root is readable or explicitly resolved."
|
|
112
|
-
) from exc
|
|
113
|
-
markers = []
|
|
114
|
-
for path in children:
|
|
115
|
-
name = path.name
|
|
116
|
-
if (
|
|
117
|
-
name in _DURABLE_IDENTITY_NAMES
|
|
118
|
-
or name.endswith((".db", ".db-wal", ".db-shm", ".sqlite", ".sqlite3"))
|
|
119
|
-
):
|
|
120
|
-
markers.append(path)
|
|
121
|
-
return tuple(sorted(markers))
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def assert_no_durable_root_conflict(
|
|
125
|
-
*,
|
|
126
|
-
home: str | Path | None = None,
|
|
127
|
-
) -> None:
|
|
128
|
-
"""Refuse *ambiguous* startup when two state roots make the live namespace unclear.
|
|
129
|
-
|
|
130
|
-
The root actually selected for this process is always inspected: an
|
|
131
|
-
unreadable selected root fails closed. Beyond that, a conflict is only raised
|
|
132
|
-
when the selection was *implicit* — resolved from the legacy
|
|
133
|
-
``config.json:base_dir`` relocation hint — and a separately-populated default
|
|
134
|
-
root leaves it genuinely ambiguous which namespace is live.
|
|
135
|
-
|
|
136
|
-
An explicit environment selection (``SLM_DATA_DIR`` / ``SL_MEMORY_PATH`` /
|
|
137
|
-
``SLM_HOME``) is an unambiguous operator contract: a separately-populated
|
|
138
|
-
default root is then a deliberate multi-root / per-team / second-instance
|
|
139
|
-
layout, not an ambiguity, so startup proceeds. If the explicitly chosen root
|
|
140
|
-
is empty while the old default still holds data, that likely-mistyped path is
|
|
141
|
-
surfaced as a warning rather than a hard block.
|
|
142
|
-
|
|
143
|
-
This check never writes, copies, or deletes data.
|
|
144
|
-
"""
|
|
145
|
-
home_path = _canonical_path(home if home is not None else Path.home())
|
|
146
|
-
default_root = _canonical_path(home_path / ".superlocalmemory")
|
|
147
|
-
selected_root = canonical_data_root(home=home_path)
|
|
148
|
-
if selected_root == default_root:
|
|
149
|
-
return
|
|
150
|
-
|
|
151
|
-
# The root about to be used must be inspectable regardless of how it was
|
|
152
|
-
# chosen; an unreadable selected root fails closed inside _durable_markers.
|
|
153
|
-
selected_markers = _durable_markers(selected_root)
|
|
154
|
-
|
|
155
|
-
if environment_data_root() is not None:
|
|
156
|
-
# Explicit selection wins; a populated default root is a deliberate
|
|
157
|
-
# multi-root layout, not an ambiguity. Only warn on the "empty new root
|
|
158
|
-
# while the old default still holds data" case so a wrong SLM_DATA_DIR
|
|
159
|
-
# stays visible. Inspection of the unused default never blocks startup.
|
|
160
|
-
if not selected_markers:
|
|
161
|
-
try:
|
|
162
|
-
default_has_data = bool(_durable_markers(default_root))
|
|
163
|
-
except DataRootConflictError:
|
|
164
|
-
default_has_data = False
|
|
165
|
-
if default_has_data:
|
|
166
|
-
logger.warning(
|
|
167
|
-
"SLM_DATA_DIR selects an empty state root (%s) while the "
|
|
168
|
-
"default root (%s) still holds data; starting with the empty "
|
|
169
|
-
"root as explicitly requested.",
|
|
170
|
-
selected_root,
|
|
171
|
-
default_root,
|
|
172
|
-
)
|
|
173
|
-
return
|
|
174
|
-
|
|
175
|
-
default_markers = _durable_markers(default_root)
|
|
176
|
-
if not selected_markers or not default_markers:
|
|
177
|
-
return
|
|
178
|
-
raise DataRootConflictError(
|
|
179
|
-
"Conflicting SuperLocalMemory state roots detected: "
|
|
180
|
-
f"selected={selected_root} and default={default_root}. "
|
|
181
|
-
"SuperLocalMemory will not merge or move either root automatically. "
|
|
182
|
-
"Stop both namespaces, back them up, and choose an explicit migration "
|
|
183
|
-
"or one SLM_DATA_DIR before starting the daemon."
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def state_path(
|
|
188
|
-
*parts: str | Path,
|
|
189
|
-
configured_base_dir: str | Path | None = None,
|
|
190
|
-
home: str | Path | None = None,
|
|
191
|
-
) -> Path:
|
|
192
|
-
"""Return a canonical child path without permitting root escape."""
|
|
193
|
-
relative = Path()
|
|
194
|
-
for raw_part in parts:
|
|
195
|
-
part = Path(raw_part)
|
|
196
|
-
if part.is_absolute() or ".." in part.parts:
|
|
197
|
-
raise ValueError(f"state path must remain relative: {raw_part!s}")
|
|
198
|
-
relative /= part
|
|
199
|
-
root = canonical_data_root(configured_base_dir, home=home)
|
|
200
|
-
destination = _canonical_path(root / relative)
|
|
201
|
-
try:
|
|
202
|
-
destination.relative_to(root)
|
|
203
|
-
except ValueError as exc:
|
|
204
|
-
raise ValueError("state path escapes the canonical data root") from exc
|
|
205
|
-
return destination
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
class DynamicStatePath(os.PathLike[str]):
|
|
209
|
-
"""Backward-compatible path proxy that never freezes the active root."""
|
|
210
|
-
|
|
211
|
-
__slots__ = ("_parts",)
|
|
212
|
-
|
|
213
|
-
def __init__(self, *parts: str | Path) -> None:
|
|
214
|
-
self._parts = parts
|
|
215
|
-
|
|
216
|
-
def _resolve(self) -> Path:
|
|
217
|
-
return state_path(*self._parts)
|
|
218
|
-
|
|
219
|
-
def __fspath__(self) -> str:
|
|
220
|
-
return str(self._resolve())
|
|
221
|
-
|
|
222
|
-
def __truediv__(self, other: str | Path) -> Path:
|
|
223
|
-
return self._resolve() / other
|
|
224
|
-
|
|
225
|
-
def __str__(self) -> str:
|
|
226
|
-
return str(self._resolve())
|
|
227
|
-
|
|
228
|
-
def __repr__(self) -> str:
|
|
229
|
-
return f"DynamicStatePath({self._parts!r})"
|
|
230
|
-
|
|
231
|
-
def __eq__(self, other: object) -> bool:
|
|
232
|
-
try:
|
|
233
|
-
return self._resolve() == Path(other) # type: ignore[arg-type]
|
|
234
|
-
except TypeError:
|
|
235
|
-
return False
|
|
236
|
-
|
|
237
|
-
def __getattr__(self, name: str):
|
|
238
|
-
return getattr(self._resolve(), name)
|