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,751 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory v3.4.5 — CozoDB Graph Backend.
|
|
6
|
-
|
|
7
|
-
Embedded graph database backend powered by CozoDB (MPL-2.0).
|
|
8
|
-
|
|
9
|
-
It stores the graph. It does not traverse it, and the line that used to claim it
|
|
10
|
-
replaced NetworkX "for storage and traversal" outlived the traversal by a
|
|
11
|
-
release: the walk lives once in ``retrieval/spreading``, as a pure function of an
|
|
12
|
-
adjacency snapshot, and is numpy rather than NetworkX either way. What this
|
|
13
|
-
module supplies is the snapshot's edges, read by
|
|
14
|
-
``graph/cozo_adjacency.CozoAdjacencySource`` -- measured at 395 ms against
|
|
15
|
-
SQLite's 2,477 ms on a 208,151-edge store. Both figures come from a hand run on a
|
|
16
|
-
copy of that store, recorded in ``cozo_adjacency``; nothing in the test suite
|
|
17
|
-
reproduces them.
|
|
18
|
-
|
|
19
|
-
All Datalog queries are private to this module.
|
|
20
|
-
External code calls Python methods only — never raw Datalog strings.
|
|
21
|
-
|
|
22
|
-
Verified API: pycozo v0.7.6, Client('rocksdb', path), db.run(datalog), db.put(name, dicts)
|
|
23
|
-
|
|
24
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
from __future__ import annotations
|
|
28
|
-
|
|
29
|
-
import importlib.util
|
|
30
|
-
import json
|
|
31
|
-
import logging
|
|
32
|
-
import sqlite3
|
|
33
|
-
from datetime import datetime
|
|
34
|
-
from pathlib import Path
|
|
35
|
-
from typing import Any
|
|
36
|
-
|
|
37
|
-
from superlocalmemory.storage.logical_edges import iter_logical_edges
|
|
38
|
-
|
|
39
|
-
logger = logging.getLogger(__name__)
|
|
40
|
-
|
|
41
|
-
# Availability via find_spec only — never import pycozo at module load.
|
|
42
|
-
# Native bindings belong to the same risk class as lancedb (background
|
|
43
|
-
# runtimes / GC races). Real import is deferred to CozoDBGraphBackend.__init__.
|
|
44
|
-
def _pycozo_spec_present() -> bool:
|
|
45
|
-
try:
|
|
46
|
-
return importlib.util.find_spec("pycozo") is not None
|
|
47
|
-
except Exception:
|
|
48
|
-
return False
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
_COZO_AVAILABLE: bool = _pycozo_spec_present()
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class CozoDBError(Exception):
|
|
55
|
-
"""Base exception for CozoDB backend failures."""
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class CozoDBNotAvailable(CozoDBError):
|
|
59
|
-
"""CozoDB not installed. Install with: pip install superlocalmemory[cozo]"""
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
class CozoDBConnectionError(CozoDBError):
|
|
63
|
-
"""CozoDB file not found or corrupted."""
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class CozoDBQueryError(CozoDBError):
|
|
67
|
-
"""Datalog query execution failed."""
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class _CozoRows:
|
|
71
|
-
"""Small pandas-values compatible view for PyCozo's dict results."""
|
|
72
|
-
|
|
73
|
-
def __init__(self, rows: list[list[Any]]) -> None:
|
|
74
|
-
self._rows = rows
|
|
75
|
-
|
|
76
|
-
def tolist(self) -> list[list[Any]]:
|
|
77
|
-
return self._rows
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
class _CozoResult:
|
|
81
|
-
"""Normalize old PyCozo dict responses to the dataframe surface we use."""
|
|
82
|
-
|
|
83
|
-
def __init__(self, result: Any) -> None:
|
|
84
|
-
self._result = result
|
|
85
|
-
self.values = _CozoRows(list(result.get("rows", []))) if isinstance(result, dict) else result.values
|
|
86
|
-
|
|
87
|
-
def __len__(self) -> int:
|
|
88
|
-
return len(self.values.tolist())
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
class _CozoClientAdapter:
|
|
92
|
-
"""Bridge legacy PyCozo responses and the store-compatible client surface.
|
|
93
|
-
|
|
94
|
-
SLM graph stores were established with PyCozo 0.3.0. That client returns
|
|
95
|
-
dictionaries and exposes ``import_relations`` rather than ``put``; later
|
|
96
|
-
clients return dataframe-like values and add ``put``. SLM only needs
|
|
97
|
-
relation upserts and row results, so normalize both forms here.
|
|
98
|
-
"""
|
|
99
|
-
|
|
100
|
-
def __init__(self, client: Any) -> None:
|
|
101
|
-
self._client = client
|
|
102
|
-
|
|
103
|
-
def run(self, script: str, params: dict[str, Any] | None = None) -> Any:
|
|
104
|
-
result = self._client.run(script) if params is None else self._client.run(script, params)
|
|
105
|
-
return _CozoResult(result) if isinstance(result, dict) else result
|
|
106
|
-
|
|
107
|
-
def put(self, relation: str, rows: list[dict[str, Any]]) -> None:
|
|
108
|
-
if not rows:
|
|
109
|
-
return
|
|
110
|
-
put = getattr(self._client, "put", None)
|
|
111
|
-
if callable(put):
|
|
112
|
-
put(relation, rows)
|
|
113
|
-
return
|
|
114
|
-
headers = list(rows[0])
|
|
115
|
-
self._client.import_relations({
|
|
116
|
-
relation: {
|
|
117
|
-
"headers": headers,
|
|
118
|
-
"rows": [[row.get(header) for header in headers] for row in rows],
|
|
119
|
-
},
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
def close(self) -> None:
|
|
123
|
-
self._client.close()
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
# ---------------------------------------------------------------------------
|
|
127
|
-
# CozoDBGraphBackend
|
|
128
|
-
# ---------------------------------------------------------------------------
|
|
129
|
-
|
|
130
|
-
class CozoDBGraphBackend:
|
|
131
|
-
"""Embedded graph backend powered by CozoDB.
|
|
132
|
-
|
|
133
|
-
Wraps pycozo for graph storage, traversal, and algorithms.
|
|
134
|
-
All Datalog queries are private. External code calls Python methods.
|
|
135
|
-
"""
|
|
136
|
-
|
|
137
|
-
def __init__(self, db_path: str) -> None:
|
|
138
|
-
if not _pycozo_spec_present():
|
|
139
|
-
raise CozoDBNotAvailable(
|
|
140
|
-
"CozoDB not installed. Run: pip install superlocalmemory[cozo]"
|
|
141
|
-
)
|
|
142
|
-
# Lazy import: only construct-time loads the native binding.
|
|
143
|
-
from pycozo.client import Client as _CozoClient # noqa: PLC0415
|
|
144
|
-
|
|
145
|
-
path = Path(db_path)
|
|
146
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
147
|
-
self._db_path = str(path)
|
|
148
|
-
client = _CozoClient("rocksdb", self._db_path, dataframe=False)
|
|
149
|
-
self._db = _CozoClientAdapter(client)
|
|
150
|
-
self._shadow_checks = 0
|
|
151
|
-
self._shadow_mismatches = 0
|
|
152
|
-
self._shadow_errors = 0
|
|
153
|
-
self._ensure_schema()
|
|
154
|
-
|
|
155
|
-
def close(self) -> None:
|
|
156
|
-
"""Close the CozoDB connection."""
|
|
157
|
-
if hasattr(self, "_db") and self._db is not None:
|
|
158
|
-
self._db.close()
|
|
159
|
-
|
|
160
|
-
# ------------------------------------------------------------------
|
|
161
|
-
# Schema
|
|
162
|
-
# ------------------------------------------------------------------
|
|
163
|
-
|
|
164
|
-
def _ensure_schema(self) -> None:
|
|
165
|
-
"""Create relations if they don't exist. Idempotent."""
|
|
166
|
-
try:
|
|
167
|
-
self._db.run("""
|
|
168
|
-
:create entity {
|
|
169
|
-
id: String => name: String, entity_type: String,
|
|
170
|
-
tier: String default 'hot',
|
|
171
|
-
properties: String default '{}',
|
|
172
|
-
profile_id: String default 'default',
|
|
173
|
-
created_at: String, updated_at: String
|
|
174
|
-
}
|
|
175
|
-
""")
|
|
176
|
-
except Exception:
|
|
177
|
-
pass # Already exists
|
|
178
|
-
|
|
179
|
-
try:
|
|
180
|
-
self._db.run("""
|
|
181
|
-
:create edge {
|
|
182
|
-
from_id: String, to_id: String, edge_type: String =>
|
|
183
|
-
weight: Float default 1.0,
|
|
184
|
-
metadata: String default '{}',
|
|
185
|
-
profile_id: String default 'default',
|
|
186
|
-
created_at: String
|
|
187
|
-
}
|
|
188
|
-
""")
|
|
189
|
-
except Exception:
|
|
190
|
-
pass
|
|
191
|
-
|
|
192
|
-
# The entity recall channel resolves a query to canonical entity IDs,
|
|
193
|
-
# while graph_edges links fact IDs. Keeping those relations separate
|
|
194
|
-
# is essential: treating fact IDs as entities produces a healthy but
|
|
195
|
-
# semantically incompatible graph. ``fact_entity`` is the bridge
|
|
196
|
-
# that lets Cozo traverse the same two spaces as the SQLite channel.
|
|
197
|
-
try:
|
|
198
|
-
self._db.run("""
|
|
199
|
-
:create fact_entity {
|
|
200
|
-
fact_id: String, entity_id: String =>
|
|
201
|
-
profile_id: String default 'default'
|
|
202
|
-
}
|
|
203
|
-
""")
|
|
204
|
-
except Exception:
|
|
205
|
-
pass
|
|
206
|
-
|
|
207
|
-
# ------------------------------------------------------------------
|
|
208
|
-
# Write Path
|
|
209
|
-
# ------------------------------------------------------------------
|
|
210
|
-
|
|
211
|
-
def add_entity(
|
|
212
|
-
self,
|
|
213
|
-
entity_id: str,
|
|
214
|
-
name: str,
|
|
215
|
-
entity_type: str,
|
|
216
|
-
properties: dict | None = None,
|
|
217
|
-
profile_id: str = "default",
|
|
218
|
-
) -> None:
|
|
219
|
-
"""Insert or update a canonical entity node."""
|
|
220
|
-
now = datetime.now().isoformat()
|
|
221
|
-
props = json.dumps(properties or {})
|
|
222
|
-
self._db.put("entity", [{
|
|
223
|
-
"id": entity_id,
|
|
224
|
-
"name": name,
|
|
225
|
-
"entity_type": entity_type,
|
|
226
|
-
"properties": props,
|
|
227
|
-
"profile_id": profile_id,
|
|
228
|
-
"tier": "hot",
|
|
229
|
-
"created_at": now,
|
|
230
|
-
"updated_at": now,
|
|
231
|
-
}])
|
|
232
|
-
|
|
233
|
-
def add_edge(
|
|
234
|
-
self,
|
|
235
|
-
from_id: str,
|
|
236
|
-
to_id: str,
|
|
237
|
-
edge_type: str,
|
|
238
|
-
weight: float = 1.0,
|
|
239
|
-
metadata: dict | None = None,
|
|
240
|
-
profile_id: str = "default",
|
|
241
|
-
) -> None:
|
|
242
|
-
"""Insert a relationship edge between two entities."""
|
|
243
|
-
now = datetime.now().isoformat()
|
|
244
|
-
meta = json.dumps(metadata or {})
|
|
245
|
-
self._db.put("edge", [{
|
|
246
|
-
"from_id": from_id,
|
|
247
|
-
"to_id": to_id,
|
|
248
|
-
"edge_type": edge_type,
|
|
249
|
-
"weight": weight,
|
|
250
|
-
"metadata": meta,
|
|
251
|
-
"profile_id": profile_id,
|
|
252
|
-
"created_at": now,
|
|
253
|
-
}])
|
|
254
|
-
|
|
255
|
-
def add_fact_entities(
|
|
256
|
-
self,
|
|
257
|
-
fact_id: str,
|
|
258
|
-
entity_ids: list[str],
|
|
259
|
-
profile_id: str = "default",
|
|
260
|
-
) -> None:
|
|
261
|
-
"""Upsert the canonical entities attached to one fact.
|
|
262
|
-
|
|
263
|
-
This is deliberately a separate relation from ``edge``. Fact edges
|
|
264
|
-
and canonical entity IDs are different namespaces in SLM.
|
|
265
|
-
"""
|
|
266
|
-
self._db.put("fact_entity", [
|
|
267
|
-
{"fact_id": fact_id, "entity_id": entity_id, "profile_id": profile_id}
|
|
268
|
-
for entity_id in dict.fromkeys(entity_ids)
|
|
269
|
-
if entity_id
|
|
270
|
-
])
|
|
271
|
-
|
|
272
|
-
def remove_fact(self, fact_id: str) -> None:
|
|
273
|
-
"""Remove a fact's derived graph records using bound query values."""
|
|
274
|
-
# Cozo :rm needs every non-key column in the output relation. Binding
|
|
275
|
-
# ``fact_id`` keeps apostrophes and Datalog syntax in external IDs from
|
|
276
|
-
# becoming executable query text.
|
|
277
|
-
self._db.run("""
|
|
278
|
-
?[fact_id, entity_id, profile_id] :=
|
|
279
|
-
*fact_entity{fact_id, entity_id, profile_id}, fact_id = $fact_id
|
|
280
|
-
:rm fact_entity {fact_id, entity_id => profile_id}
|
|
281
|
-
""", {"fact_id": fact_id})
|
|
282
|
-
self._db.run("""
|
|
283
|
-
?[from_id, to_id, edge_type, weight, metadata, profile_id, created_at] :=
|
|
284
|
-
*edge{from_id, to_id, edge_type, weight, metadata, profile_id, created_at},
|
|
285
|
-
(from_id = $fact_id or to_id = $fact_id)
|
|
286
|
-
:rm edge {from_id, to_id, edge_type => weight, metadata, profile_id, created_at}
|
|
287
|
-
""", {"fact_id": fact_id})
|
|
288
|
-
|
|
289
|
-
def remove_entity(self, entity_id: str) -> None:
|
|
290
|
-
"""Remove an entity node and every bridge that reaches it.
|
|
291
|
-
|
|
292
|
-
``remove_fact`` clears a fact's bridges and edges and leaves the entity
|
|
293
|
-
nodes alone, which is right when a fact is deleted -- the entity is
|
|
294
|
-
still real and other facts still reference it. It is wrong when the
|
|
295
|
-
entity itself is erased: the node stayed behind with its name in it,
|
|
296
|
-
so a graph query could still name somebody after their record had been
|
|
297
|
-
removed from the store.
|
|
298
|
-
|
|
299
|
-
The id is bound as a parameter, so an entity name containing a quote
|
|
300
|
-
cannot become query text.
|
|
301
|
-
"""
|
|
302
|
-
self._db.run("""
|
|
303
|
-
?[fact_id, entity_id, profile_id] :=
|
|
304
|
-
*fact_entity{fact_id, entity_id, profile_id}, entity_id = $entity_id
|
|
305
|
-
:rm fact_entity {fact_id, entity_id => profile_id}
|
|
306
|
-
""", {"entity_id": entity_id})
|
|
307
|
-
self._db.run("""
|
|
308
|
-
?[from_id, to_id, edge_type, weight, metadata, profile_id, created_at] :=
|
|
309
|
-
*edge{from_id, to_id, edge_type, weight, metadata, profile_id, created_at},
|
|
310
|
-
(from_id = $entity_id or to_id = $entity_id)
|
|
311
|
-
:rm edge {from_id, to_id, edge_type => weight, metadata, profile_id, created_at}
|
|
312
|
-
""", {"entity_id": entity_id})
|
|
313
|
-
self._db.run("""
|
|
314
|
-
?[id, name, entity_type, tier, properties, profile_id,
|
|
315
|
-
created_at, updated_at] :=
|
|
316
|
-
*entity{id, name, entity_type, tier, properties, profile_id,
|
|
317
|
-
created_at, updated_at},
|
|
318
|
-
id = $entity_id
|
|
319
|
-
:rm entity {id => name, entity_type, tier, properties, profile_id,
|
|
320
|
-
created_at, updated_at}
|
|
321
|
-
""", {"entity_id": entity_id})
|
|
322
|
-
|
|
323
|
-
def remove_fact_candidacy(self, fact_id: str) -> None:
|
|
324
|
-
"""Stop a fact being *offered* as a candidate, without touching the graph.
|
|
325
|
-
|
|
326
|
-
Removes only the ``fact_entity`` bridge. The fact's edges stay.
|
|
327
|
-
|
|
328
|
-
The two are not the same thing and the SQLite channel already treats them
|
|
329
|
-
differently. Its entity map filters on ``visible_fact_clause()`` — a
|
|
330
|
-
withheld row must never enter it, because it carries its whole cluster's
|
|
331
|
-
pooled entity list and out-ranks real memories. Its edge walk filters on
|
|
332
|
-
scope only, with no visibility predicate at all, so it traverses edges to
|
|
333
|
-
withheld and archived facts and lets hydration drop them at the end.
|
|
334
|
-
|
|
335
|
-
So a projection that deleted a hidden fact's edges would hold a smaller
|
|
336
|
-
adjacency than the walk it is meant to replace, and give different
|
|
337
|
-
answers for every fact that happened to neighbour a withheld one. Use
|
|
338
|
-
this for a fact that has become invisible; use ``remove_fact`` only for
|
|
339
|
-
one that is genuinely gone.
|
|
340
|
-
"""
|
|
341
|
-
self._db.run("""
|
|
342
|
-
?[fact_id, entity_id, profile_id] :=
|
|
343
|
-
*fact_entity{fact_id, entity_id, profile_id}, fact_id = $fact_id
|
|
344
|
-
:rm fact_entity {fact_id, entity_id => profile_id}
|
|
345
|
-
""", {"fact_id": fact_id})
|
|
346
|
-
|
|
347
|
-
def record_shadow_comparison(
|
|
348
|
-
self,
|
|
349
|
-
*,
|
|
350
|
-
matches: bool,
|
|
351
|
-
projected: list[tuple[str, float]],
|
|
352
|
-
canonical: list[tuple[str, float]],
|
|
353
|
-
) -> None:
|
|
354
|
-
"""Retain aggregate parity telemetry without persisting recalled text."""
|
|
355
|
-
self._shadow_checks += 1
|
|
356
|
-
if not matches:
|
|
357
|
-
self._shadow_mismatches += 1
|
|
358
|
-
logger.warning(
|
|
359
|
-
"Cozo entity recall diverged from canonical SQLite; using SQLite "
|
|
360
|
-
"(projected=%d canonical=%d)", len(projected), len(canonical),
|
|
361
|
-
)
|
|
362
|
-
|
|
363
|
-
def record_shadow_error(self, error: str) -> None:
|
|
364
|
-
self._shadow_errors += 1
|
|
365
|
-
logger.warning("Cozo entity recall failed closed to SQLite: %s", error)
|
|
366
|
-
|
|
367
|
-
# ------------------------------------------------------------------
|
|
368
|
-
# Bulk Import (SQLite → CozoDB)
|
|
369
|
-
# ------------------------------------------------------------------
|
|
370
|
-
|
|
371
|
-
def bulk_import_from_sqlite(
|
|
372
|
-
self,
|
|
373
|
-
conn: sqlite3.Connection,
|
|
374
|
-
profile_id: str = "default",
|
|
375
|
-
tier_filter: list[str] | None = None,
|
|
376
|
-
) -> int:
|
|
377
|
-
"""Export entities + edges from SQLite to CozoDB.
|
|
378
|
-
|
|
379
|
-
Only imports facts + edges in tier_filter (default: hot+warm).
|
|
380
|
-
Uses parameterized Datalog — no string injection.
|
|
381
|
-
|
|
382
|
-
Returns number of edges imported.
|
|
383
|
-
"""
|
|
384
|
-
if tier_filter is None:
|
|
385
|
-
tier_filter = ["active", "warm"]
|
|
386
|
-
|
|
387
|
-
# Step 1: Export canonical entity records. Do *not* synthesize
|
|
388
|
-
# entities from graph_edges: those are fact IDs and belong to the
|
|
389
|
-
# separate fact graph relation below.
|
|
390
|
-
entities_sql = """
|
|
391
|
-
SELECT entity_id, canonical_name, entity_type, first_seen, last_seen, fact_count
|
|
392
|
-
FROM canonical_entities WHERE profile_id = ?
|
|
393
|
-
"""
|
|
394
|
-
rows = conn.execute(entities_sql, (profile_id,)).fetchall()
|
|
395
|
-
|
|
396
|
-
entity_dicts = []
|
|
397
|
-
now = datetime.now().isoformat()
|
|
398
|
-
for entity_id, name, entity_type, first_seen, last_seen, fact_count in rows:
|
|
399
|
-
entity_dicts.append({
|
|
400
|
-
"id": entity_id,
|
|
401
|
-
"name": name,
|
|
402
|
-
"entity_type": entity_type or "concept",
|
|
403
|
-
"tier": "active",
|
|
404
|
-
"properties": json.dumps({"fact_count": int(fact_count or 0)}),
|
|
405
|
-
"profile_id": profile_id,
|
|
406
|
-
"created_at": first_seen or now,
|
|
407
|
-
"updated_at": last_seen or now,
|
|
408
|
-
})
|
|
409
|
-
|
|
410
|
-
if entity_dicts:
|
|
411
|
-
self._db.put("entity", entity_dicts)
|
|
412
|
-
logger.info("CozoDB: imported %d entities", len(entity_dicts))
|
|
413
|
-
|
|
414
|
-
# Step 2: Export fact-to-canonical-entity mappings. This relation is
|
|
415
|
-
# what allows a canonical query seed to enter the fact graph.
|
|
416
|
-
#
|
|
417
|
-
# Withheld and archived facts are excluded, with the same predicate the
|
|
418
|
-
# SQLite entity map uses and for the reason it records: such a row
|
|
419
|
-
# carries its whole cluster's pooled entity list, so it out-ranks real
|
|
420
|
-
# memories, takes the top-k budget, and is then discarded at hydration.
|
|
421
|
-
# This export predated that fix. Measured on a copy of the author's
|
|
422
|
-
# store, it had put 1,257 unreturnable facts into the bridge, and the
|
|
423
|
-
# Cozo graph search diverged from SQLite on every query tried — one
|
|
424
|
-
# returned 9 results against SQLite's 20. The projection failed closed
|
|
425
|
-
# each time, so recall stayed correct and the projection was useless.
|
|
426
|
-
from superlocalmemory.storage.database import (
|
|
427
|
-
visible_fact_clause_for_connection,
|
|
428
|
-
)
|
|
429
|
-
|
|
430
|
-
facts_sql = f"""
|
|
431
|
-
SELECT fact_id, canonical_entities_json
|
|
432
|
-
FROM atomic_facts WHERE profile_id = ?
|
|
433
|
-
{visible_fact_clause_for_connection(conn)}
|
|
434
|
-
"""
|
|
435
|
-
fact_entity_dicts: list[dict[str, str]] = []
|
|
436
|
-
for fact_id, raw_entities in conn.execute(facts_sql, (profile_id,)).fetchall():
|
|
437
|
-
try:
|
|
438
|
-
entity_ids = json.loads(raw_entities or "[]")
|
|
439
|
-
except (TypeError, ValueError, json.JSONDecodeError):
|
|
440
|
-
entity_ids = []
|
|
441
|
-
for entity_id in dict.fromkeys(entity_ids):
|
|
442
|
-
if entity_id:
|
|
443
|
-
fact_entity_dicts.append({
|
|
444
|
-
"fact_id": fact_id,
|
|
445
|
-
"entity_id": str(entity_id),
|
|
446
|
-
"profile_id": profile_id,
|
|
447
|
-
})
|
|
448
|
-
if fact_entity_dicts:
|
|
449
|
-
self._db.put("fact_entity", fact_entity_dicts)
|
|
450
|
-
|
|
451
|
-
# Step 3: Export fact graph edges directly. Fact graph traversal is
|
|
452
|
-
# intentionally kept in its native fact-ID namespace.
|
|
453
|
-
edge_dicts = []
|
|
454
|
-
for ea, eb, etype, weight, edge_profile in iter_logical_edges(conn, profile_id):
|
|
455
|
-
edge_dicts.append({
|
|
456
|
-
"from_id": ea,
|
|
457
|
-
"to_id": eb,
|
|
458
|
-
"edge_type": etype,
|
|
459
|
-
"weight": float(weight),
|
|
460
|
-
"metadata": "{}",
|
|
461
|
-
"profile_id": edge_profile,
|
|
462
|
-
"created_at": now,
|
|
463
|
-
})
|
|
464
|
-
|
|
465
|
-
if edge_dicts:
|
|
466
|
-
self._db.put("edge", edge_dicts)
|
|
467
|
-
logger.info("CozoDB: imported %d edges", len(edge_dicts))
|
|
468
|
-
|
|
469
|
-
return len(edge_dicts)
|
|
470
|
-
|
|
471
|
-
# recall_facts() and spreading_activation() were here, and they were a
|
|
472
|
-
# second implementation of the walk in retrieval/entity_channel.py. They did
|
|
473
|
-
# not compute the same function: the channel multiplies activation by a
|
|
474
|
-
# PageRank factor every hop and these did not, so on a real store 3,567 of
|
|
475
|
-
# 3,667 shared facts came out with different scores, the result sets
|
|
476
|
-
# differed, and the projected path failed its shadow comparison on every
|
|
477
|
-
# query and fell back to SQLite. The projection was correct data that
|
|
478
|
-
# nothing could use.
|
|
479
|
-
#
|
|
480
|
-
# spreading_activation() also queried Cozo once per frontier node: 200
|
|
481
|
-
# single-node queries measured 18,125 ms against 303 ms for one batched
|
|
482
|
-
# query returning the identical 6,046 rows. With a mean degree of 228 over
|
|
483
|
-
# four hops that is minutes per recall.
|
|
484
|
-
#
|
|
485
|
-
# The walk now lives in retrieval/spreading.py, once, as a pure function of
|
|
486
|
-
# an AdjacencySnapshot. A storage backend supplies adjacency, not answers —
|
|
487
|
-
# which is also why there is no longer anything to shadow-compare. Do not
|
|
488
|
-
# reintroduce a traversal here; add an AdjacencySource adapter instead
|
|
489
|
-
# (retrieval/graph_adjacency.py).
|
|
490
|
-
|
|
491
|
-
def pagerank(
|
|
492
|
-
self, damping: float = 0.85, max_iter: int = 100
|
|
493
|
-
) -> dict[str, float]:
|
|
494
|
-
"""Iterative PageRank on the current graph.
|
|
495
|
-
|
|
496
|
-
Uses CozoDB for edge queries, Python for iteration.
|
|
497
|
-
"""
|
|
498
|
-
try:
|
|
499
|
-
# Get all entities
|
|
500
|
-
entities_df = self._db.run("?[id] := *entity{id}")
|
|
501
|
-
if entities_df is None or len(entities_df) == 0:
|
|
502
|
-
return {}
|
|
503
|
-
entities = [str(r[0]) for r in entities_df.values.tolist()]
|
|
504
|
-
n = len(entities)
|
|
505
|
-
if n == 0:
|
|
506
|
-
return {}
|
|
507
|
-
|
|
508
|
-
entity_index = {eid: i for i, eid in enumerate(entities)}
|
|
509
|
-
scores = [1.0 / n] * n
|
|
510
|
-
|
|
511
|
-
# Get all edges as adjacency list
|
|
512
|
-
try:
|
|
513
|
-
edges_df = self._db.run("?[from_id, to_id, weight] := *edge{from_id, to_id, weight}")
|
|
514
|
-
if edges_df is not None and len(edges_df) > 0:
|
|
515
|
-
edges = edges_df.values.tolist()
|
|
516
|
-
else:
|
|
517
|
-
edges = []
|
|
518
|
-
except Exception:
|
|
519
|
-
edges = []
|
|
520
|
-
|
|
521
|
-
# Build outgoing edge map
|
|
522
|
-
outgoing: dict[str, list[tuple[str, float]]] = {e: [] for e in entities}
|
|
523
|
-
for from_id, to_id, weight in edges:
|
|
524
|
-
outgoing[str(from_id)].append((str(to_id), float(weight)))
|
|
525
|
-
|
|
526
|
-
# Iterative PageRank
|
|
527
|
-
for _ in range(max_iter):
|
|
528
|
-
new_scores = [(1.0 - damping) / n] * n
|
|
529
|
-
for i, eid in enumerate(entities):
|
|
530
|
-
neighbors = outgoing.get(eid, [])
|
|
531
|
-
if neighbors:
|
|
532
|
-
total_weight = sum(w for _, w in neighbors)
|
|
533
|
-
if total_weight > 0:
|
|
534
|
-
for to_id, weight in neighbors:
|
|
535
|
-
j = entity_index.get(to_id)
|
|
536
|
-
if j is not None:
|
|
537
|
-
new_scores[j] += damping * scores[i] * weight / total_weight
|
|
538
|
-
scores = new_scores
|
|
539
|
-
|
|
540
|
-
return {entities[i]: scores[i] for i in range(n)}
|
|
541
|
-
|
|
542
|
-
except Exception as exc:
|
|
543
|
-
logger.warning("CozoDB PageRank failed: %s", exc)
|
|
544
|
-
return {}
|
|
545
|
-
|
|
546
|
-
# ------------------------------------------------------------------
|
|
547
|
-
# Community Detection (simplified label propagation)
|
|
548
|
-
# ------------------------------------------------------------------
|
|
549
|
-
|
|
550
|
-
def community_detect(self, method: str = "louvain") -> dict[str, int]:
|
|
551
|
-
"""Simplified community detection via label propagation.
|
|
552
|
-
|
|
553
|
-
Uses CozoDB for edge queries, Python for iteration.
|
|
554
|
-
Falls back to connected components if Louvain fails.
|
|
555
|
-
"""
|
|
556
|
-
try:
|
|
557
|
-
entities_df = self._db.run("?[id] := *entity{id}")
|
|
558
|
-
if entities_df is None or len(entities_df) == 0:
|
|
559
|
-
return {}
|
|
560
|
-
entities = [str(r[0]) for r in entities_df.values.tolist()]
|
|
561
|
-
|
|
562
|
-
# Get edges
|
|
563
|
-
try:
|
|
564
|
-
edges_df = self._db.run("?[from_id, to_id] := *edge{from_id, to_id}")
|
|
565
|
-
if edges_df is not None and len(edges_df) > 0:
|
|
566
|
-
edges = edges_df.values.tolist()
|
|
567
|
-
else:
|
|
568
|
-
edges = []
|
|
569
|
-
except Exception:
|
|
570
|
-
edges = []
|
|
571
|
-
|
|
572
|
-
# Build adjacency for connected components
|
|
573
|
-
adj: dict[str, set[str]] = {e: set() for e in entities}
|
|
574
|
-
for from_id, to_id in edges:
|
|
575
|
-
f, t = str(from_id), str(to_id)
|
|
576
|
-
adj.setdefault(f, set()).add(t)
|
|
577
|
-
adj.setdefault(t, set()).add(f)
|
|
578
|
-
|
|
579
|
-
# Connected components via BFS
|
|
580
|
-
community: dict[str, int] = {}
|
|
581
|
-
visited: set[str] = set()
|
|
582
|
-
comm_id = 0
|
|
583
|
-
|
|
584
|
-
for entity in entities:
|
|
585
|
-
if entity in visited:
|
|
586
|
-
continue
|
|
587
|
-
# BFS from this entity
|
|
588
|
-
queue = [entity]
|
|
589
|
-
visited.add(entity)
|
|
590
|
-
while queue:
|
|
591
|
-
current = queue.pop(0)
|
|
592
|
-
community[current] = comm_id
|
|
593
|
-
for neighbor in adj.get(current, set()):
|
|
594
|
-
if neighbor not in visited:
|
|
595
|
-
visited.add(neighbor)
|
|
596
|
-
queue.append(neighbor)
|
|
597
|
-
comm_id += 1
|
|
598
|
-
|
|
599
|
-
return community
|
|
600
|
-
|
|
601
|
-
except Exception as exc:
|
|
602
|
-
logger.warning("CozoDB community detection failed: %s", exc)
|
|
603
|
-
return {}
|
|
604
|
-
|
|
605
|
-
# ------------------------------------------------------------------
|
|
606
|
-
# Shortest Path (BFS)
|
|
607
|
-
# ------------------------------------------------------------------
|
|
608
|
-
|
|
609
|
-
def shortest_path(self, from_id: str, to_id: str) -> list[str]:
|
|
610
|
-
"""BFS shortest path between two entities."""
|
|
611
|
-
try:
|
|
612
|
-
if from_id == to_id:
|
|
613
|
-
return [from_id]
|
|
614
|
-
|
|
615
|
-
edges_df = self._db.run("?[from_id, to_id] := *edge{from_id, to_id}")
|
|
616
|
-
if edges_df is None or len(edges_df) == 0:
|
|
617
|
-
return []
|
|
618
|
-
|
|
619
|
-
# Build adjacency
|
|
620
|
-
adj: dict[str, list[str]] = {}
|
|
621
|
-
for f, t in edges_df.values.tolist():
|
|
622
|
-
adj.setdefault(str(f), []).append(str(t))
|
|
623
|
-
adj.setdefault(str(t), []).append(str(f))
|
|
624
|
-
|
|
625
|
-
# BFS
|
|
626
|
-
from collections import deque
|
|
627
|
-
queue = deque([(from_id, [from_id])])
|
|
628
|
-
visited = {from_id}
|
|
629
|
-
|
|
630
|
-
while queue:
|
|
631
|
-
current, path = queue.popleft()
|
|
632
|
-
for neighbor in adj.get(current, []):
|
|
633
|
-
if neighbor == to_id:
|
|
634
|
-
return path + [neighbor]
|
|
635
|
-
if neighbor not in visited:
|
|
636
|
-
visited.add(neighbor)
|
|
637
|
-
queue.append((neighbor, path + [neighbor]))
|
|
638
|
-
|
|
639
|
-
return []
|
|
640
|
-
except Exception as exc:
|
|
641
|
-
logger.warning("CozoDB shortest path failed: %s", exc)
|
|
642
|
-
return []
|
|
643
|
-
|
|
644
|
-
# ------------------------------------------------------------------
|
|
645
|
-
# Tier Sync
|
|
646
|
-
# ------------------------------------------------------------------
|
|
647
|
-
|
|
648
|
-
# Rebind the whole entity row (Cozo has no partial ``:update`` op — that
|
|
649
|
-
# token does not parse) while binding the id/tier/timestamp as query
|
|
650
|
-
# parameters so an entity id containing a quote can never become Datalog.
|
|
651
|
-
# The ``*entity{...}`` match means non-existent ids are a safe no-op rather
|
|
652
|
-
# than creating a stub row.
|
|
653
|
-
_TIER_SYNC_QUERY = (
|
|
654
|
-
"?[id, name, entity_type, tier, properties, profile_id, created_at, updated_at] := "
|
|
655
|
-
"*entity{id, name, entity_type, properties, profile_id, created_at}, "
|
|
656
|
-
"id = $id, tier = $tier, updated_at = $now "
|
|
657
|
-
":put entity {id => name, entity_type, tier, properties, profile_id, created_at, updated_at}"
|
|
658
|
-
)
|
|
659
|
-
|
|
660
|
-
def sync_tier_changes(
|
|
661
|
-
self, added: list[str], removed: list[str]
|
|
662
|
-
) -> None:
|
|
663
|
-
"""Sync tier changes: promote added entities to active, demote removed to cold."""
|
|
664
|
-
now = datetime.now().isoformat()
|
|
665
|
-
for entity_ids, tier in ((added, "active"), (removed, "cold")):
|
|
666
|
-
for entity_id in entity_ids:
|
|
667
|
-
try:
|
|
668
|
-
self._db.run(
|
|
669
|
-
self._TIER_SYNC_QUERY,
|
|
670
|
-
{"id": entity_id, "tier": tier, "now": now},
|
|
671
|
-
)
|
|
672
|
-
except Exception:
|
|
673
|
-
logger.debug(
|
|
674
|
-
"cozo tier sync skipped for entity %s", entity_id, exc_info=True
|
|
675
|
-
)
|
|
676
|
-
|
|
677
|
-
# ------------------------------------------------------------------
|
|
678
|
-
# Health Check
|
|
679
|
-
# ------------------------------------------------------------------
|
|
680
|
-
|
|
681
|
-
def health_check(self) -> dict[str, Any]:
|
|
682
|
-
"""Return health status of the CozoDB backend."""
|
|
683
|
-
try:
|
|
684
|
-
entity_count = self._db.run(
|
|
685
|
-
"?[count(id)] := *entity{id}"
|
|
686
|
-
)
|
|
687
|
-
edge_count = self._db.run(
|
|
688
|
-
"?[count(from_id)] := *edge{from_id}"
|
|
689
|
-
)
|
|
690
|
-
# fact_entity bridge rows (fact_id, entity_id) — counted so parity
|
|
691
|
-
# verification can catch a silent bridge-import failure that would
|
|
692
|
-
# otherwise leave Cozo entity recall returning empty results.
|
|
693
|
-
fe_count = self._db.run(
|
|
694
|
-
"?[count(fact_id)] := *fact_entity{fact_id, entity_id}"
|
|
695
|
-
)
|
|
696
|
-
ec = entity_count.values.tolist()[0][0] if len(entity_count) > 0 else 0
|
|
697
|
-
edc = edge_count.values.tolist()[0][0] if len(edge_count) > 0 else 0
|
|
698
|
-
fec = fe_count.values.tolist()[0][0] if len(fe_count) > 0 else 0
|
|
699
|
-
return {
|
|
700
|
-
"status": "active",
|
|
701
|
-
"entities": int(ec),
|
|
702
|
-
"edges": int(edc),
|
|
703
|
-
"fact_entity": int(fec),
|
|
704
|
-
"shadow_checks": self._shadow_checks,
|
|
705
|
-
"shadow_mismatches": self._shadow_mismatches,
|
|
706
|
-
"shadow_errors": self._shadow_errors,
|
|
707
|
-
"db_path": self._db_path,
|
|
708
|
-
}
|
|
709
|
-
except Exception as exc:
|
|
710
|
-
return {
|
|
711
|
-
"status": "error",
|
|
712
|
-
"error": str(exc),
|
|
713
|
-
"db_path": self._db_path,
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
def entity_ids(self, limit: int = 1000) -> list[str]:
|
|
717
|
-
"""Return up to ``limit`` entity IDs, for scale-engine content parity.
|
|
718
|
-
|
|
719
|
-
Count parity alone cannot prove the import reproduced the right rows;
|
|
720
|
-
comparing this ID set against canonical SQLite catches an import that
|
|
721
|
-
landed the correct *number* of entities with wrong identities.
|
|
722
|
-
"""
|
|
723
|
-
try:
|
|
724
|
-
res = self._db.run("?[id] := *entity{id} :limit " + str(int(limit)))
|
|
725
|
-
return [row[0] for row in res.values.tolist()]
|
|
726
|
-
except Exception:
|
|
727
|
-
return []
|
|
728
|
-
|
|
729
|
-
# ------------------------------------------------------------------
|
|
730
|
-
# Rebuild (from SQLite canonical)
|
|
731
|
-
# ------------------------------------------------------------------
|
|
732
|
-
|
|
733
|
-
def rebuild_from_sqlite(
|
|
734
|
-
self, conn: sqlite3.Connection, profile_id: str = "default"
|
|
735
|
-
) -> int:
|
|
736
|
-
"""Drop all CozoDB data, re-import from SQLite."""
|
|
737
|
-
try:
|
|
738
|
-
self._db.run("::remove entity")
|
|
739
|
-
except Exception:
|
|
740
|
-
pass
|
|
741
|
-
try:
|
|
742
|
-
self._db.run("::remove edge")
|
|
743
|
-
except Exception:
|
|
744
|
-
pass
|
|
745
|
-
try:
|
|
746
|
-
self._db.run("::remove fact_entity")
|
|
747
|
-
except Exception:
|
|
748
|
-
pass
|
|
749
|
-
|
|
750
|
-
self._ensure_schema()
|
|
751
|
-
return self.bulk_import_from_sqlite(conn, profile_id)
|