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,356 +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
|
-
"""Entity Compilation Engine — auto-generates compiled truth per entity.
|
|
6
|
-
|
|
7
|
-
Builds knowledge summaries using PageRank centrality + Louvain community detection
|
|
8
|
-
(Mode A extractive) or local LLM (Mode B). Per-project, per-profile scoping.
|
|
9
|
-
2000 character hard limit. Read-only layer — never replaces atomic facts.
|
|
10
|
-
|
|
11
|
-
Runs after consolidation (every 6 hours or on-demand).
|
|
12
|
-
|
|
13
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
14
|
-
License: AGPL-3.0-or-later
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import json
|
|
20
|
-
import logging
|
|
21
|
-
import time
|
|
22
|
-
import uuid
|
|
23
|
-
from datetime import datetime, timezone
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger("superlocalmemory.entity_compiler")
|
|
27
|
-
|
|
28
|
-
_MAX_COMPILED_TRUTH_CHARS = 2000
|
|
29
|
-
_MAX_TIMELINE_ENTRIES = 100
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class EntityCompiler:
|
|
33
|
-
"""Compiles knowledge summaries for entities from atomic facts.
|
|
34
|
-
|
|
35
|
-
Mode A: Extractive (no LLM) — PageRank + Louvain + top sentences
|
|
36
|
-
Mode B: Local LLM via Ollama — prompt with top facts
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
def __init__(self, memory_db: str | Path, config=None):
|
|
40
|
-
self._db_path = str(memory_db)
|
|
41
|
-
self._config = config
|
|
42
|
-
self._mode = "a"
|
|
43
|
-
if config:
|
|
44
|
-
mode = getattr(config, 'mode', None)
|
|
45
|
-
if mode:
|
|
46
|
-
self._mode = getattr(mode, 'value', str(mode)).lower()
|
|
47
|
-
|
|
48
|
-
def compile_all(self, profile_id: str) -> dict:
|
|
49
|
-
"""Compile all entities that have new facts across all projects.
|
|
50
|
-
|
|
51
|
-
Returns stats: {compiled: N, skipped: N, errors: N}
|
|
52
|
-
|
|
53
|
-
Concurrency fix (v3.8.4): each operation uses a scoped connection via
|
|
54
|
-
memory_read() / memory_write() so the process write lock is never held
|
|
55
|
-
across Ollama / network calls and no long raw connection is kept open.
|
|
56
|
-
"""
|
|
57
|
-
from superlocalmemory.storage.memory_write import memory_read
|
|
58
|
-
|
|
59
|
-
if self._config and not getattr(self._config, 'entity_compilation_enabled', True):
|
|
60
|
-
return {"compiled": 0, "skipped": 0, "errors": 0, "reason": "disabled"}
|
|
61
|
-
|
|
62
|
-
stats = {"compiled": 0, "skipped": 0, "errors": 0}
|
|
63
|
-
|
|
64
|
-
with memory_read(self._db_path) as conn:
|
|
65
|
-
projects = conn.execute(
|
|
66
|
-
"SELECT DISTINCT project_name FROM entity_profiles WHERE profile_id = ?",
|
|
67
|
-
(profile_id,),
|
|
68
|
-
).fetchall()
|
|
69
|
-
project_names = [r[0] for r in projects] if projects else [""]
|
|
70
|
-
|
|
71
|
-
for project_name in project_names:
|
|
72
|
-
result = self._compile_project(profile_id, project_name)
|
|
73
|
-
stats["compiled"] += result["compiled"]
|
|
74
|
-
stats["skipped"] += result["skipped"]
|
|
75
|
-
stats["errors"] += result["errors"]
|
|
76
|
-
|
|
77
|
-
if stats["compiled"] > 0:
|
|
78
|
-
logger.info("Entity compilation: %d compiled, %d skipped, %d errors",
|
|
79
|
-
stats["compiled"], stats["skipped"], stats["errors"])
|
|
80
|
-
return stats
|
|
81
|
-
|
|
82
|
-
def compile_entity(self, profile_id: str, project_name: str,
|
|
83
|
-
entity_id: str, entity_name: str) -> dict | None:
|
|
84
|
-
"""Compile a single entity. Returns compiled truth or None."""
|
|
85
|
-
return self._compile_single(profile_id, project_name, entity_id, entity_name)
|
|
86
|
-
|
|
87
|
-
def _compile_project(self, profile_id: str, project_name: str) -> dict:
|
|
88
|
-
"""Compile all entities needing update in a project.
|
|
89
|
-
|
|
90
|
-
Uses scoped memory_read() for the entity query so no connection is
|
|
91
|
-
held across entity compilation iterations.
|
|
92
|
-
"""
|
|
93
|
-
from superlocalmemory.storage.memory_write import memory_read
|
|
94
|
-
|
|
95
|
-
stats = {"compiled": 0, "skipped": 0, "errors": 0}
|
|
96
|
-
|
|
97
|
-
with memory_read(self._db_path) as conn:
|
|
98
|
-
entities = conn.execute("""
|
|
99
|
-
SELECT DISTINCT ce.entity_id, ce.canonical_name, ce.entity_type
|
|
100
|
-
FROM canonical_entities ce
|
|
101
|
-
WHERE ce.profile_id = ?
|
|
102
|
-
AND (
|
|
103
|
-
EXISTS (
|
|
104
|
-
SELECT 1 FROM atomic_facts af
|
|
105
|
-
WHERE af.canonical_entities_json LIKE '%' || ce.entity_id || '%'
|
|
106
|
-
AND af.profile_id = ?
|
|
107
|
-
AND af.created_at > COALESCE(
|
|
108
|
-
(SELECT last_compiled_at FROM entity_profiles
|
|
109
|
-
WHERE entity_id = ce.entity_id
|
|
110
|
-
AND profile_id = ?
|
|
111
|
-
AND project_name = ?),
|
|
112
|
-
'1970-01-01')
|
|
113
|
-
)
|
|
114
|
-
OR NOT EXISTS (
|
|
115
|
-
SELECT 1 FROM entity_profiles
|
|
116
|
-
WHERE entity_id = ce.entity_id
|
|
117
|
-
AND profile_id = ?
|
|
118
|
-
AND project_name = ?
|
|
119
|
-
AND last_compiled_at IS NOT NULL
|
|
120
|
-
)
|
|
121
|
-
)
|
|
122
|
-
""", (profile_id, profile_id, profile_id, project_name,
|
|
123
|
-
profile_id, project_name)).fetchall()
|
|
124
|
-
# Detach rows from the read connection before closing it
|
|
125
|
-
entities = [dict(e) for e in entities]
|
|
126
|
-
|
|
127
|
-
for entity in entities:
|
|
128
|
-
try:
|
|
129
|
-
result = self._compile_single(
|
|
130
|
-
profile_id, project_name,
|
|
131
|
-
entity["entity_id"], entity["canonical_name"],
|
|
132
|
-
entity_type=entity["entity_type"],
|
|
133
|
-
)
|
|
134
|
-
if result:
|
|
135
|
-
stats["compiled"] += 1
|
|
136
|
-
else:
|
|
137
|
-
stats["skipped"] += 1
|
|
138
|
-
except Exception as exc:
|
|
139
|
-
logger.debug("Entity compilation error for %s: %s",
|
|
140
|
-
entity["canonical_name"], exc)
|
|
141
|
-
stats["errors"] += 1
|
|
142
|
-
|
|
143
|
-
return stats
|
|
144
|
-
|
|
145
|
-
def _compile_single(self, profile_id: str,
|
|
146
|
-
project_name: str, entity_id: str, entity_name: str,
|
|
147
|
-
entity_type: str = "unknown") -> dict | None:
|
|
148
|
-
"""Compile one entity. Returns the compiled truth dict or None.
|
|
149
|
-
|
|
150
|
-
Concurrency fix (v3.8.4): reads use memory_read(), writes use
|
|
151
|
-
memory_write(). The Ollama call (Mode B) happens with NO lock held.
|
|
152
|
-
Lock-ordering invariant preserved: get_write_lock (outermost) →
|
|
153
|
-
sqlite BEGIN ... COMMIT.
|
|
154
|
-
"""
|
|
155
|
-
from superlocalmemory.storage.memory_write import memory_read, memory_write
|
|
156
|
-
|
|
157
|
-
# ── Phase 1: read facts (no write lock) ──────────────────────────────
|
|
158
|
-
with memory_read(self._db_path) as conn:
|
|
159
|
-
facts = conn.execute("""
|
|
160
|
-
SELECT af.fact_id, af.content, af.confidence, af.created_at,
|
|
161
|
-
fi.pagerank_score, fi.community_id
|
|
162
|
-
FROM atomic_facts af
|
|
163
|
-
LEFT JOIN fact_importance fi ON af.fact_id = fi.fact_id
|
|
164
|
-
WHERE af.canonical_entities_json LIKE ? AND af.profile_id = ?
|
|
165
|
-
ORDER BY fi.pagerank_score DESC NULLS LAST, af.confidence DESC
|
|
166
|
-
LIMIT 50
|
|
167
|
-
""", (f"%{entity_id}%", profile_id)).fetchall()
|
|
168
|
-
facts = [dict(f) for f in facts]
|
|
169
|
-
|
|
170
|
-
if not facts:
|
|
171
|
-
return None
|
|
172
|
-
|
|
173
|
-
# There was a second PageRank here, and it made recall worse.
|
|
174
|
-
#
|
|
175
|
-
# On finding no score for this entity's facts it built a COMPLETE graph
|
|
176
|
-
# over them -- every pair joined, weight 0.5 -- and ran PageRank on it.
|
|
177
|
-
# PageRank of K_n is uniformly 1/n, so every fact received the identical
|
|
178
|
-
# score and the re-fetch's ORDER BY fell straight through to confidence,
|
|
179
|
-
# which is what had ordered them in the first place. It bought nothing.
|
|
180
|
-
#
|
|
181
|
-
# What it cost: that 1/n landed in the same column the ranker reads as a
|
|
182
|
-
# whole-graph score. On the author's store, ten facts from one 10-fact
|
|
183
|
-
# cluster were written 0.1 each, against a real whole-graph maximum of
|
|
184
|
-
# 0.008744 and median of 0.000214 -- eleven times the largest true score
|
|
185
|
-
# and roughly 470x the median. The hop boost min(1 + pr*2, 2) gave them
|
|
186
|
-
# 1.2 where every real memory got 1.0004, and the ten of them together
|
|
187
|
-
# carried as much PageRank mass as the other 2,988 facts combined (the
|
|
188
|
-
# table summed to 1.9999 instead of 1). They were also written with no
|
|
189
|
-
# community, so the community bias could not see them either.
|
|
190
|
-
#
|
|
191
|
-
# Whole-graph metrics belong to core/graph_metrics, which owns this
|
|
192
|
-
# table. Ordering for compilation is confidence, as it always effectively
|
|
193
|
-
# was.
|
|
194
|
-
|
|
195
|
-
# ── Phase 3: generate compiled truth — NO write lock held ────────────
|
|
196
|
-
# Mode B calls Ollama (up to 30 s) — write lock MUST NOT be held here.
|
|
197
|
-
if self._mode in ("b", "c") and len(facts) > 3:
|
|
198
|
-
compiled = self._compile_mode_b(entity_name, facts)
|
|
199
|
-
if not compiled:
|
|
200
|
-
compiled = self._compile_mode_a(entity_name, entity_type, facts)
|
|
201
|
-
else:
|
|
202
|
-
compiled = self._compile_mode_a(entity_name, entity_type, facts)
|
|
203
|
-
|
|
204
|
-
compiled = self._truncate(compiled, _MAX_COMPILED_TRUTH_CHARS)
|
|
205
|
-
|
|
206
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
207
|
-
timeline_entry = {
|
|
208
|
-
"date": now,
|
|
209
|
-
"action": "compiled",
|
|
210
|
-
"facts_used": len(facts),
|
|
211
|
-
"mode": self._mode,
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
fact_ids = [f["fact_id"] for f in facts]
|
|
215
|
-
avg_conf = sum(f["confidence"] or 0.5 for f in facts) / max(len(facts), 1)
|
|
216
|
-
|
|
217
|
-
# ── Phase 4: short write — hold write lock for INSERT/UPDATE only ────
|
|
218
|
-
with memory_write(self._db_path) as conn:
|
|
219
|
-
# Re-read inside the write lock for correct timeline merge and to
|
|
220
|
-
# decide INSERT vs UPDATE atomically (prevents lost-update race).
|
|
221
|
-
existing = conn.execute(
|
|
222
|
-
"SELECT timeline, profile_entry_id FROM entity_profiles "
|
|
223
|
-
"WHERE entity_id = ? AND profile_id = ? AND project_name = ?",
|
|
224
|
-
(entity_id, profile_id, project_name),
|
|
225
|
-
).fetchone()
|
|
226
|
-
|
|
227
|
-
timeline: list = []
|
|
228
|
-
if existing and existing["timeline"]:
|
|
229
|
-
try:
|
|
230
|
-
timeline = json.loads(existing["timeline"])
|
|
231
|
-
except (json.JSONDecodeError, TypeError):
|
|
232
|
-
timeline = []
|
|
233
|
-
timeline.append(timeline_entry)
|
|
234
|
-
if len(timeline) > _MAX_TIMELINE_ENTRIES:
|
|
235
|
-
timeline = timeline[-_MAX_TIMELINE_ENTRIES:]
|
|
236
|
-
|
|
237
|
-
if existing:
|
|
238
|
-
conn.execute("""
|
|
239
|
-
UPDATE entity_profiles SET
|
|
240
|
-
compiled_truth = ?, timeline = ?, fact_ids_json = ?,
|
|
241
|
-
last_compiled_at = ?, compilation_confidence = ?,
|
|
242
|
-
last_updated = ?
|
|
243
|
-
WHERE entity_id = ? AND profile_id = ? AND project_name = ?
|
|
244
|
-
""", (compiled, json.dumps(timeline), json.dumps(fact_ids),
|
|
245
|
-
now, round(avg_conf, 3), now,
|
|
246
|
-
entity_id, profile_id, project_name))
|
|
247
|
-
else:
|
|
248
|
-
entry_id = str(uuid.uuid4())[:16]
|
|
249
|
-
conn.execute("""
|
|
250
|
-
INSERT INTO entity_profiles
|
|
251
|
-
(profile_entry_id, entity_id, profile_id, project_name,
|
|
252
|
-
knowledge_summary, compiled_truth, timeline, fact_ids_json,
|
|
253
|
-
last_compiled_at, compilation_confidence, last_updated)
|
|
254
|
-
VALUES (?, ?, ?, ?, '', ?, ?, ?, ?, ?, ?)
|
|
255
|
-
""", (entry_id, entity_id, profile_id, project_name,
|
|
256
|
-
compiled, json.dumps(timeline), json.dumps(fact_ids),
|
|
257
|
-
now, round(avg_conf, 3), now))
|
|
258
|
-
|
|
259
|
-
return {
|
|
260
|
-
"entity_name": entity_name,
|
|
261
|
-
"compiled_truth": compiled,
|
|
262
|
-
"facts_used": len(facts),
|
|
263
|
-
"confidence": round(avg_conf, 3),
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
# -- Mode A: Extractive (no LLM) --
|
|
267
|
-
|
|
268
|
-
def _compile_mode_a(self, entity_name: str, entity_type: str,
|
|
269
|
-
facts: list) -> str:
|
|
270
|
-
"""Extract top sentences by PageRank, grouped by community."""
|
|
271
|
-
header = f"{entity_name}"
|
|
272
|
-
if entity_type and entity_type != "unknown":
|
|
273
|
-
header += f" ({entity_type})"
|
|
274
|
-
header += "\n"
|
|
275
|
-
|
|
276
|
-
# Group facts by community
|
|
277
|
-
communities: dict[int, list] = {}
|
|
278
|
-
for f in facts:
|
|
279
|
-
cid = f["community_id"] or 0
|
|
280
|
-
communities.setdefault(cid, []).append(f)
|
|
281
|
-
|
|
282
|
-
sentences = []
|
|
283
|
-
seen_content = set()
|
|
284
|
-
for cid in sorted(communities.keys()):
|
|
285
|
-
community_facts = communities[cid]
|
|
286
|
-
# Top 3 facts per community
|
|
287
|
-
for fact in community_facts[:3]:
|
|
288
|
-
content = fact["content"]
|
|
289
|
-
# Extract first sentence
|
|
290
|
-
first_sent = content.split(". ")[0].strip()
|
|
291
|
-
if not first_sent.endswith("."):
|
|
292
|
-
first_sent += "."
|
|
293
|
-
# Dedup by exact match
|
|
294
|
-
normalized = first_sent.lower().strip()
|
|
295
|
-
if normalized not in seen_content:
|
|
296
|
-
seen_content.add(normalized)
|
|
297
|
-
sentences.append(first_sent)
|
|
298
|
-
|
|
299
|
-
body = " ".join(sentences)
|
|
300
|
-
return header + body
|
|
301
|
-
|
|
302
|
-
# -- Mode B: LLM via Ollama --
|
|
303
|
-
|
|
304
|
-
def _compile_mode_b(self, entity_name: str, facts: list) -> str | None:
|
|
305
|
-
"""Summarize via local LLM (Ollama). Returns None on failure."""
|
|
306
|
-
try:
|
|
307
|
-
import urllib.request
|
|
308
|
-
api_base = "http://localhost:11434"
|
|
309
|
-
if self._config and hasattr(self._config, 'llm'):
|
|
310
|
-
api_base = getattr(self._config.llm, 'api_base', api_base) or api_base
|
|
311
|
-
model = "llama3.2"
|
|
312
|
-
if self._config and hasattr(self._config, 'llm'):
|
|
313
|
-
model = getattr(self._config.llm, 'model', model) or model
|
|
314
|
-
|
|
315
|
-
top_facts = "\n".join(
|
|
316
|
-
f"- {f['content']}" for f in facts[:20]
|
|
317
|
-
)
|
|
318
|
-
prompt = (
|
|
319
|
-
f"Summarize these facts about {entity_name} into a concise profile. "
|
|
320
|
-
f"Maximum 2000 characters. Include key relationships, decisions, status. "
|
|
321
|
-
f"Organize by topic, not chronology. Flag contradictions.\n\n"
|
|
322
|
-
f"Facts (by importance):\n{top_facts}"
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
payload = json.dumps({
|
|
326
|
-
"model": model,
|
|
327
|
-
"prompt": prompt,
|
|
328
|
-
"stream": False,
|
|
329
|
-
"options": {"num_predict": 500},
|
|
330
|
-
}).encode()
|
|
331
|
-
|
|
332
|
-
req = urllib.request.Request(
|
|
333
|
-
f"{api_base}/api/generate",
|
|
334
|
-
data=payload,
|
|
335
|
-
headers={"Content-Type": "application/json"},
|
|
336
|
-
)
|
|
337
|
-
resp = urllib.request.urlopen(req, timeout=30)
|
|
338
|
-
result = json.loads(resp.read().decode())
|
|
339
|
-
text = result.get("response", "").strip()
|
|
340
|
-
return text if text else None
|
|
341
|
-
except Exception as exc:
|
|
342
|
-
logger.debug("Mode B compilation failed, falling back to Mode A: %s", exc)
|
|
343
|
-
return None
|
|
344
|
-
|
|
345
|
-
# -- Helpers --
|
|
346
|
-
|
|
347
|
-
@staticmethod
|
|
348
|
-
def _truncate(text: str, max_chars: int) -> str:
|
|
349
|
-
"""Truncate at sentence boundary within char limit."""
|
|
350
|
-
if len(text) <= max_chars:
|
|
351
|
-
return text
|
|
352
|
-
truncated = text[:max_chars]
|
|
353
|
-
last_period = truncated.rfind(". ")
|
|
354
|
-
if last_period > max_chars // 2:
|
|
355
|
-
return truncated[:last_period + 1]
|
|
356
|
-
return truncated.rstrip() + "..."
|
|
@@ -1,207 +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.22 — F4.A Stage-8 H-03/H-06 fix
|
|
4
|
-
|
|
5
|
-
"""Parameterised JSON1-backed join helpers for ``action_outcomes``.
|
|
6
|
-
|
|
7
|
-
Replaces the fragile ``fact_ids_json LIKE '%"<fid>"%'`` pattern that five
|
|
8
|
-
call sites depended on. Substring matching on serialised JSON leaks
|
|
9
|
-
false positives across overlapping fact_id prefixes — see Stage-8
|
|
10
|
-
skeptic-H06 for the exact failure mode.
|
|
11
|
-
|
|
12
|
-
This module centralises the correct lookup:
|
|
13
|
-
|
|
14
|
-
SELECT outcome_id, ... FROM action_outcomes
|
|
15
|
-
WHERE profile_id = ?
|
|
16
|
-
AND EXISTS (
|
|
17
|
-
SELECT 1 FROM json_each(fact_ids_json) WHERE value = ?
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
SQLite ships JSON1 enabled by default since 3.38 (February 2022) and the
|
|
21
|
-
minimum Python supported by SLM is 3.9 — which ships SQLite ≥ 3.31. We
|
|
22
|
-
defensively fall back to a ``LIKE`` probe only when JSON1 is missing at
|
|
23
|
-
runtime, with a one-off warning.
|
|
24
|
-
|
|
25
|
-
Callers:
|
|
26
|
-
- ``learning/hnsw_dedup.py`` — ``apply_strong_memory_boost``,
|
|
27
|
-
``select_high_reward_fact_ids``, ``run_reward_gated_archive``.
|
|
28
|
-
- ``learning/forgetting_scheduler.py`` — ``_has_recent_positive_reward``.
|
|
29
|
-
|
|
30
|
-
Contract refs:
|
|
31
|
-
- Stage 8 H-03 (architect-H3) + H-06 (skeptic-H06).
|
|
32
|
-
- LLD-12 §5 — reward-gated archive.
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
from __future__ import annotations
|
|
36
|
-
|
|
37
|
-
import logging
|
|
38
|
-
import sqlite3
|
|
39
|
-
from typing import Iterable
|
|
40
|
-
|
|
41
|
-
logger = logging.getLogger(__name__)
|
|
42
|
-
|
|
43
|
-
__all__ = (
|
|
44
|
-
"iter_outcomes_for_fact",
|
|
45
|
-
"has_recent_positive_reward",
|
|
46
|
-
"aggregate_reward_for_fact",
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# Columns returned — mirror what the legacy LIKE callers read.
|
|
51
|
-
# NB: callers that need extra columns can pass ``columns=``.
|
|
52
|
-
_DEFAULT_COLUMNS = "outcome_id, profile_id, fact_ids_json, reward, settled_at"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def _json1_available(conn: sqlite3.Connection) -> bool:
|
|
56
|
-
"""Return True iff SQLite ``json_each`` is usable on ``conn``.
|
|
57
|
-
|
|
58
|
-
Result is intentionally not cached across connections — JSON1 is a
|
|
59
|
-
compile-time flag and runtime-swapping SQLite libraries is a rare
|
|
60
|
-
edge case but we stay defensive.
|
|
61
|
-
"""
|
|
62
|
-
try:
|
|
63
|
-
conn.execute("SELECT value FROM json_each('[\"x\"]') LIMIT 1").fetchall()
|
|
64
|
-
return True
|
|
65
|
-
except sqlite3.OperationalError:
|
|
66
|
-
return False
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def iter_outcomes_for_fact(
|
|
70
|
-
conn: sqlite3.Connection,
|
|
71
|
-
profile_id: str,
|
|
72
|
-
fact_id: str,
|
|
73
|
-
*,
|
|
74
|
-
columns: str = _DEFAULT_COLUMNS,
|
|
75
|
-
extra_where: str = "",
|
|
76
|
-
extra_params: tuple = (),
|
|
77
|
-
) -> Iterable[tuple]:
|
|
78
|
-
"""Yield action_outcomes rows whose fact_ids_json contains ``fact_id``.
|
|
79
|
-
|
|
80
|
-
Scoped strictly to ``profile_id``; SQL parameters are always bound,
|
|
81
|
-
never string-interpolated. Returns a materialised list so the caller
|
|
82
|
-
can close the connection immediately.
|
|
83
|
-
|
|
84
|
-
Args:
|
|
85
|
-
conn: SQLite connection pointing at the database holding the
|
|
86
|
-
``action_outcomes`` table (usually ``memory.db``).
|
|
87
|
-
profile_id: Profile scope.
|
|
88
|
-
fact_id: Exact fact_id to find.
|
|
89
|
-
columns: Comma-separated column list projected into the
|
|
90
|
-
SELECT. Defaults to (outcome_id, profile_id, fact_ids_json,
|
|
91
|
-
reward, settled_at).
|
|
92
|
-
extra_where: Optional extra predicate — must start with 'AND'
|
|
93
|
-
and use '?' placeholders. E.g.
|
|
94
|
-
``"AND reward IS NOT NULL AND reward > ?"``.
|
|
95
|
-
extra_params: Bound parameters for ``extra_where``.
|
|
96
|
-
|
|
97
|
-
Returns:
|
|
98
|
-
List of sqlite3.Row-compatible tuples (or sqlite3.Row objects if
|
|
99
|
-
the caller set ``conn.row_factory = sqlite3.Row``).
|
|
100
|
-
"""
|
|
101
|
-
if not profile_id or not fact_id:
|
|
102
|
-
return []
|
|
103
|
-
|
|
104
|
-
if _json1_available(conn):
|
|
105
|
-
sql = (
|
|
106
|
-
f"SELECT {columns} FROM action_outcomes "
|
|
107
|
-
f"WHERE profile_id = ? "
|
|
108
|
-
f" AND EXISTS ("
|
|
109
|
-
f" SELECT 1 FROM json_each(fact_ids_json) WHERE value = ?"
|
|
110
|
-
f" ) "
|
|
111
|
-
f"{extra_where}"
|
|
112
|
-
)
|
|
113
|
-
params = (profile_id, fact_id, *extra_params)
|
|
114
|
-
else:
|
|
115
|
-
# Fallback: prefix-LIKE. Accurate ONLY for simple ids.
|
|
116
|
-
# Logged once per process to flag that JSON1 is missing.
|
|
117
|
-
_warn_fallback_once()
|
|
118
|
-
sql = (
|
|
119
|
-
f"SELECT {columns} FROM action_outcomes "
|
|
120
|
-
f"WHERE profile_id = ? AND fact_ids_json LIKE ? "
|
|
121
|
-
f"{extra_where}"
|
|
122
|
-
)
|
|
123
|
-
params = (profile_id, f'%"{fact_id}"%', *extra_params)
|
|
124
|
-
|
|
125
|
-
cursor = conn.execute(sql, params)
|
|
126
|
-
return cursor.fetchall()
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def has_recent_positive_reward(
|
|
130
|
-
conn: sqlite3.Connection,
|
|
131
|
-
profile_id: str,
|
|
132
|
-
fact_id: str,
|
|
133
|
-
*,
|
|
134
|
-
min_reward: float = 0.3,
|
|
135
|
-
window_days: int = 60,
|
|
136
|
-
) -> bool:
|
|
137
|
-
"""True if ``fact_id`` has any outcome with reward > ``min_reward``
|
|
138
|
-
settled in the last ``window_days`` days.
|
|
139
|
-
"""
|
|
140
|
-
extra = (
|
|
141
|
-
"AND reward IS NOT NULL AND reward > ? "
|
|
142
|
-
f"AND COALESCE(settled_at, '') >= datetime('now', '-{int(window_days)} days') "
|
|
143
|
-
"LIMIT 1"
|
|
144
|
-
)
|
|
145
|
-
rows = iter_outcomes_for_fact(
|
|
146
|
-
conn, profile_id, fact_id,
|
|
147
|
-
columns="1",
|
|
148
|
-
extra_where=extra,
|
|
149
|
-
extra_params=(float(min_reward),),
|
|
150
|
-
)
|
|
151
|
-
return bool(rows)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def aggregate_reward_for_fact(
|
|
155
|
-
conn: sqlite3.Connection,
|
|
156
|
-
profile_id: str,
|
|
157
|
-
fact_id: str,
|
|
158
|
-
) -> tuple[int, float]:
|
|
159
|
-
"""Return ``(count, mean_reward)`` for a single fact_id.
|
|
160
|
-
|
|
161
|
-
Count is the number of outcomes with reward IS NOT NULL; mean is
|
|
162
|
-
``AVG(reward)`` across that same subset. Returns ``(0, 0.0)`` when
|
|
163
|
-
the fact has no outcomes.
|
|
164
|
-
"""
|
|
165
|
-
if not profile_id or not fact_id:
|
|
166
|
-
return 0, 0.0
|
|
167
|
-
|
|
168
|
-
if _json1_available(conn):
|
|
169
|
-
sql = (
|
|
170
|
-
"SELECT COUNT(*), AVG(reward) FROM action_outcomes "
|
|
171
|
-
"WHERE profile_id = ? "
|
|
172
|
-
" AND reward IS NOT NULL "
|
|
173
|
-
" AND EXISTS ("
|
|
174
|
-
" SELECT 1 FROM json_each(fact_ids_json) WHERE value = ?"
|
|
175
|
-
" )"
|
|
176
|
-
)
|
|
177
|
-
row = conn.execute(sql, (profile_id, fact_id)).fetchone()
|
|
178
|
-
else:
|
|
179
|
-
_warn_fallback_once()
|
|
180
|
-
sql = (
|
|
181
|
-
"SELECT COUNT(*), AVG(reward) FROM action_outcomes "
|
|
182
|
-
"WHERE profile_id = ? "
|
|
183
|
-
" AND reward IS NOT NULL "
|
|
184
|
-
" AND fact_ids_json LIKE ?"
|
|
185
|
-
)
|
|
186
|
-
row = conn.execute(sql, (profile_id, f'%"{fact_id}"%')).fetchone()
|
|
187
|
-
|
|
188
|
-
if row is None:
|
|
189
|
-
return 0, 0.0
|
|
190
|
-
count, mean = row
|
|
191
|
-
return int(count or 0), float(mean or 0.0)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
_FALLBACK_WARNED = False
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def _warn_fallback_once() -> None:
|
|
198
|
-
"""Log the JSON1-missing fallback exactly once per process."""
|
|
199
|
-
global _FALLBACK_WARNED
|
|
200
|
-
if _FALLBACK_WARNED:
|
|
201
|
-
return
|
|
202
|
-
_FALLBACK_WARNED = True
|
|
203
|
-
logger.warning(
|
|
204
|
-
"fact_outcome_joins: SQLite JSON1 unavailable — falling back to "
|
|
205
|
-
"prefix-LIKE. Expect substring false positives on overlapping "
|
|
206
|
-
"fact_id prefixes. Upgrade SQLite to ≥3.38 for correct matches.",
|
|
207
|
-
)
|