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,138 +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 — Track A.2 (LLD-09 / LLD-00)
|
|
4
|
-
|
|
5
|
-
"""Stop hook — finalize every pending outcome for this session.
|
|
6
|
-
|
|
7
|
-
Flow (<500 ms typical, <1 s hard):
|
|
8
|
-
1. Read stdin JSON {session_id}.
|
|
9
|
-
2. SELECT outcome_id FROM pending_outcomes
|
|
10
|
-
WHERE session_id = ? AND status = 'pending'.
|
|
11
|
-
3. For each outcome_id, call
|
|
12
|
-
``EngagementRewardModel.finalize_outcome(outcome_id=...)``.
|
|
13
|
-
The reward model owns the action_outcomes INSERT (profile_id
|
|
14
|
-
populated per SEC-C-05) and the pending→settled transition.
|
|
15
|
-
4. Cleanup: delete the per-session state file (best effort).
|
|
16
|
-
5. Emit ``{}`` on stdout, exit 0.
|
|
17
|
-
|
|
18
|
-
Contract (LLD-00 §2): the EngagementRewardModel finalize entry point
|
|
19
|
-
takes ``outcome_id=`` as its only keyword argument. Any other form
|
|
20
|
-
(positional args, or a ``query_id=`` keyword) is forbidden and the
|
|
21
|
-
Stage-5b CI gate fails the build on sight.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
from __future__ import annotations
|
|
25
|
-
|
|
26
|
-
import sys
|
|
27
|
-
import time
|
|
28
|
-
|
|
29
|
-
from superlocalmemory.hooks._outcome_common import (
|
|
30
|
-
emit_empty_json,
|
|
31
|
-
log_perf,
|
|
32
|
-
memory_db_path,
|
|
33
|
-
open_memory_db,
|
|
34
|
-
read_stdin_json,
|
|
35
|
-
session_state_file,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
_HOOK_NAME = "stop_outcome"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _inner_main() -> str:
|
|
43
|
-
payload = read_stdin_json()
|
|
44
|
-
if payload is None:
|
|
45
|
-
return "invalid_payload"
|
|
46
|
-
|
|
47
|
-
session_id = payload.get("session_id")
|
|
48
|
-
if not isinstance(session_id, str) or not session_id:
|
|
49
|
-
return "no_session"
|
|
50
|
-
|
|
51
|
-
# Enumerate pending outcomes for this session.
|
|
52
|
-
conn = None
|
|
53
|
-
try:
|
|
54
|
-
conn = open_memory_db()
|
|
55
|
-
rows = conn.execute(
|
|
56
|
-
"SELECT outcome_id FROM pending_outcomes "
|
|
57
|
-
"WHERE session_id = ? AND status = 'pending'",
|
|
58
|
-
(session_id,),
|
|
59
|
-
).fetchall()
|
|
60
|
-
except Exception:
|
|
61
|
-
return "db_locked"
|
|
62
|
-
finally:
|
|
63
|
-
if conn is not None:
|
|
64
|
-
conn.close()
|
|
65
|
-
|
|
66
|
-
if not rows:
|
|
67
|
-
_cleanup_session_state(session_id)
|
|
68
|
-
return "no_pending"
|
|
69
|
-
|
|
70
|
-
# Delayed import of the model — the hot-path budget for Stop is 500 ms,
|
|
71
|
-
# generous enough to pay the import tax once per session end.
|
|
72
|
-
try:
|
|
73
|
-
from superlocalmemory.learning.reward import EngagementRewardModel
|
|
74
|
-
except Exception:
|
|
75
|
-
return "import_fail"
|
|
76
|
-
|
|
77
|
-
try:
|
|
78
|
-
model = EngagementRewardModel(memory_db_path())
|
|
79
|
-
except Exception:
|
|
80
|
-
return "model_init_fail"
|
|
81
|
-
|
|
82
|
-
finalized = 0
|
|
83
|
-
try:
|
|
84
|
-
for r in rows:
|
|
85
|
-
oid = r["outcome_id"]
|
|
86
|
-
# CRITICAL: kwarg-only per LLD-00 §2. Never positional.
|
|
87
|
-
# Never the legacy ``query_id=``. Stage-5b CI gate enforces.
|
|
88
|
-
try:
|
|
89
|
-
model.finalize_outcome(outcome_id=oid)
|
|
90
|
-
finalized += 1
|
|
91
|
-
except Exception: # pragma: no cover — reward returns 0.5 on error
|
|
92
|
-
continue
|
|
93
|
-
finally:
|
|
94
|
-
try:
|
|
95
|
-
model.close()
|
|
96
|
-
except Exception:
|
|
97
|
-
pass
|
|
98
|
-
|
|
99
|
-
_cleanup_session_state(session_id)
|
|
100
|
-
return f"finalized_{finalized}"
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def _cleanup_session_state(session_id: str) -> None:
|
|
104
|
-
"""Remove the session_state JSON file, if any. Best effort."""
|
|
105
|
-
p = session_state_file(session_id)
|
|
106
|
-
if p is None:
|
|
107
|
-
return
|
|
108
|
-
try:
|
|
109
|
-
if p.exists():
|
|
110
|
-
p.unlink()
|
|
111
|
-
except Exception:
|
|
112
|
-
pass
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def main() -> int:
|
|
116
|
-
t0 = time.perf_counter()
|
|
117
|
-
outcome = "exception"
|
|
118
|
-
try:
|
|
119
|
-
outcome = _inner_main()
|
|
120
|
-
except Exception as exc: # pragma: no cover
|
|
121
|
-
try:
|
|
122
|
-
sys.stderr.write(
|
|
123
|
-
f"slm-hook {_HOOK_NAME}: {type(exc).__name__}\n"
|
|
124
|
-
)
|
|
125
|
-
except Exception:
|
|
126
|
-
pass
|
|
127
|
-
finally:
|
|
128
|
-
duration_ms = (time.perf_counter() - t0) * 1000.0
|
|
129
|
-
emit_empty_json()
|
|
130
|
-
try:
|
|
131
|
-
log_perf(_HOOK_NAME, duration_ms, outcome)
|
|
132
|
-
except Exception:
|
|
133
|
-
pass
|
|
134
|
-
return 0
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if __name__ == "__main__": # pragma: no cover — CLI entry only
|
|
138
|
-
sys.exit(main())
|
|
@@ -1,114 +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 — LLD-05 §9
|
|
4
|
-
|
|
5
|
-
"""Background sync loop — keeps every cross-platform adapter fresh.
|
|
6
|
-
|
|
7
|
-
LLD-05 §9. Runs as an asyncio task in the unified daemon's lifespan.
|
|
8
|
-
Default interval 900 s; first run at t=5 s so users see files quickly.
|
|
9
|
-
Adapter errors are logged but NEVER abort the loop (A8).
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
import asyncio
|
|
15
|
-
import logging
|
|
16
|
-
import os
|
|
17
|
-
import time
|
|
18
|
-
from typing import Iterable
|
|
19
|
-
|
|
20
|
-
from superlocalmemory.hooks.adapter_base import Adapter
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
DEFAULT_INTERVAL_SECONDS = 900
|
|
26
|
-
FIRST_RUN_DELAY_SECONDS = 5.0
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def _interval_from_env(default: int = DEFAULT_INTERVAL_SECONDS) -> int:
|
|
30
|
-
raw = os.environ.get("SLM_CROSS_PLATFORM_SYNC_INTERVAL")
|
|
31
|
-
if not raw:
|
|
32
|
-
return default
|
|
33
|
-
try:
|
|
34
|
-
value = int(raw)
|
|
35
|
-
except ValueError:
|
|
36
|
-
return default
|
|
37
|
-
return max(30, value)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
async def cross_platform_sync_loop(
|
|
41
|
-
adapters: Iterable[Adapter],
|
|
42
|
-
*,
|
|
43
|
-
interval: float | None = None,
|
|
44
|
-
first_run_delay: float = FIRST_RUN_DELAY_SECONDS,
|
|
45
|
-
iterations: int | None = None,
|
|
46
|
-
) -> int:
|
|
47
|
-
"""Top-level coroutine. Returns number of iterations run.
|
|
48
|
-
|
|
49
|
-
``iterations`` cap is used by tests to bound the loop. Production
|
|
50
|
-
callers pass ``None`` and rely on task cancellation for shutdown.
|
|
51
|
-
"""
|
|
52
|
-
adapters = list(adapters)
|
|
53
|
-
step = float(interval) if interval is not None else float(_interval_from_env())
|
|
54
|
-
await asyncio.sleep(first_run_delay)
|
|
55
|
-
|
|
56
|
-
count = 0
|
|
57
|
-
while True:
|
|
58
|
-
await run_once(adapters)
|
|
59
|
-
count += 1
|
|
60
|
-
if iterations is not None and count >= iterations:
|
|
61
|
-
return count
|
|
62
|
-
try:
|
|
63
|
-
await asyncio.sleep(step)
|
|
64
|
-
except asyncio.CancelledError: # pragma: no cover — shutdown
|
|
65
|
-
raise
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
async def run_once(adapters: Iterable[Adapter]) -> dict[str, str]:
|
|
69
|
-
"""Run a single sync cycle over all adapters. Never raises.
|
|
70
|
-
|
|
71
|
-
E.3 (v3.4.22 perf): ``adapter.sync()`` is synchronous file I/O
|
|
72
|
-
(opens/reads/writes JSON files in ~/.cursor, ~/.antigravity, etc.)
|
|
73
|
-
and used to run directly on the event loop — a slow disk or a
|
|
74
|
-
large workspace could block the daemon for tens of milliseconds,
|
|
75
|
-
stalling every concurrent request. We now off-load each sync to
|
|
76
|
-
the default thread pool via ``asyncio.to_thread``.
|
|
77
|
-
"""
|
|
78
|
-
results: dict[str, str] = {}
|
|
79
|
-
|
|
80
|
-
def _one(adapter: Adapter) -> tuple[str, str, float]:
|
|
81
|
-
"""Sync a single adapter; returns (name, outcome, elapsed_ms)."""
|
|
82
|
-
name = getattr(adapter, "name", "?")
|
|
83
|
-
try:
|
|
84
|
-
if not adapter.is_active():
|
|
85
|
-
return name, "inactive", 0.0
|
|
86
|
-
start = time.monotonic()
|
|
87
|
-
wrote = adapter.sync()
|
|
88
|
-
elapsed_ms = (time.monotonic() - start) * 1000
|
|
89
|
-
return name, ("wrote" if wrote else "skipped"), elapsed_ms
|
|
90
|
-
except Exception as exc:
|
|
91
|
-
logger.warning("adapter %s sync failed: %s", name, exc)
|
|
92
|
-
return name, f"error:{type(exc).__name__}", 0.0
|
|
93
|
-
|
|
94
|
-
for adapter in adapters:
|
|
95
|
-
name, outcome, elapsed_ms = await asyncio.to_thread(_one, adapter)
|
|
96
|
-
results[name] = outcome
|
|
97
|
-
if outcome in ("wrote", "skipped"):
|
|
98
|
-
logger.debug("adapter %s sync %s (%.1f ms)",
|
|
99
|
-
name, outcome, elapsed_ms)
|
|
100
|
-
return results
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def schedule(adapters: Iterable[Adapter]) -> asyncio.Task:
|
|
104
|
-
"""Fire-and-forget scheduling for the daemon lifespan."""
|
|
105
|
-
return asyncio.create_task(cross_platform_sync_loop(adapters))
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
__all__ = (
|
|
109
|
-
"DEFAULT_INTERVAL_SECONDS",
|
|
110
|
-
"FIRST_RUN_DELAY_SECONDS",
|
|
111
|
-
"cross_platform_sync_loop",
|
|
112
|
-
"run_once",
|
|
113
|
-
"schedule",
|
|
114
|
-
)
|
|
@@ -1,302 +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 — Topic-shift detection on UserPromptSubmit
|
|
4
|
-
|
|
5
|
-
"""Topic-shift detection hook — replaces time-based recall nag.
|
|
6
|
-
|
|
7
|
-
Replaces the time-based "[SLM] 15+ min since last context refresh" reminder
|
|
8
|
-
emitted by _hook_checkpoint with event-based detection. Fires a single-line
|
|
9
|
-
recall reminder only when the current prompt's content-word set has zero
|
|
10
|
-
overlap with EVERY recent prompt in a 5-prompt sliding window — the strictest
|
|
11
|
-
defensible signal for a genuine topic pivot.
|
|
12
|
-
|
|
13
|
-
Dispatch: `slm hook topic_shift` (UserPromptSubmit).
|
|
14
|
-
|
|
15
|
-
HOT-PATH CONTRACT
|
|
16
|
-
=================
|
|
17
|
-
- stdlib-only imports at module load.
|
|
18
|
-
- Reads {"session_id", "prompt"} from stdin JSON.
|
|
19
|
-
- On topic shift: prints one-line reminder to stdout (Claude Code surfaces
|
|
20
|
-
as system-reminder).
|
|
21
|
-
- On no-shift / any error: silent exit 0. Never blocks the prompt.
|
|
22
|
-
- Latency budget: <10 ms (regex + set ops on bounded input). Verified
|
|
23
|
-
by the algorithm itself; subprocess startup adds ~30-40 ms but that's
|
|
24
|
-
outside the budget for the Python logic.
|
|
25
|
-
- State file per root and session:
|
|
26
|
-
/tmp/slm-topicstate-{root_hash}-{sha256(session_id)[:16]}.json
|
|
27
|
-
Schema: {"window": [[word, ...], ...], "version": 1}.
|
|
28
|
-
|
|
29
|
-
DESIGN NOTES (NASA-grade — defensible thresholds, e2e-tuned)
|
|
30
|
-
============================================================
|
|
31
|
-
- N=5 sliding window — spans conversational follow-ups, still detects shifts
|
|
32
|
-
in long sessions.
|
|
33
|
-
- Algorithm: per-prompt MAX overlap (NOT jaccard-vs-union). True pivots share
|
|
34
|
-
zero content words with EVERY recent prompt; same-topic follow-ups share
|
|
35
|
-
at least one anchor word with at least ONE recent prompt (often not with
|
|
36
|
-
the union). Per-prompt max captures this; jaccard-vs-union over-fires.
|
|
37
|
-
- |current_words| >= 5 — skip short utterances. Trade-off: very short pivots
|
|
38
|
-
("monsoon forecast Mumbai") miss firing. Bounded cost: one missed reminder;
|
|
39
|
-
Claude self-trigger covers the residual.
|
|
40
|
-
- >= 2 prior window entries — don't trigger on prompt 2 (insufficient baseline).
|
|
41
|
-
- Word regex drops hyphens vs the topic_signature regex: compound technical
|
|
42
|
-
terms like "varunpratap-website" split into ["varunpratap", "website"] so
|
|
43
|
-
each half independently anchors against the window.
|
|
44
|
-
- Extended stopword list (generic temporal connectors: "next", "back",
|
|
45
|
-
"week"...) prevents false-negative bridges across unrelated topics.
|
|
46
|
-
- Observability: every decision logged TSV to a per-user log file unless
|
|
47
|
-
SLM_TOPIC_SHIFT_LOG=0 in environment.
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
from __future__ import annotations
|
|
51
|
-
|
|
52
|
-
import hashlib
|
|
53
|
-
import json
|
|
54
|
-
import os
|
|
55
|
-
import re
|
|
56
|
-
import sys
|
|
57
|
-
import tempfile
|
|
58
|
-
import time
|
|
59
|
-
|
|
60
|
-
# --------------------------------------------------------------------------
|
|
61
|
-
# Config — frozen for v3.4.43. Tune via real-conversation log analysis.
|
|
62
|
-
# --------------------------------------------------------------------------
|
|
63
|
-
|
|
64
|
-
_WINDOW_SIZE = 5
|
|
65
|
-
_MIN_CURRENT_WORDS = 5
|
|
66
|
-
_MIN_WINDOW_ENTRIES = 2
|
|
67
|
-
_MAX_PER_PROMPT_OVERLAP = 0
|
|
68
|
-
_STATE_MAX_AGE_SEC = 24 * 3600
|
|
69
|
-
_MAX_PROMPT_CHARS = 4000
|
|
70
|
-
|
|
71
|
-
_TMP = tempfile.gettempdir()
|
|
72
|
-
|
|
73
|
-
_STOPWORDS: frozenset[str] = frozenset({
|
|
74
|
-
"a", "about", "above", "after", "again", "against", "all", "am", "an",
|
|
75
|
-
"and", "any", "are", "as", "at", "be", "because", "been", "before",
|
|
76
|
-
"being", "below", "between", "both", "but", "by", "can", "cannot",
|
|
77
|
-
"could", "did", "do", "does", "doing", "don", "down", "during", "each",
|
|
78
|
-
"few", "for", "from", "further", "had", "has", "have", "having", "he",
|
|
79
|
-
"her", "here", "hers", "herself", "him", "himself", "his", "how", "i",
|
|
80
|
-
"if", "in", "into", "is", "it", "its", "itself", "just", "let", "me",
|
|
81
|
-
"more", "most", "my", "myself", "no", "nor", "not", "now", "of", "off",
|
|
82
|
-
"on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves",
|
|
83
|
-
"out", "over", "own", "same", "she", "should", "so", "some", "such",
|
|
84
|
-
"than", "that", "the", "their", "theirs", "them", "themselves", "then",
|
|
85
|
-
"there", "these", "they", "this", "those", "through", "to", "too",
|
|
86
|
-
"under", "until", "up", "use", "using", "very", "was", "we", "were",
|
|
87
|
-
"what", "when", "where", "which", "while", "who", "whom", "why", "will",
|
|
88
|
-
"with", "would", "you", "your", "yours", "yourself", "yourselves",
|
|
89
|
-
"ok", "okay", "yes", "no", "yep", "nope", "thanks", "please", "go",
|
|
90
|
-
"tell", "let's", "lets", "want", "need", "would", "could", "make",
|
|
91
|
-
"also", "still", "really", "actually",
|
|
92
|
-
"next", "back", "here", "there", "now", "then", "again", "today",
|
|
93
|
-
"tomorrow", "yesterday", "week", "month", "year", "day", "time",
|
|
94
|
-
"thing", "things", "stuff", "way", "ways", "case", "cases",
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
# Linear-time non-backtracking word regex. Hyphens excluded so compound
|
|
98
|
-
# technical terms split into independently-matchable halves.
|
|
99
|
-
_WORD = re.compile(r"[A-Za-z0-9][A-Za-z0-9']{2,}")
|
|
100
|
-
|
|
101
|
-
_ACK_RE = re.compile(
|
|
102
|
-
r"^\s*(yes|no|ok|okay|approved|thanks|thank you|go|sure|yep|nope|done|y|n|"
|
|
103
|
-
r"cool|got it|right|correct)([\s]+(yes|no|ok|okay|approved|thanks|done|\d+))*\s*[\.\!\?]?\s*$",
|
|
104
|
-
re.IGNORECASE,
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
_SHIFT_REMINDER = (
|
|
108
|
-
"[SLM] Topic shift detected. Consider calling "
|
|
109
|
-
"mcp__superlocalmemory__recall with the new topic to surface relevant "
|
|
110
|
-
"memories before responding."
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
# Optional test/embedder overrides. Runtime defaults are resolved dynamically
|
|
114
|
-
# through the canonical data-root authority so environment switches in a
|
|
115
|
-
# long-lived process do not continue logging to the first observed namespace.
|
|
116
|
-
_LOG_DIR: str | None = None
|
|
117
|
-
_LOG_PATH: str | None = None
|
|
118
|
-
_LOG_ENABLED = os.environ.get("SLM_TOPIC_SHIFT_LOG", "1") != "0"
|
|
119
|
-
_LOG_PROMPT_PREVIEW_CHARS = 80
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
# --------------------------------------------------------------------------
|
|
123
|
-
# Pure logic — testable without IO.
|
|
124
|
-
# --------------------------------------------------------------------------
|
|
125
|
-
|
|
126
|
-
def extract_content_words(prompt: str) -> list[str]:
|
|
127
|
-
"""Tokenize → lowercase → filter stopwords + len<3. Bounded input."""
|
|
128
|
-
if not prompt:
|
|
129
|
-
return []
|
|
130
|
-
if len(prompt) > _MAX_PROMPT_CHARS:
|
|
131
|
-
prompt = prompt[:_MAX_PROMPT_CHARS]
|
|
132
|
-
words = _WORD.findall(prompt.lower())
|
|
133
|
-
return [w for w in words if w not in _STOPWORDS and len(w) >= 3]
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def is_substantive(prompt: str) -> bool:
|
|
137
|
-
"""Substantive = length >= 10 AND not a pure conversational ack."""
|
|
138
|
-
if not prompt or len(prompt) < 10:
|
|
139
|
-
return False
|
|
140
|
-
if len(prompt) <= 30 and _ACK_RE.match(prompt):
|
|
141
|
-
return False
|
|
142
|
-
return True
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def detect_shift(
|
|
146
|
-
current_words: list[str],
|
|
147
|
-
window: list[list[str]],
|
|
148
|
-
) -> tuple[bool, int]:
|
|
149
|
-
"""Pure decision function.
|
|
150
|
-
|
|
151
|
-
Returns (fired, max_overlap_or_-1_when_gated).
|
|
152
|
-
"""
|
|
153
|
-
if len(current_words) < _MIN_CURRENT_WORDS:
|
|
154
|
-
return False, -1
|
|
155
|
-
if len(window) < _MIN_WINDOW_ENTRIES:
|
|
156
|
-
return False, -1
|
|
157
|
-
cur = set(current_words)
|
|
158
|
-
max_overlap = max(len(cur & set(wl)) for wl in window)
|
|
159
|
-
return max_overlap <= _MAX_PER_PROMPT_OVERLAP, max_overlap
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
# --------------------------------------------------------------------------
|
|
163
|
-
# IO — state file + stdin parsing + stdout emission.
|
|
164
|
-
# --------------------------------------------------------------------------
|
|
165
|
-
|
|
166
|
-
def state_path(session_id: str) -> str:
|
|
167
|
-
"""Hash canonical root and session ID for an isolated safe filename."""
|
|
168
|
-
from superlocalmemory.infra.data_root import canonical_data_root
|
|
169
|
-
|
|
170
|
-
root_digest = hashlib.sha256(
|
|
171
|
-
str(canonical_data_root()).encode("utf-8")
|
|
172
|
-
).hexdigest()[:16]
|
|
173
|
-
session_digest = hashlib.sha256(
|
|
174
|
-
session_id.encode("utf-8")
|
|
175
|
-
).hexdigest()[:16]
|
|
176
|
-
return os.path.join(
|
|
177
|
-
_TMP,
|
|
178
|
-
f"slm-topicstate-{root_digest}-{session_digest}.json",
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def load_state(path: str) -> list[list[str]]:
|
|
183
|
-
"""Load window from disk. Empty on any failure or staleness."""
|
|
184
|
-
try:
|
|
185
|
-
st = os.stat(path)
|
|
186
|
-
if (time.time() - st.st_mtime) > _STATE_MAX_AGE_SEC:
|
|
187
|
-
return []
|
|
188
|
-
with open(path, "r", encoding="utf-8") as f:
|
|
189
|
-
data = json.load(f)
|
|
190
|
-
if not isinstance(data, dict):
|
|
191
|
-
return []
|
|
192
|
-
if data.get("version") != 1:
|
|
193
|
-
return []
|
|
194
|
-
win = data.get("window", [])
|
|
195
|
-
if not isinstance(win, list):
|
|
196
|
-
return []
|
|
197
|
-
out: list[list[str]] = []
|
|
198
|
-
for entry in win[-_WINDOW_SIZE:]:
|
|
199
|
-
if isinstance(entry, list) and all(isinstance(w, str) for w in entry):
|
|
200
|
-
out.append(entry)
|
|
201
|
-
return out
|
|
202
|
-
except (FileNotFoundError, json.JSONDecodeError, OSError, ValueError):
|
|
203
|
-
return []
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
def save_state(path: str, window: list[list[str]]) -> None:
|
|
207
|
-
"""Persist window. Silent on any IO failure."""
|
|
208
|
-
tmp = f"{path}.{os.getpid()}.{time.time_ns()}.tmp"
|
|
209
|
-
try:
|
|
210
|
-
with open(tmp, "w", encoding="utf-8") as f:
|
|
211
|
-
json.dump({"version": 1, "window": window[-_WINDOW_SIZE:]}, f)
|
|
212
|
-
os.replace(tmp, path)
|
|
213
|
-
except OSError:
|
|
214
|
-
try:
|
|
215
|
-
os.remove(tmp)
|
|
216
|
-
except OSError:
|
|
217
|
-
pass
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
def _topic_log_paths() -> tuple[str, str]:
|
|
221
|
-
"""Return ``(directory, file)`` while retaining explicit test overrides."""
|
|
222
|
-
if _LOG_PATH is not None:
|
|
223
|
-
directory = _LOG_DIR or os.path.dirname(_LOG_PATH)
|
|
224
|
-
return directory, _LOG_PATH
|
|
225
|
-
if _LOG_DIR is not None:
|
|
226
|
-
return _LOG_DIR, os.path.join(_LOG_DIR, "topic-shift.log")
|
|
227
|
-
|
|
228
|
-
from superlocalmemory.infra.data_root import state_path as runtime_state_path
|
|
229
|
-
|
|
230
|
-
path = str(runtime_state_path("logs", "topic-shift.log"))
|
|
231
|
-
return os.path.dirname(path), path
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
def _read_input() -> tuple[str, str]:
|
|
235
|
-
"""Parse stdin JSON. Returns ('', '') on any failure."""
|
|
236
|
-
try:
|
|
237
|
-
raw = sys.stdin.read()
|
|
238
|
-
if not raw:
|
|
239
|
-
return "", ""
|
|
240
|
-
data = json.loads(raw)
|
|
241
|
-
if not isinstance(data, dict):
|
|
242
|
-
return "", ""
|
|
243
|
-
sid = data.get("session_id", "")
|
|
244
|
-
prompt = data.get("prompt", "")
|
|
245
|
-
if not isinstance(sid, str) or not isinstance(prompt, str):
|
|
246
|
-
return "", ""
|
|
247
|
-
return sid, prompt
|
|
248
|
-
except (json.JSONDecodeError, ValueError, OSError):
|
|
249
|
-
return "", ""
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
def _log_decision(
|
|
253
|
-
session_id: str,
|
|
254
|
-
current_words: list[str],
|
|
255
|
-
window: list[list[str]],
|
|
256
|
-
max_overlap: int,
|
|
257
|
-
fired: bool,
|
|
258
|
-
prompt: str,
|
|
259
|
-
) -> None:
|
|
260
|
-
"""Append one decision line for observability. Silent on failure."""
|
|
261
|
-
if not _LOG_ENABLED:
|
|
262
|
-
return
|
|
263
|
-
try:
|
|
264
|
-
log_dir, log_path = _topic_log_paths()
|
|
265
|
-
os.makedirs(log_dir, exist_ok=True)
|
|
266
|
-
ts = time.strftime("%Y-%m-%dT%H:%M:%S")
|
|
267
|
-
sh = hashlib.sha256(session_id.encode()).hexdigest()[:8]
|
|
268
|
-
preview = (prompt[:_LOG_PROMPT_PREVIEW_CHARS]
|
|
269
|
-
.replace("\t", " ").replace("\n", " "))
|
|
270
|
-
line = (f"{ts}\t{sh}\t{len(current_words)}\t{len(window)}"
|
|
271
|
-
f"\t{max_overlap}\t{int(fired)}\t{preview}\n")
|
|
272
|
-
with open(log_path, "a", encoding="utf-8") as f:
|
|
273
|
-
f.write(line)
|
|
274
|
-
except OSError:
|
|
275
|
-
pass
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
def main() -> int:
|
|
279
|
-
"""Entry point. Always returns 0 — fail-open contract."""
|
|
280
|
-
try:
|
|
281
|
-
session_id, prompt = _read_input()
|
|
282
|
-
if not session_id or not prompt:
|
|
283
|
-
return 0
|
|
284
|
-
if not is_substantive(prompt):
|
|
285
|
-
return 0
|
|
286
|
-
|
|
287
|
-
current = extract_content_words(prompt)
|
|
288
|
-
path = state_path(session_id)
|
|
289
|
-
window = load_state(path)
|
|
290
|
-
|
|
291
|
-
fired, max_overlap = detect_shift(current, window)
|
|
292
|
-
|
|
293
|
-
if fired:
|
|
294
|
-
print(_SHIFT_REMINDER)
|
|
295
|
-
|
|
296
|
-
_log_decision(session_id, current, window, max_overlap, fired, prompt)
|
|
297
|
-
|
|
298
|
-
window.append(current)
|
|
299
|
-
save_state(path, window)
|
|
300
|
-
except Exception: # noqa: BLE001 — fail-open contract
|
|
301
|
-
pass
|
|
302
|
-
return 0
|
|
@@ -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.22 — LLD-01 §4.3
|
|
4
|
-
|
|
5
|
-
"""UserPromptSubmit hook — Python fallback (compiled binary preferred).
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
HARD RULES (enforced by tests):
|
|
9
|
-
- stdlib-only imports at module load (SLM modules delayed-imported).
|
|
10
|
-
- NEVER raises to Claude Code — always prints a valid JSON and exits 0.
|
|
11
|
-
- Returns the Claude Code April-2026 envelope on cache hit:
|
|
12
|
-
``{"hookSpecificOutput": {"hookEventName": "UserPromptSubmit",
|
|
13
|
-
"additionalContext": "..."}}``
|
|
14
|
-
- Returns ``{}`` on miss / malformed input / DB absent / any error.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import json
|
|
20
|
-
import sys
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def main() -> int:
|
|
24
|
-
"""Entry point. Reads JSON from stdin, writes JSON to stdout, returns 0.
|
|
25
|
-
|
|
26
|
-
The dispatcher in ``hook_handlers.handle_hook`` routes
|
|
27
|
-
``slm hook user_prompt_submit`` here when the compiled binary is
|
|
28
|
-
absent (see LLD-06 for the binary path).
|
|
29
|
-
"""
|
|
30
|
-
try:
|
|
31
|
-
raw = sys.stdin.read()
|
|
32
|
-
except Exception: # pragma: no cover — stdin unreadable in container
|
|
33
|
-
sys.stdout.write("{}")
|
|
34
|
-
return 0
|
|
35
|
-
|
|
36
|
-
if not raw:
|
|
37
|
-
sys.stdout.write("{}")
|
|
38
|
-
return 0
|
|
39
|
-
|
|
40
|
-
try:
|
|
41
|
-
payload = json.loads(raw)
|
|
42
|
-
except Exception:
|
|
43
|
-
sys.stdout.write("{}")
|
|
44
|
-
return 0
|
|
45
|
-
|
|
46
|
-
if not isinstance(payload, dict):
|
|
47
|
-
sys.stdout.write("{}")
|
|
48
|
-
return 0
|
|
49
|
-
|
|
50
|
-
session_id = payload.get("session_id")
|
|
51
|
-
prompt = payload.get("prompt")
|
|
52
|
-
if not isinstance(session_id, str) or not session_id:
|
|
53
|
-
sys.stdout.write("{}")
|
|
54
|
-
return 0
|
|
55
|
-
if not isinstance(prompt, str) or not prompt:
|
|
56
|
-
sys.stdout.write("{}")
|
|
57
|
-
return 0
|
|
58
|
-
|
|
59
|
-
# S9-DASH-10: register this session_id as the most recent active
|
|
60
|
-
# Claude session so the MCP ``recall`` tool can pick it up when
|
|
61
|
-
# the MCP protocol doesn't thread the session_id through tool
|
|
62
|
-
# arguments. Fail-soft — never raises on the hot path.
|
|
63
|
-
try:
|
|
64
|
-
from superlocalmemory.hooks.session_registry import (
|
|
65
|
-
mark_active,
|
|
66
|
-
resolve_active_profile,
|
|
67
|
-
)
|
|
68
|
-
mark_active(
|
|
69
|
-
session_id,
|
|
70
|
-
agent_type="claude",
|
|
71
|
-
profile_id=resolve_active_profile(),
|
|
72
|
-
)
|
|
73
|
-
except Exception:
|
|
74
|
-
pass
|
|
75
|
-
|
|
76
|
-
# Delayed imports keep cold-start small and isolate any pathological
|
|
77
|
-
# import-time failure of the SLM modules from the hot path.
|
|
78
|
-
try:
|
|
79
|
-
from superlocalmemory.core.context_cache import read_entry_fast
|
|
80
|
-
from superlocalmemory.core.topic_signature import compute_topic_signature
|
|
81
|
-
except Exception: # pragma: no cover — SLM modules unimportable
|
|
82
|
-
sys.stdout.write("{}")
|
|
83
|
-
return 0
|
|
84
|
-
|
|
85
|
-
# LLD-13 Track C.1: inline trigram entity detection. Layer A of the
|
|
86
|
-
# two-layer detector — bounded (<2 ms p99), stdlib-only, silent on
|
|
87
|
-
# any failure (falls through to regex-only signature).
|
|
88
|
-
entity_hits: list[str] = []
|
|
89
|
-
try:
|
|
90
|
-
from superlocalmemory.learning import trigram_index as _ti
|
|
91
|
-
_idx = _ti.get_or_none()
|
|
92
|
-
if _idx is not None:
|
|
93
|
-
entity_hits = [eid for eid, _hits in _idx.lookup(prompt)]
|
|
94
|
-
except Exception:
|
|
95
|
-
entity_hits = []
|
|
96
|
-
|
|
97
|
-
try:
|
|
98
|
-
topic_sig = compute_topic_signature(prompt, entity_hits=entity_hits)
|
|
99
|
-
entry = read_entry_fast(session_id, topic_sig, require_current_admission=True)
|
|
100
|
-
except Exception:
|
|
101
|
-
sys.stdout.write("{}")
|
|
102
|
-
return 0
|
|
103
|
-
|
|
104
|
-
if entry is None:
|
|
105
|
-
sys.stdout.write("{}")
|
|
106
|
-
return 0
|
|
107
|
-
|
|
108
|
-
from superlocalmemory.core.injection import render_untrusted_text
|
|
109
|
-
wrapped = render_untrusted_text(
|
|
110
|
-
entry.content,
|
|
111
|
-
source_type="context-cache",
|
|
112
|
-
source_id=str(getattr(entry, "topic_signature", "") or ""),
|
|
113
|
-
)
|
|
114
|
-
if not wrapped:
|
|
115
|
-
sys.stdout.write("{}")
|
|
116
|
-
return 0
|
|
117
|
-
envelope = {
|
|
118
|
-
"hookSpecificOutput": {
|
|
119
|
-
"hookEventName": "UserPromptSubmit",
|
|
120
|
-
"additionalContext": wrapped,
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
try:
|
|
124
|
-
sys.stdout.write(json.dumps(envelope))
|
|
125
|
-
except Exception: # pragma: no cover — str content unserializable
|
|
126
|
-
sys.stdout.write("{}")
|
|
127
|
-
return 0
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if __name__ == "__main__": # pragma: no cover — CLI entry only
|
|
131
|
-
sys.exit(main())
|