superlocalmemory 4.1.13 → 4.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,191 +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
|
-
"""Auto-recall — inject relevant memories into AI context automatically."""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Any, Callable
|
|
11
|
-
|
|
12
|
-
from superlocalmemory.core.injection import InjectableMemory, render_context
|
|
13
|
-
from superlocalmemory.retrieval.temporal_frame import relative_age, temporal_frame
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class AutoRecall:
|
|
19
|
-
"""Automatically recalls relevant context for AI sessions.
|
|
20
|
-
|
|
21
|
-
Called at session start or before each prompt to inject
|
|
22
|
-
relevant memories without user intervention.
|
|
23
|
-
|
|
24
|
-
Two ways to wire the recall side:
|
|
25
|
-
|
|
26
|
-
- Pass ``engine=<MemoryEngine>`` (CLI/daemon path — historical shape).
|
|
27
|
-
- Pass ``recall_fn=<callable>`` (MCP/LIGHT path — the callable adapts
|
|
28
|
-
a worker-pool call to the ``RecallResponse``-shaped return value).
|
|
29
|
-
When both are supplied, ``recall_fn`` wins.
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
def __init__(
|
|
33
|
-
self,
|
|
34
|
-
engine=None,
|
|
35
|
-
config: dict | None = None,
|
|
36
|
-
*,
|
|
37
|
-
recall_fn: Callable[..., Any] | None = None,
|
|
38
|
-
):
|
|
39
|
-
self._engine = engine
|
|
40
|
-
self._recall_fn = recall_fn
|
|
41
|
-
self._config = config or {}
|
|
42
|
-
self._enabled = self._config.get("enabled", True)
|
|
43
|
-
self._max_memories = self._config.get("max_memories_injected", 10)
|
|
44
|
-
self._threshold = self._config.get("relevance_threshold", 0.3)
|
|
45
|
-
|
|
46
|
-
def _get_soft_prompt_text(self) -> str:
|
|
47
|
-
"""Return soft prompt text via engine._auto_invoker (V3.3 bridge, fail-soft).
|
|
48
|
-
|
|
49
|
-
The CLI and daemon paths pass ``engine=<MemoryEngine>`` to AutoRecall.
|
|
50
|
-
The engine stores an AutoInvoker that has a wired PromptInjector.
|
|
51
|
-
This bridge lets AutoRecall surface soft prompts without needing the
|
|
52
|
-
caller to pass a separate PromptInjector argument.
|
|
53
|
-
|
|
54
|
-
Falls back to "" when no engine, no invoker, or any error occurs.
|
|
55
|
-
"""
|
|
56
|
-
try:
|
|
57
|
-
invoker = getattr(self._engine, "_auto_invoker", None)
|
|
58
|
-
if invoker is None:
|
|
59
|
-
return ""
|
|
60
|
-
getter = getattr(invoker, "_get_soft_prompt_text", None)
|
|
61
|
-
if getter is None:
|
|
62
|
-
return ""
|
|
63
|
-
return getter() or ""
|
|
64
|
-
except Exception as exc:
|
|
65
|
-
# warning: unexpected bridge failure silences a claimed feature
|
|
66
|
-
logger.warning("Soft-prompt bridge (AutoRecall→AutoInvoker) failed: %s", exc)
|
|
67
|
-
return ""
|
|
68
|
-
|
|
69
|
-
def _recall(self, query: str, limit: int):
|
|
70
|
-
if self._recall_fn is not None:
|
|
71
|
-
return self._recall_fn(query, limit=limit)
|
|
72
|
-
if self._engine is not None:
|
|
73
|
-
return self._engine.recall(query, limit=limit)
|
|
74
|
-
return None
|
|
75
|
-
|
|
76
|
-
def get_session_context(self, project_path: str = "", query: str = "") -> str:
|
|
77
|
-
"""Get relevant context for a session or query.
|
|
78
|
-
|
|
79
|
-
Returns a formatted string of relevant memories suitable
|
|
80
|
-
for injection into an AI's system prompt.
|
|
81
|
-
|
|
82
|
-
Soft prompts are fetched via the engine→AutoInvoker bridge FIRST so
|
|
83
|
-
they are returned even when recall finds no memories. Memory recall
|
|
84
|
-
is then layered on top when results are present.
|
|
85
|
-
"""
|
|
86
|
-
if not self._enabled:
|
|
87
|
-
return ""
|
|
88
|
-
if self._recall_fn is None and self._engine is None:
|
|
89
|
-
return ""
|
|
90
|
-
|
|
91
|
-
# --- 1. Soft-prompt (fail-soft, may return "") ---
|
|
92
|
-
soft_prompt = self._get_soft_prompt_text()
|
|
93
|
-
|
|
94
|
-
# --- 2. Memory recall ---
|
|
95
|
-
try:
|
|
96
|
-
search_query = query or f"project context {project_path}"
|
|
97
|
-
response = self._recall(search_query, self._max_memories)
|
|
98
|
-
except Exception as exc:
|
|
99
|
-
logger.warning("Auto-recall failed: %s", exc)
|
|
100
|
-
# Still return soft prompt if present
|
|
101
|
-
return soft_prompt
|
|
102
|
-
|
|
103
|
-
# --- 3. Build memory context block (empty string when no results) ---
|
|
104
|
-
memory_ctx = ""
|
|
105
|
-
try:
|
|
106
|
-
if response is not None and response.results:
|
|
107
|
-
relevant = [r for r in response.results if r.score >= self._threshold]
|
|
108
|
-
if relevant:
|
|
109
|
-
memories = [
|
|
110
|
-
InjectableMemory(
|
|
111
|
-
content=r.fact.content,
|
|
112
|
-
score=float(r.score),
|
|
113
|
-
fact_id=str(r.fact.fact_id),
|
|
114
|
-
importance=float(getattr(r.fact, "importance", 0.0) or 0.0),
|
|
115
|
-
access_count=int(getattr(r.fact, "access_count", 0) or 0),
|
|
116
|
-
source_type="recall",
|
|
117
|
-
)
|
|
118
|
-
for r in relevant[:self._max_memories]
|
|
119
|
-
]
|
|
120
|
-
ctx = render_context(memories, mode="B", cfg=None, wrap=True)
|
|
121
|
-
# T-inject: anchor memories to "now" so a time-blind model
|
|
122
|
-
# can weigh recency. Prepend a one-line temporal frame.
|
|
123
|
-
frame = temporal_frame(
|
|
124
|
-
[getattr(r.fact, "created_at", "") for r in relevant[:self._max_memories]]
|
|
125
|
-
)
|
|
126
|
-
memory_ctx = f"{frame}\n\n{ctx}" if ctx else ctx
|
|
127
|
-
except Exception as exc:
|
|
128
|
-
logger.warning("Auto-recall memory formatting failed: %s", exc)
|
|
129
|
-
|
|
130
|
-
# --- 4. Combine: soft-prompt + memories (either may be empty) ---
|
|
131
|
-
parts = [p for p in (soft_prompt, memory_ctx) if p]
|
|
132
|
-
return "\n\n".join(parts)
|
|
133
|
-
|
|
134
|
-
def get_query_context(self, query: str) -> list[dict]:
|
|
135
|
-
"""Get relevant memories for a specific query.
|
|
136
|
-
|
|
137
|
-
Returns structured data (not formatted string) for MCP tools.
|
|
138
|
-
"""
|
|
139
|
-
if not self._enabled:
|
|
140
|
-
return []
|
|
141
|
-
if self._recall_fn is None and self._engine is None:
|
|
142
|
-
return []
|
|
143
|
-
|
|
144
|
-
try:
|
|
145
|
-
response = self._recall(query, self._max_memories)
|
|
146
|
-
if response is None:
|
|
147
|
-
return []
|
|
148
|
-
from datetime import datetime as _dt, timezone as _tz
|
|
149
|
-
_now = _dt.now(_tz.utc)
|
|
150
|
-
results = []
|
|
151
|
-
for r in response.results:
|
|
152
|
-
if r.score >= self._threshold:
|
|
153
|
-
_created = getattr(r.fact, "created_at", "") or ""
|
|
154
|
-
results.append({
|
|
155
|
-
"fact_id": r.fact.fact_id,
|
|
156
|
-
"content": r.fact.content[:300],
|
|
157
|
-
"created_at": _created,
|
|
158
|
-
"age_label": relative_age(_created, _now),
|
|
159
|
-
"score": round(r.score, 3),
|
|
160
|
-
"relevance_score": round(
|
|
161
|
-
getattr(r, "relevance_score", r.score) or 0.0, 3
|
|
162
|
-
),
|
|
163
|
-
"ranking_score": getattr(r, "ranking_score", None),
|
|
164
|
-
"confidence": round(
|
|
165
|
-
getattr(
|
|
166
|
-
r, "memory_confidence",
|
|
167
|
-
getattr(r, "confidence", 0.0),
|
|
168
|
-
) or 0.0, 3
|
|
169
|
-
),
|
|
170
|
-
"memory_confidence": round(
|
|
171
|
-
getattr(
|
|
172
|
-
r, "memory_confidence",
|
|
173
|
-
getattr(r, "confidence", 0.0),
|
|
174
|
-
) or 0.0, 3
|
|
175
|
-
),
|
|
176
|
-
"rank_position": int(getattr(r, "rank_position", 0) or 0),
|
|
177
|
-
})
|
|
178
|
-
return results
|
|
179
|
-
except Exception as exc:
|
|
180
|
-
logger.warning("Auto-recall query failed: %s", exc)
|
|
181
|
-
return []
|
|
182
|
-
|
|
183
|
-
@property
|
|
184
|
-
def enabled(self) -> bool:
|
|
185
|
-
return self._enabled
|
|
186
|
-
|
|
187
|
-
def enable(self) -> None:
|
|
188
|
-
self._enabled = True
|
|
189
|
-
|
|
190
|
-
def disable(self) -> None:
|
|
191
|
-
self._enabled = False
|
|
@@ -1,251 +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
|
-
"""UserPromptSubmit hook — production auto-recall via recall_queue.
|
|
6
|
-
|
|
7
|
-
Entry point for Claude Code's UserPromptSubmit event. Invoked as:
|
|
8
|
-
python3 -m superlocalmemory.hooks.auto_recall_hook
|
|
9
|
-
OR: slm hook auto_recall
|
|
10
|
-
|
|
11
|
-
Flow:
|
|
12
|
-
1. Read stdin JSON (Claude Code payload)
|
|
13
|
-
2. Detect ack prompts → silent (exit 0, empty JSON)
|
|
14
|
-
3. Substantive → enqueue to recall_queue.db → poll for result
|
|
15
|
-
4. Format top-K memories as additionalContext
|
|
16
|
-
5. Write Claude Code envelope to stdout
|
|
17
|
-
|
|
18
|
-
HARD RULES:
|
|
19
|
-
- stdlib-only imports at module load. SLM modules delayed-imported.
|
|
20
|
-
- NEVER imports MemoryEngine (memory blast risk).
|
|
21
|
-
- NEVER raises to Claude Code — always exits 0.
|
|
22
|
-
- Fail-open: any failure → {} to stdout.
|
|
23
|
-
|
|
24
|
-
MEMORY SAFETY: recall goes through recall_queue.db → QueueConsumer
|
|
25
|
-
(daemon background thread) → pool.recall() → recall_worker subprocess.
|
|
26
|
-
Engine is ONLY in the recall_worker. This process stays at ~20MB.
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
from __future__ import annotations
|
|
30
|
-
|
|
31
|
-
import json
|
|
32
|
-
import re
|
|
33
|
-
import sys
|
|
34
|
-
|
|
35
|
-
_DEFAULT_LIMIT = 15 # raised from 3 for formatter candidate pool
|
|
36
|
-
|
|
37
|
-
_MODE_TIMEOUTS = {
|
|
38
|
-
"A": 10.0,
|
|
39
|
-
"B": 25.0,
|
|
40
|
-
"C": 40.0,
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
_ACK_RE = re.compile(
|
|
44
|
-
r"^\s*"
|
|
45
|
-
r"(?:yes|no|ok|okay|approved|thanks|thank you|go|sure|yep|nope|"
|
|
46
|
-
r"done|y|n|cool|got it|right|correct)"
|
|
47
|
-
r"(?:\s+(?:yes|no|ok|okay|approved|thanks|done|\d+))*"
|
|
48
|
-
r"\s*[.!?]?\s*$",
|
|
49
|
-
re.IGNORECASE,
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def _is_ack(prompt: str) -> bool:
|
|
54
|
-
return len(prompt) <= 30 and bool(_ACK_RE.match(prompt))
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def _get_mode_timeout(mode: str) -> float:
|
|
58
|
-
return _MODE_TIMEOUTS.get(mode.upper(), _MODE_TIMEOUTS["B"])
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def _detect_mode() -> str:
|
|
62
|
-
try:
|
|
63
|
-
from superlocalmemory.core.config import SLMConfig
|
|
64
|
-
config = SLMConfig.load()
|
|
65
|
-
return getattr(config, "mode", "B").upper()
|
|
66
|
-
except Exception:
|
|
67
|
-
return "B"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _get_queue_db_path():
|
|
71
|
-
from superlocalmemory.infra.data_root import state_path
|
|
72
|
-
|
|
73
|
-
return state_path("recall_queue.db")
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def _try_socket_first(prompt: str, session_id: str) -> dict | None:
|
|
77
|
-
"""Try the persistent hook daemon socket. Returns full envelope or None.
|
|
78
|
-
|
|
79
|
-
The socket path returns an already-formatted Claude Code envelope.
|
|
80
|
-
If this returns a non-None dict, the caller writes it to stdout directly
|
|
81
|
-
(skip _do_recall + _format_envelope). Returns None on any failure,
|
|
82
|
-
triggering the subprocess fallback.
|
|
83
|
-
"""
|
|
84
|
-
try:
|
|
85
|
-
from superlocalmemory.hooks.hook_daemon import try_socket_recall
|
|
86
|
-
response = try_socket_recall(
|
|
87
|
-
prompt=prompt,
|
|
88
|
-
session_id=session_id,
|
|
89
|
-
timeout=_get_mode_timeout(_detect_mode()),
|
|
90
|
-
)
|
|
91
|
-
if response is None or not isinstance(response, dict):
|
|
92
|
-
return None
|
|
93
|
-
if not response:
|
|
94
|
-
return {}
|
|
95
|
-
return response
|
|
96
|
-
except Exception:
|
|
97
|
-
return None
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def _do_recall(query: str, limit: int = _DEFAULT_LIMIT, session_id: str = "") -> list[dict] | None:
|
|
101
|
-
"""Enqueue recall to queue, poll for result. Returns list of dicts or None."""
|
|
102
|
-
try:
|
|
103
|
-
from superlocalmemory.core.recall_queue import RecallQueue
|
|
104
|
-
|
|
105
|
-
mode = _detect_mode()
|
|
106
|
-
timeout = _get_mode_timeout(mode)
|
|
107
|
-
stall_timeout = max(timeout - 5.0, 5.0)
|
|
108
|
-
db_path = _get_queue_db_path()
|
|
109
|
-
queue = RecallQueue(db_path)
|
|
110
|
-
|
|
111
|
-
try:
|
|
112
|
-
request_id = queue.enqueue(
|
|
113
|
-
query=query,
|
|
114
|
-
limit_n=limit,
|
|
115
|
-
mode=mode,
|
|
116
|
-
agent_id="auto_recall_hook",
|
|
117
|
-
session_id=session_id,
|
|
118
|
-
priority="high",
|
|
119
|
-
stall_timeout_s=stall_timeout,
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
result = queue.poll_result(request_id, timeout_s=timeout)
|
|
123
|
-
|
|
124
|
-
if isinstance(result, dict):
|
|
125
|
-
if result.get("ok") is False:
|
|
126
|
-
return None
|
|
127
|
-
results = result.get("results", [])
|
|
128
|
-
if isinstance(results, list):
|
|
129
|
-
return results
|
|
130
|
-
return None
|
|
131
|
-
finally:
|
|
132
|
-
queue.close()
|
|
133
|
-
|
|
134
|
-
except Exception:
|
|
135
|
-
return _fallback_recall(query, limit, session_id)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def _fallback_recall(query: str, limit: int, session_id: str) -> list[dict] | None:
|
|
139
|
-
"""Fallback: call daemon HTTP /recall if queue path fails."""
|
|
140
|
-
try:
|
|
141
|
-
import urllib.parse
|
|
142
|
-
import urllib.request
|
|
143
|
-
|
|
144
|
-
params = urllib.parse.urlencode({"q": query, "limit": limit})
|
|
145
|
-
url = f"http://127.0.0.1:47152/recall?{params}"
|
|
146
|
-
|
|
147
|
-
req = urllib.request.Request(url, method="GET")
|
|
148
|
-
req.add_header("X-SLM-Session-Id", session_id)
|
|
149
|
-
|
|
150
|
-
with urllib.request.urlopen(req, timeout=5.0) as resp:
|
|
151
|
-
data = json.loads(resp.read().decode("utf-8"))
|
|
152
|
-
return data.get("results", [])
|
|
153
|
-
except Exception:
|
|
154
|
-
return None
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def _format_envelope(results: list[dict]) -> dict:
|
|
158
|
-
"""Format recall results as Claude Code envelope. Uses shared formatter
|
|
159
|
-
(v3.4.65). Fail closed if the mandatory renderer is unavailable."""
|
|
160
|
-
try:
|
|
161
|
-
from superlocalmemory.core.config import SLMConfig
|
|
162
|
-
from superlocalmemory.core.injection import InjectableMemory, render_context
|
|
163
|
-
cfg = SLMConfig.load().injection
|
|
164
|
-
mode = _detect_mode()
|
|
165
|
-
inj = [
|
|
166
|
-
InjectableMemory(
|
|
167
|
-
content=str(r.get("content", "")),
|
|
168
|
-
score=float(r.get("score", 0) or 0),
|
|
169
|
-
fact_id=str(r.get("fact_id", "")),
|
|
170
|
-
importance=float(r.get("importance", 0) or 0),
|
|
171
|
-
access_count=int(r.get("access_count", 0) or 0),
|
|
172
|
-
source_type=str(r.get("source_type", "recall")),
|
|
173
|
-
source_id=str(r.get("source_id", "auto-recall-hook")),
|
|
174
|
-
)
|
|
175
|
-
for r in results
|
|
176
|
-
]
|
|
177
|
-
wrapped = render_context(inj, mode=mode, cfg=cfg, wrap=True)
|
|
178
|
-
return {
|
|
179
|
-
"hookSpecificOutput": {
|
|
180
|
-
"hookEventName": "UserPromptSubmit",
|
|
181
|
-
"additionalContext": wrapped,
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
except Exception:
|
|
185
|
-
# A weaker ad-hoc formatter would create a second security contract and
|
|
186
|
-
# could leak unredacted stored text. No memory is safer than unbounded,
|
|
187
|
-
# unredacted memory when the mandatory renderer fails.
|
|
188
|
-
return {}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
def main() -> int:
|
|
192
|
-
try:
|
|
193
|
-
raw = sys.stdin.read()
|
|
194
|
-
except Exception:
|
|
195
|
-
sys.stdout.write("{}")
|
|
196
|
-
return 0
|
|
197
|
-
|
|
198
|
-
if not raw or not raw.strip():
|
|
199
|
-
sys.stdout.write("{}")
|
|
200
|
-
return 0
|
|
201
|
-
|
|
202
|
-
try:
|
|
203
|
-
payload = json.loads(raw)
|
|
204
|
-
except Exception:
|
|
205
|
-
sys.stdout.write("{}")
|
|
206
|
-
return 0
|
|
207
|
-
|
|
208
|
-
if not isinstance(payload, dict):
|
|
209
|
-
sys.stdout.write("{}")
|
|
210
|
-
return 0
|
|
211
|
-
|
|
212
|
-
prompt = payload.get("prompt", "")
|
|
213
|
-
session_id = payload.get("session_id", "")
|
|
214
|
-
|
|
215
|
-
if not isinstance(prompt, str) or not prompt.strip():
|
|
216
|
-
sys.stdout.write("{}")
|
|
217
|
-
return 0
|
|
218
|
-
|
|
219
|
-
if _is_ack(prompt):
|
|
220
|
-
sys.stdout.write("{}")
|
|
221
|
-
return 0
|
|
222
|
-
|
|
223
|
-
try:
|
|
224
|
-
socket_result = _try_socket_first(prompt, session_id)
|
|
225
|
-
if socket_result is not None:
|
|
226
|
-
sys.stdout.write(json.dumps(socket_result) if socket_result else "{}")
|
|
227
|
-
return 0
|
|
228
|
-
except Exception:
|
|
229
|
-
pass
|
|
230
|
-
|
|
231
|
-
try:
|
|
232
|
-
results = _do_recall(prompt, limit=_DEFAULT_LIMIT, session_id=session_id)
|
|
233
|
-
except Exception:
|
|
234
|
-
sys.stdout.write("{}")
|
|
235
|
-
return 0
|
|
236
|
-
|
|
237
|
-
if not results:
|
|
238
|
-
sys.stdout.write("{}")
|
|
239
|
-
return 0
|
|
240
|
-
|
|
241
|
-
try:
|
|
242
|
-
envelope = _format_envelope(results)
|
|
243
|
-
sys.stdout.write(json.dumps(envelope))
|
|
244
|
-
except Exception:
|
|
245
|
-
sys.stdout.write("{}")
|
|
246
|
-
|
|
247
|
-
return 0
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
if __name__ == "__main__":
|
|
251
|
-
sys.exit(main())
|
|
@@ -1,131 +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.43 — Pre-web recall on WebSearch/WebFetch
|
|
4
|
-
|
|
5
|
-
"""Pre-web recall hook — fires SLM recall before any WebSearch/WebFetch call.
|
|
6
|
-
|
|
7
|
-
Dispatch: `slm hook before_web` (PreToolUse, matcher "WebSearch|WebFetch").
|
|
8
|
-
|
|
9
|
-
WHY THIS HOOK EXISTS
|
|
10
|
-
====================
|
|
11
|
-
End users typically have hundreds-to-thousands of relevant memories in their
|
|
12
|
-
local SLM. When Claude is about to issue a WebSearch or WebFetch, there's a
|
|
13
|
-
high chance the answer (or strong constraints on the answer) is already in
|
|
14
|
-
SLM. This hook forces a recall pass on the search query/URL and injects the
|
|
15
|
-
top hits as a system-reminder BEFORE the web call fires. Claude must consider
|
|
16
|
-
the local memories before committing to the external call.
|
|
17
|
-
|
|
18
|
-
PERFORMANCE
|
|
19
|
-
===========
|
|
20
|
-
Cost: ~500-800ms warm (full recall via SLM daemon). Fires only on
|
|
21
|
-
WebSearch and WebFetch (5-20× per typical session), so per-session overhead
|
|
22
|
-
is ~5-15s in exchange for grounded answers. NOT suitable for UserPromptSubmit
|
|
23
|
-
(too frequent — would be a perf disaster).
|
|
24
|
-
|
|
25
|
-
CONTRACT
|
|
26
|
-
========
|
|
27
|
-
- Reads Claude Code stdin: {"tool_input": {"query"|"url"|"prompt": "..."}}
|
|
28
|
-
- On non-trivial query: calls `slm recall <query> --limit 5`, injects top
|
|
29
|
-
results as a system-reminder block.
|
|
30
|
-
- On empty/short query / recall failure / SLM down: silent exit 0.
|
|
31
|
-
- Always exit 0 — never blocks the web call.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
from __future__ import annotations
|
|
35
|
-
|
|
36
|
-
import json
|
|
37
|
-
import subprocess
|
|
38
|
-
import sys
|
|
39
|
-
from typing import Any
|
|
40
|
-
|
|
41
|
-
_MIN_QUERY_LEN = 5
|
|
42
|
-
_QUERY_TRUNCATE = 200
|
|
43
|
-
_RECALL_LIMIT = 5
|
|
44
|
-
_RECALL_TIMEOUT_SEC = 3
|
|
45
|
-
_RECALLED_MAX_CHARS = 3000
|
|
46
|
-
_RECALLED_MIN_USEFUL = 50
|
|
47
|
-
_PREVIEW_CHARS = 80
|
|
48
|
-
|
|
49
|
-
_SHIM_PREFIX = "[SLM PRE-WEB RECALL"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def _extract_query(payload: dict[str, Any]) -> str:
|
|
53
|
-
"""Pull the search query / URL / prompt from Claude Code stdin payload."""
|
|
54
|
-
ti = payload.get("tool_input") or {}
|
|
55
|
-
if not isinstance(ti, dict):
|
|
56
|
-
return ""
|
|
57
|
-
raw = ti.get("query") or ti.get("prompt") or ti.get("url") or ""
|
|
58
|
-
if not isinstance(raw, str):
|
|
59
|
-
return ""
|
|
60
|
-
return raw[:_QUERY_TRUNCATE].strip()
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def _read_input() -> dict[str, Any]:
|
|
64
|
-
"""Parse stdin JSON. Returns empty dict on any failure."""
|
|
65
|
-
try:
|
|
66
|
-
raw = sys.stdin.read()
|
|
67
|
-
if not raw:
|
|
68
|
-
return {}
|
|
69
|
-
data = json.loads(raw)
|
|
70
|
-
if isinstance(data, dict):
|
|
71
|
-
return data
|
|
72
|
-
return {}
|
|
73
|
-
except (json.JSONDecodeError, ValueError, OSError):
|
|
74
|
-
return {}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def _run_recall(query: str) -> str:
|
|
78
|
-
"""Run `slm recall <query> --limit N`. Returns trimmed output or empty."""
|
|
79
|
-
try:
|
|
80
|
-
# Bounded query length (already truncated to 200 chars). Subprocess
|
|
81
|
-
# timeout caps daemon-down risk at 3s.
|
|
82
|
-
proc = subprocess.run(
|
|
83
|
-
["slm", "recall", query, "--limit", str(_RECALL_LIMIT)],
|
|
84
|
-
capture_output=True,
|
|
85
|
-
text=True,
|
|
86
|
-
timeout=_RECALL_TIMEOUT_SEC,
|
|
87
|
-
)
|
|
88
|
-
if proc.returncode != 0:
|
|
89
|
-
return ""
|
|
90
|
-
out = (proc.stdout or "")[:_RECALLED_MAX_CHARS]
|
|
91
|
-
if len(out) < _RECALLED_MIN_USEFUL:
|
|
92
|
-
return ""
|
|
93
|
-
return out
|
|
94
|
-
except (subprocess.TimeoutExpired, OSError, ValueError):
|
|
95
|
-
return ""
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def main() -> int:
|
|
99
|
-
"""Entry point. Always returns 0 — fail-open contract."""
|
|
100
|
-
try:
|
|
101
|
-
payload = _read_input()
|
|
102
|
-
query = _extract_query(payload)
|
|
103
|
-
if len(query) < _MIN_QUERY_LEN:
|
|
104
|
-
return 0
|
|
105
|
-
|
|
106
|
-
recalled = _run_recall(query)
|
|
107
|
-
if not recalled:
|
|
108
|
-
return 0
|
|
109
|
-
|
|
110
|
-
preview = query[:_PREVIEW_CHARS].replace('"', "'")
|
|
111
|
-
from superlocalmemory.core.injection import render_untrusted_text
|
|
112
|
-
memory_evidence = render_untrusted_text(
|
|
113
|
-
recalled,
|
|
114
|
-
source_type="before-web-recall",
|
|
115
|
-
source_id=preview,
|
|
116
|
-
)
|
|
117
|
-
if not memory_evidence:
|
|
118
|
-
return 0
|
|
119
|
-
sys.stdout.write(
|
|
120
|
-
"<system-reminder>\n"
|
|
121
|
-
f'{_SHIM_PREFIX} — fired before WebSearch/WebFetch on query: "{preview}"]\n'
|
|
122
|
-
"You're about to search the web. SLM already has these relevant memories.\n"
|
|
123
|
-
"READ THEM FIRST. If they answer the question, skip the web call. If they\n"
|
|
124
|
-
"contradict what you'd find on the web, surface the contradiction. Do not\n"
|
|
125
|
-
"ignore them.\n\n"
|
|
126
|
-
f"{memory_evidence}\n"
|
|
127
|
-
"</system-reminder>\n"
|
|
128
|
-
)
|
|
129
|
-
except Exception: # noqa: BLE001 — fail-open contract
|
|
130
|
-
pass
|
|
131
|
-
return 0
|