superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory v3.4 — CodeGraph Module
|
|
4
|
-
|
|
5
|
-
"""GraphEngine — rustworkx in-memory directed graph.
|
|
6
|
-
|
|
7
|
-
Loads from SQLite via GraphStore, caches in a rustworkx PyDiGraph,
|
|
8
|
-
and provides O(1) node lookup + O(degree) traversals.
|
|
9
|
-
|
|
10
|
-
Cache invalidation: rebuild when store.version changes.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
import logging
|
|
16
|
-
from dataclasses import dataclass, field
|
|
17
|
-
from typing import Any
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.code_graph.graph_store import GraphStore
|
|
20
|
-
from superlocalmemory.code_graph.models import EdgeKind, GraphNode
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
try:
|
|
25
|
-
import rustworkx as rx # type: ignore[import-untyped]
|
|
26
|
-
except ImportError as _rx_err:
|
|
27
|
-
rx = None # type: ignore[assignment]
|
|
28
|
-
_RX_IMPORT_ERROR = _rx_err
|
|
29
|
-
else:
|
|
30
|
-
_RX_IMPORT_ERROR = None
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class RustworkxNotInstalledError(ImportError):
|
|
34
|
-
"""Raised when rustworkx is required but not installed."""
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class NodeNotFoundError(KeyError):
|
|
38
|
-
"""Raised when a node_id is not present in the graph."""
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def _require_rustworkx() -> None:
|
|
42
|
-
"""Guard: raise if rustworkx is not available."""
|
|
43
|
-
if rx is None:
|
|
44
|
-
raise RustworkxNotInstalledError(
|
|
45
|
-
"rustworkx is required for GraphEngine. "
|
|
46
|
-
"Install it with: pip install rustworkx"
|
|
47
|
-
) from _RX_IMPORT_ERROR
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# ---------------------------------------------------------------------------
|
|
51
|
-
# GraphIndex — bidirectional ID mapping
|
|
52
|
-
# ---------------------------------------------------------------------------
|
|
53
|
-
|
|
54
|
-
@dataclass(frozen=True)
|
|
55
|
-
class GraphIndex:
|
|
56
|
-
"""Bidirectional mapping between SQLite TEXT node_id and rustworkx int index."""
|
|
57
|
-
|
|
58
|
-
id_to_rx: dict[str, int] = field(default_factory=dict)
|
|
59
|
-
rx_to_id: dict[int, str] = field(default_factory=dict)
|
|
60
|
-
qname_to_id: dict[str, str] = field(default_factory=dict)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
# ---------------------------------------------------------------------------
|
|
64
|
-
# GraphEngine
|
|
65
|
-
# ---------------------------------------------------------------------------
|
|
66
|
-
|
|
67
|
-
class GraphEngine:
|
|
68
|
-
"""In-memory directed graph backed by rustworkx PyDiGraph.
|
|
69
|
-
|
|
70
|
-
Lazily built from SQLite on first query. Automatically rebuilds
|
|
71
|
-
when the underlying GraphStore version changes (writes detected).
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
def __init__(self, store: GraphStore) -> None:
|
|
75
|
-
_require_rustworkx()
|
|
76
|
-
self._store = store
|
|
77
|
-
self._graph: rx.PyDiGraph | None = None # type: ignore[name-defined]
|
|
78
|
-
self._index: GraphIndex = GraphIndex()
|
|
79
|
-
self._graph_version: int = -1
|
|
80
|
-
|
|
81
|
-
# ------------------------------------------------------------------
|
|
82
|
-
# Graph lifecycle
|
|
83
|
-
# ------------------------------------------------------------------
|
|
84
|
-
|
|
85
|
-
def build_graph(self) -> rx.PyDiGraph: # type: ignore[name-defined]
|
|
86
|
-
"""Load all nodes and edges from SQLite into a rustworkx PyDiGraph.
|
|
87
|
-
|
|
88
|
-
Returns the cached graph if the store version hasn't changed.
|
|
89
|
-
"""
|
|
90
|
-
if (
|
|
91
|
-
self._graph is not None
|
|
92
|
-
and self._graph_version == self._store.version
|
|
93
|
-
):
|
|
94
|
-
return self._graph
|
|
95
|
-
|
|
96
|
-
nodes, edges = self._store.get_all_nodes_and_edges()
|
|
97
|
-
|
|
98
|
-
graph = rx.PyDiGraph(multigraph=True)
|
|
99
|
-
|
|
100
|
-
id_to_rx: dict[str, int] = {}
|
|
101
|
-
rx_to_id: dict[int, str] = {}
|
|
102
|
-
qname_to_id: dict[str, str] = {}
|
|
103
|
-
|
|
104
|
-
# Add nodes
|
|
105
|
-
for node in nodes:
|
|
106
|
-
node_data: dict[str, Any] = {
|
|
107
|
-
"node_id": node.node_id,
|
|
108
|
-
"kind": node.kind.value,
|
|
109
|
-
"name": node.name,
|
|
110
|
-
"qualified_name": node.qualified_name,
|
|
111
|
-
"file_path": node.file_path,
|
|
112
|
-
"line_start": node.line_start,
|
|
113
|
-
"line_end": node.line_end,
|
|
114
|
-
"language": node.language,
|
|
115
|
-
"parent_name": node.parent_name,
|
|
116
|
-
"is_test": node.is_test,
|
|
117
|
-
"community_id": node.community_id,
|
|
118
|
-
}
|
|
119
|
-
rx_idx = graph.add_node(node_data)
|
|
120
|
-
id_to_rx[node.node_id] = rx_idx
|
|
121
|
-
rx_to_id[rx_idx] = node.node_id
|
|
122
|
-
qname_to_id[node.qualified_name] = node.node_id
|
|
123
|
-
|
|
124
|
-
# Add edges
|
|
125
|
-
for edge in edges:
|
|
126
|
-
src_rx = id_to_rx.get(edge.source_node_id)
|
|
127
|
-
tgt_rx = id_to_rx.get(edge.target_node_id)
|
|
128
|
-
if src_rx is None or tgt_rx is None:
|
|
129
|
-
logger.warning(
|
|
130
|
-
"Skipping dangling edge %s -> %s (kind=%s)",
|
|
131
|
-
edge.source_node_id, edge.target_node_id, edge.kind.value,
|
|
132
|
-
)
|
|
133
|
-
continue
|
|
134
|
-
edge_data: dict[str, Any] = {
|
|
135
|
-
"edge_id": edge.edge_id,
|
|
136
|
-
"kind": edge.kind.value,
|
|
137
|
-
"file_path": edge.file_path,
|
|
138
|
-
"line": edge.line,
|
|
139
|
-
"confidence": edge.confidence,
|
|
140
|
-
}
|
|
141
|
-
graph.add_edge(src_rx, tgt_rx, edge_data)
|
|
142
|
-
|
|
143
|
-
# Cache
|
|
144
|
-
self._graph = graph
|
|
145
|
-
self._index = GraphIndex(
|
|
146
|
-
id_to_rx=id_to_rx,
|
|
147
|
-
rx_to_id=rx_to_id,
|
|
148
|
-
qname_to_id=qname_to_id,
|
|
149
|
-
)
|
|
150
|
-
self._graph_version = self._store.version
|
|
151
|
-
logger.debug(
|
|
152
|
-
"Built graph: %d nodes, %d edges",
|
|
153
|
-
graph.num_nodes(), graph.num_edges(),
|
|
154
|
-
)
|
|
155
|
-
return graph
|
|
156
|
-
|
|
157
|
-
def invalidate(self) -> None:
|
|
158
|
-
"""Force a graph rebuild on next access."""
|
|
159
|
-
self._graph = None
|
|
160
|
-
self._graph_version = -1
|
|
161
|
-
|
|
162
|
-
@property
|
|
163
|
-
def index(self) -> GraphIndex:
|
|
164
|
-
"""Current graph index (builds graph if needed)."""
|
|
165
|
-
self._ensure_graph()
|
|
166
|
-
return self._index
|
|
167
|
-
|
|
168
|
-
@property
|
|
169
|
-
def graph(self) -> rx.PyDiGraph: # type: ignore[name-defined]
|
|
170
|
-
"""Current rustworkx graph (builds if needed)."""
|
|
171
|
-
return self._ensure_graph()
|
|
172
|
-
|
|
173
|
-
# ------------------------------------------------------------------
|
|
174
|
-
# Query operations
|
|
175
|
-
# ------------------------------------------------------------------
|
|
176
|
-
|
|
177
|
-
def get_callers(
|
|
178
|
-
self,
|
|
179
|
-
node_id: str,
|
|
180
|
-
edge_kinds: set[str] | None = None,
|
|
181
|
-
) -> list[dict[str, Any]]:
|
|
182
|
-
"""Return all nodes that have edges pointing *to* node_id.
|
|
183
|
-
|
|
184
|
-
Each result is ``{"node": <node_data>, "edge": <edge_data>}``.
|
|
185
|
-
"""
|
|
186
|
-
graph = self._ensure_graph()
|
|
187
|
-
rx_idx = self._resolve_rx(node_id)
|
|
188
|
-
|
|
189
|
-
results: list[dict[str, Any]] = []
|
|
190
|
-
for src_rx, _tgt_rx, edge_data in graph.in_edges(rx_idx):
|
|
191
|
-
if edge_kinds is not None and edge_data["kind"] not in edge_kinds:
|
|
192
|
-
continue
|
|
193
|
-
results.append({
|
|
194
|
-
"node": dict(graph[src_rx]),
|
|
195
|
-
"edge": dict(edge_data),
|
|
196
|
-
})
|
|
197
|
-
return results
|
|
198
|
-
|
|
199
|
-
def get_callees(
|
|
200
|
-
self,
|
|
201
|
-
node_id: str,
|
|
202
|
-
edge_kinds: set[str] | None = None,
|
|
203
|
-
) -> list[dict[str, Any]]:
|
|
204
|
-
"""Return all nodes that node_id has edges pointing *to*.
|
|
205
|
-
|
|
206
|
-
Each result is ``{"node": <node_data>, "edge": <edge_data>}``.
|
|
207
|
-
"""
|
|
208
|
-
graph = self._ensure_graph()
|
|
209
|
-
rx_idx = self._resolve_rx(node_id)
|
|
210
|
-
|
|
211
|
-
results: list[dict[str, Any]] = []
|
|
212
|
-
for _src_rx, tgt_rx, edge_data in graph.out_edges(rx_idx):
|
|
213
|
-
if edge_kinds is not None and edge_data["kind"] not in edge_kinds:
|
|
214
|
-
continue
|
|
215
|
-
results.append({
|
|
216
|
-
"node": dict(graph[tgt_rx]),
|
|
217
|
-
"edge": dict(edge_data),
|
|
218
|
-
})
|
|
219
|
-
return results
|
|
220
|
-
|
|
221
|
-
def get_tests_for(self, node_id: str) -> list[dict[str, Any]]:
|
|
222
|
-
"""Return test nodes associated with *node_id*.
|
|
223
|
-
|
|
224
|
-
Checks:
|
|
225
|
-
1. Outgoing TESTED_BY edges from node_id
|
|
226
|
-
2. Incoming CALLS edges from nodes where is_test=True
|
|
227
|
-
"""
|
|
228
|
-
graph = self._ensure_graph()
|
|
229
|
-
rx_idx = self._resolve_rx(node_id)
|
|
230
|
-
|
|
231
|
-
seen_ids: set[str] = set()
|
|
232
|
-
results: list[dict[str, Any]] = []
|
|
233
|
-
|
|
234
|
-
# Outgoing TESTED_BY
|
|
235
|
-
for _src, tgt_rx, edge_data in graph.out_edges(rx_idx):
|
|
236
|
-
if edge_data["kind"] == EdgeKind.TESTED_BY.value:
|
|
237
|
-
tgt_data = dict(graph[tgt_rx])
|
|
238
|
-
tid = tgt_data["node_id"]
|
|
239
|
-
if tid not in seen_ids:
|
|
240
|
-
seen_ids.add(tid)
|
|
241
|
-
results.append(tgt_data)
|
|
242
|
-
|
|
243
|
-
# Incoming CALLS from test nodes
|
|
244
|
-
for src_rx, _tgt, edge_data in graph.in_edges(rx_idx):
|
|
245
|
-
if edge_data["kind"] == EdgeKind.CALLS.value:
|
|
246
|
-
src_data = dict(graph[src_rx])
|
|
247
|
-
if src_data.get("is_test") and src_data["node_id"] not in seen_ids:
|
|
248
|
-
seen_ids.add(src_data["node_id"])
|
|
249
|
-
results.append(src_data)
|
|
250
|
-
|
|
251
|
-
return results
|
|
252
|
-
|
|
253
|
-
def get_connected_component(self, node_id: str) -> list[str]:
|
|
254
|
-
"""Return all node_ids in the same weakly-connected component.
|
|
255
|
-
|
|
256
|
-
Uses rustworkx.weakly_connected_components.
|
|
257
|
-
"""
|
|
258
|
-
graph = self._ensure_graph()
|
|
259
|
-
rx_idx = self._resolve_rx(node_id)
|
|
260
|
-
|
|
261
|
-
components = rx.weakly_connected_components(graph)
|
|
262
|
-
for component in components:
|
|
263
|
-
if rx_idx in component:
|
|
264
|
-
return [self._index.rx_to_id[i] for i in component]
|
|
265
|
-
|
|
266
|
-
# Shouldn't reach here if node exists, but return just the node
|
|
267
|
-
return [node_id]
|
|
268
|
-
|
|
269
|
-
def get_node_data(self, node_id: str) -> dict[str, Any]:
|
|
270
|
-
"""Return the node data dict for a node_id."""
|
|
271
|
-
graph = self._ensure_graph()
|
|
272
|
-
rx_idx = self._resolve_rx(node_id)
|
|
273
|
-
return dict(graph[rx_idx])
|
|
274
|
-
|
|
275
|
-
# ------------------------------------------------------------------
|
|
276
|
-
# Internals
|
|
277
|
-
# ------------------------------------------------------------------
|
|
278
|
-
|
|
279
|
-
def _ensure_graph(self) -> rx.PyDiGraph: # type: ignore[name-defined]
|
|
280
|
-
"""Build graph if needed and return it."""
|
|
281
|
-
if (
|
|
282
|
-
self._graph is None
|
|
283
|
-
or self._graph_version != self._store.version
|
|
284
|
-
):
|
|
285
|
-
return self.build_graph()
|
|
286
|
-
return self._graph
|
|
287
|
-
|
|
288
|
-
def _resolve_rx(self, node_id: str) -> int:
|
|
289
|
-
"""Resolve a TEXT node_id to a rustworkx index. Raises NodeNotFoundError."""
|
|
290
|
-
rx_idx = self._index.id_to_rx.get(node_id)
|
|
291
|
-
if rx_idx is None:
|
|
292
|
-
raise NodeNotFoundError(
|
|
293
|
-
f"Node '{node_id}' not found in graph"
|
|
294
|
-
)
|
|
295
|
-
return rx_idx
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory v3.4 — CodeGraph Module
|
|
4
|
-
|
|
5
|
-
"""GraphStore — thin graph-specific layer over CodeGraphDatabase.
|
|
6
|
-
|
|
7
|
-
All graph writes go through this layer. Provides:
|
|
8
|
-
- Atomic file replacement (store_file_nodes_edges)
|
|
9
|
-
- Bulk read for in-memory graph building (get_all_nodes_and_edges)
|
|
10
|
-
- File removal (remove_file)
|
|
11
|
-
- Version tracking for cache invalidation
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import logging
|
|
17
|
-
from typing import Sequence
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.code_graph.database import CodeGraphDatabase
|
|
20
|
-
from superlocalmemory.code_graph.models import (
|
|
21
|
-
FileRecord,
|
|
22
|
-
GraphEdge,
|
|
23
|
-
GraphNode,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger(__name__)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class GraphStore:
|
|
30
|
-
"""SQLite persistence layer for graph nodes, edges, and file records.
|
|
31
|
-
|
|
32
|
-
Delegates to CodeGraphDatabase but adds higher-level operations
|
|
33
|
-
that Phase 2+ modules depend on (bulk load, atomic replace, version).
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
def __init__(self, db: CodeGraphDatabase) -> None:
|
|
37
|
-
self._db = db
|
|
38
|
-
|
|
39
|
-
# ------------------------------------------------------------------
|
|
40
|
-
# Properties
|
|
41
|
-
# ------------------------------------------------------------------
|
|
42
|
-
|
|
43
|
-
@property
|
|
44
|
-
def db(self) -> CodeGraphDatabase:
|
|
45
|
-
"""Underlying database instance."""
|
|
46
|
-
return self._db
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def version(self) -> int:
|
|
50
|
-
"""Monotonic write-version for cache invalidation."""
|
|
51
|
-
return self._db.version
|
|
52
|
-
|
|
53
|
-
# ------------------------------------------------------------------
|
|
54
|
-
# Write operations
|
|
55
|
-
# ------------------------------------------------------------------
|
|
56
|
-
|
|
57
|
-
def store_file_nodes_edges(
|
|
58
|
-
self,
|
|
59
|
-
file_path: str,
|
|
60
|
-
nodes: Sequence[GraphNode],
|
|
61
|
-
edges: Sequence[GraphEdge],
|
|
62
|
-
file_record: FileRecord,
|
|
63
|
-
) -> None:
|
|
64
|
-
"""Atomically replace all data for *file_path*.
|
|
65
|
-
|
|
66
|
-
Within a single transaction:
|
|
67
|
-
1. Delete old edges for this file
|
|
68
|
-
2. Delete old nodes for this file
|
|
69
|
-
3. Insert new nodes
|
|
70
|
-
4. Insert new edges
|
|
71
|
-
5. Upsert file record
|
|
72
|
-
|
|
73
|
-
Fix B — Defensive pre-filter:
|
|
74
|
-
Before delegating to the DB, drop any edge whose source_node_id or
|
|
75
|
-
target_node_id is absent from *both* the local node set AND the
|
|
76
|
-
database. This guards the incremental update path (update_code_graph
|
|
77
|
-
→ parse_file → here) which does not run the parse_all resolver
|
|
78
|
-
pipeline. After a full build, parse_all's resolution pass should make
|
|
79
|
-
this a no-op; the filter is a belt-and-braces against partial runs.
|
|
80
|
-
|
|
81
|
-
DO NOT fix by disabling the FK — the FK is correct and protects graph
|
|
82
|
-
integrity.
|
|
83
|
-
"""
|
|
84
|
-
# ── build valid-id set: local nodes ──────────────────────────────
|
|
85
|
-
#
|
|
86
|
-
# REPLACE semantics: `store_file_parse_results` uses INSERT OR REPLACE.
|
|
87
|
-
# graph_nodes has a UNIQUE constraint on `qualified_name`. When two
|
|
88
|
-
# nodes share a qualified_name (e.g. a @property getter AND setter, or
|
|
89
|
-
# a function defined twice in source), the LATER insert wins — the
|
|
90
|
-
# EARLIER node is deleted via REPLACE, and ON DELETE CASCADE removes
|
|
91
|
-
# any edges that already referenced it. We simulate this here: only
|
|
92
|
-
# the LAST node per qualified_name survives; edges referencing the
|
|
93
|
-
# earlier "losers" must be dropped before we reach the DB.
|
|
94
|
-
qn_last: dict[str, GraphNode] = {}
|
|
95
|
-
for n in nodes:
|
|
96
|
-
qn_last[n.qualified_name] = n # last occurrence wins
|
|
97
|
-
surviving_ids = {n.node_id for n in qn_last.values()}
|
|
98
|
-
|
|
99
|
-
# Collect foreign endpoints (not satisfied locally) for a single
|
|
100
|
-
# batch DB check — avoids N+1 queries.
|
|
101
|
-
foreign_ids: set[str] = set()
|
|
102
|
-
for edge in edges:
|
|
103
|
-
if edge.source_node_id not in surviving_ids:
|
|
104
|
-
foreign_ids.add(edge.source_node_id)
|
|
105
|
-
if edge.target_node_id not in surviving_ids:
|
|
106
|
-
foreign_ids.add(edge.target_node_id)
|
|
107
|
-
|
|
108
|
-
db_ids: set[str] = set()
|
|
109
|
-
if foreign_ids:
|
|
110
|
-
placeholders = ",".join("?" * len(foreign_ids))
|
|
111
|
-
rows = self._db.execute(
|
|
112
|
-
f"SELECT node_id FROM graph_nodes WHERE node_id IN ({placeholders})",
|
|
113
|
-
tuple(foreign_ids),
|
|
114
|
-
)
|
|
115
|
-
db_ids = {row["node_id"] for row in rows}
|
|
116
|
-
|
|
117
|
-
valid_ids = surviving_ids | db_ids
|
|
118
|
-
|
|
119
|
-
safe_edges: list[GraphEdge] = []
|
|
120
|
-
dropped = 0
|
|
121
|
-
for edge in edges:
|
|
122
|
-
if edge.source_node_id in valid_ids and edge.target_node_id in valid_ids:
|
|
123
|
-
safe_edges.append(edge)
|
|
124
|
-
else:
|
|
125
|
-
dropped += 1
|
|
126
|
-
logger.debug(
|
|
127
|
-
"store_file_nodes_edges: dropped dangling edge %s→%s "
|
|
128
|
-
"for file %s (resolver may not have run on this path)",
|
|
129
|
-
edge.source_node_id, edge.target_node_id, file_path,
|
|
130
|
-
)
|
|
131
|
-
if dropped:
|
|
132
|
-
logger.debug(
|
|
133
|
-
"store_file_nodes_edges: total %d dangling edge(s) dropped for %s",
|
|
134
|
-
dropped, file_path,
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
self._db.store_file_parse_results(
|
|
138
|
-
file_path,
|
|
139
|
-
list(nodes),
|
|
140
|
-
safe_edges,
|
|
141
|
-
file_record,
|
|
142
|
-
)
|
|
143
|
-
logger.debug(
|
|
144
|
-
"Stored %d nodes, %d edges for %s",
|
|
145
|
-
len(nodes), len(safe_edges), file_path,
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
def commit_build_batch(
|
|
149
|
-
self,
|
|
150
|
-
batch: list[tuple[str, list[GraphNode], list[GraphEdge], FileRecord]],
|
|
151
|
-
) -> None:
|
|
152
|
-
"""Two-phase bulk commit — order-independent storage for full builds.
|
|
153
|
-
|
|
154
|
-
The single-file ``store_file_nodes_edges`` is insertion-order-
|
|
155
|
-
dependent: when a caller file (a.py, has CALLS foo→bar) is stored
|
|
156
|
-
before the callee file (b.py, defines bar), the cross-file CALLS
|
|
157
|
-
edge is dropped because Fix-B's DB existence check for bar.node_id
|
|
158
|
-
fails (b.py has not been stored yet).
|
|
159
|
-
|
|
160
|
-
This method fixes the root cause by separating commits into two
|
|
161
|
-
phases, both executed in a single atomic transaction:
|
|
162
|
-
|
|
163
|
-
**Phase 1 — all nodes**: for every file in the batch, delete old
|
|
164
|
-
data and insert new nodes. After Phase 1, every node_id from every
|
|
165
|
-
file in the batch is present in ``graph_nodes``.
|
|
166
|
-
|
|
167
|
-
**Phase 2 — all edges**: for every file, validate endpoints (the DB
|
|
168
|
-
existence check now finds callee nodes regardless of file order) and
|
|
169
|
-
insert qualifying edges.
|
|
170
|
-
|
|
171
|
-
Design pattern: *Separated Phases*. Interleaved per-file commits
|
|
172
|
-
(the existing loop) are O(1) transaction boundaries but
|
|
173
|
-
insertion-order-dependent. Separated phases add one extra pass but
|
|
174
|
-
are fully order-independent.
|
|
175
|
-
|
|
176
|
-
Use this for full builds (``build_code_graph``). Single-file
|
|
177
|
-
updates (``update_code_graph``) continue to use
|
|
178
|
-
``store_file_nodes_edges`` — the callee nodes from other files are
|
|
179
|
-
already in the DB from the previous build, so no ordering issue.
|
|
180
|
-
"""
|
|
181
|
-
if not batch:
|
|
182
|
-
return
|
|
183
|
-
|
|
184
|
-
with self._db.transaction():
|
|
185
|
-
# ── Phase 1: delete old data + insert all new nodes ───────────
|
|
186
|
-
#
|
|
187
|
-
# Edges must be deleted before nodes (FK constraint prevents
|
|
188
|
-
# deleting a node that an edge still references). We delete ALL
|
|
189
|
-
# file edges across the whole batch first, then delete nodes.
|
|
190
|
-
# This avoids cascade surprises when file A's nodes are deleted
|
|
191
|
-
# before file B's edges that target those nodes are cleaned up.
|
|
192
|
-
for fp, _, _, _ in batch:
|
|
193
|
-
self._db.delete_edges_by_file(fp)
|
|
194
|
-
for fp, nodes, _, fr in batch:
|
|
195
|
-
self._db.delete_nodes_by_file(fp)
|
|
196
|
-
for node in nodes:
|
|
197
|
-
self._db.upsert_node(node)
|
|
198
|
-
self._db.upsert_file_record(fr)
|
|
199
|
-
|
|
200
|
-
# ── Phase 2: validate + insert all edges ──────────────────────
|
|
201
|
-
#
|
|
202
|
-
# All node_ids from Phase 1 are now in graph_nodes, so the
|
|
203
|
-
# batch-DB check for cross-file foreign endpoints succeeds
|
|
204
|
-
# regardless of which file was stored first.
|
|
205
|
-
total_dropped = 0
|
|
206
|
-
for fp, nodes, edges, _ in batch:
|
|
207
|
-
# Simulate INSERT OR REPLACE dedup: only the last node per
|
|
208
|
-
# qualified_name survives; edges referencing earlier losers
|
|
209
|
-
# must be pre-dropped (mirrors store_file_nodes_edges logic).
|
|
210
|
-
qn_last: dict[str, GraphNode] = {}
|
|
211
|
-
for n in nodes:
|
|
212
|
-
qn_last[n.qualified_name] = n
|
|
213
|
-
surviving_ids = {n.node_id for n in qn_last.values()}
|
|
214
|
-
|
|
215
|
-
# Batch-check foreign endpoints against DB (avoids N+1).
|
|
216
|
-
foreign_ids: set[str] = set()
|
|
217
|
-
for edge in edges:
|
|
218
|
-
if edge.source_node_id not in surviving_ids:
|
|
219
|
-
foreign_ids.add(edge.source_node_id)
|
|
220
|
-
if edge.target_node_id not in surviving_ids:
|
|
221
|
-
foreign_ids.add(edge.target_node_id)
|
|
222
|
-
|
|
223
|
-
db_ids: set[str] = set()
|
|
224
|
-
if foreign_ids:
|
|
225
|
-
placeholders = ",".join("?" * len(foreign_ids))
|
|
226
|
-
rows = self._db.execute(
|
|
227
|
-
f"SELECT node_id FROM graph_nodes "
|
|
228
|
-
f"WHERE node_id IN ({placeholders})",
|
|
229
|
-
tuple(foreign_ids),
|
|
230
|
-
)
|
|
231
|
-
db_ids = {row["node_id"] for row in rows}
|
|
232
|
-
|
|
233
|
-
valid_ids = surviving_ids | db_ids
|
|
234
|
-
dropped = 0
|
|
235
|
-
for edge in edges:
|
|
236
|
-
if (
|
|
237
|
-
edge.source_node_id in valid_ids
|
|
238
|
-
and edge.target_node_id in valid_ids
|
|
239
|
-
):
|
|
240
|
-
self._db.upsert_edge(edge)
|
|
241
|
-
else:
|
|
242
|
-
dropped += 1
|
|
243
|
-
logger.debug(
|
|
244
|
-
"commit_build_batch: dropped dangling edge "
|
|
245
|
-
"%s→%s for %s",
|
|
246
|
-
edge.source_node_id, edge.target_node_id, fp,
|
|
247
|
-
)
|
|
248
|
-
if dropped:
|
|
249
|
-
total_dropped += dropped
|
|
250
|
-
logger.debug(
|
|
251
|
-
"commit_build_batch: %d dangling edge(s) dropped for %s",
|
|
252
|
-
dropped, fp,
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
if total_dropped:
|
|
256
|
-
logger.debug(
|
|
257
|
-
"commit_build_batch: total %d dangling edges dropped across "
|
|
258
|
-
"batch of %d files",
|
|
259
|
-
total_dropped, len(batch),
|
|
260
|
-
)
|
|
261
|
-
logger.debug("commit_build_batch: committed %d files", len(batch))
|
|
262
|
-
|
|
263
|
-
def remove_file(self, file_path: str) -> None:
|
|
264
|
-
"""Remove all graph data for *file_path*.
|
|
265
|
-
|
|
266
|
-
Deletes nodes (cascade → edges via FK), edges sourced from this
|
|
267
|
-
file, and the file record. All within a transaction.
|
|
268
|
-
"""
|
|
269
|
-
with self._db.transaction():
|
|
270
|
-
self._db.delete_edges_by_file(file_path)
|
|
271
|
-
self._db.delete_nodes_by_file(file_path)
|
|
272
|
-
self._db.delete_file_record(file_path)
|
|
273
|
-
logger.debug("Removed all data for %s", file_path)
|
|
274
|
-
|
|
275
|
-
# ------------------------------------------------------------------
|
|
276
|
-
# Read operations
|
|
277
|
-
# ------------------------------------------------------------------
|
|
278
|
-
|
|
279
|
-
def get_all_nodes_and_edges(
|
|
280
|
-
self,
|
|
281
|
-
) -> tuple[list[GraphNode], list[GraphEdge]]:
|
|
282
|
-
"""Load every node and edge — used by GraphEngine.build_graph().
|
|
283
|
-
|
|
284
|
-
Returns (nodes, edges) as plain lists.
|
|
285
|
-
"""
|
|
286
|
-
nodes = self._db.get_all_nodes()
|
|
287
|
-
edges = self._db.get_all_edges()
|
|
288
|
-
return nodes, edges
|
|
289
|
-
|
|
290
|
-
def get_nodes_by_file(self, file_path: str) -> list[GraphNode]:
|
|
291
|
-
"""All nodes in *file_path*, ordered by line_start."""
|
|
292
|
-
return self._db.get_nodes_by_file(file_path)
|
|
293
|
-
|
|
294
|
-
def get_node(self, node_id: str) -> GraphNode | None:
|
|
295
|
-
"""Single node by ID."""
|
|
296
|
-
return self._db.get_node(node_id)
|
|
297
|
-
|
|
298
|
-
def get_file_record(self, file_path: str) -> FileRecord | None:
|
|
299
|
-
"""File record by path."""
|
|
300
|
-
return self._db.get_file_record(file_path)
|
|
301
|
-
|
|
302
|
-
def get_all_file_records(self) -> list[FileRecord]:
|
|
303
|
-
"""All tracked file records."""
|
|
304
|
-
return self._db.get_all_file_records()
|
|
305
|
-
|
|
306
|
-
# ------------------------------------------------------------------
|
|
307
|
-
# Dependent tracing (used by IncrementalUpdater)
|
|
308
|
-
# ------------------------------------------------------------------
|
|
309
|
-
|
|
310
|
-
def find_dependents(self, file_path: str) -> set[str]:
|
|
311
|
-
"""Return file paths that have edges *targeting* nodes in *file_path*.
|
|
312
|
-
|
|
313
|
-
Looks for IMPORTS, CALLS, INHERITS, DEPENDS_ON edges whose
|
|
314
|
-
target lives in *file_path* but whose source is in a *different* file.
|
|
315
|
-
"""
|
|
316
|
-
rows = self._db.execute(
|
|
317
|
-
"""
|
|
318
|
-
SELECT DISTINCT ge.file_path
|
|
319
|
-
FROM graph_edges ge
|
|
320
|
-
JOIN graph_nodes gn_target
|
|
321
|
-
ON ge.target_node_id = gn_target.node_id
|
|
322
|
-
WHERE gn_target.file_path = ?
|
|
323
|
-
AND ge.file_path != ?
|
|
324
|
-
""",
|
|
325
|
-
(file_path, file_path),
|
|
326
|
-
)
|
|
327
|
-
return {row["file_path"] for row in rows}
|
|
328
|
-
|
|
329
|
-
# ------------------------------------------------------------------
|
|
330
|
-
# Stats
|
|
331
|
-
# ------------------------------------------------------------------
|
|
332
|
-
|
|
333
|
-
def get_stats(self) -> dict[str, int]:
|
|
334
|
-
"""Delegate to DB stats."""
|
|
335
|
-
return self._db.get_stats()
|