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,183 +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.4
|
|
4
|
-
|
|
5
|
-
"""PostToolUse async:true hook — fire-and-forget prewarm via stdlib urllib.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
HARD RULES (enforced by tests):
|
|
9
|
-
- stdlib only — ``urllib.request``, NOT ``httpx`` / ``requests``.
|
|
10
|
-
- Always emits ``{"async": true}`` and exits 0 — even on daemon-down,
|
|
11
|
-
missing token, or broken payload.
|
|
12
|
-
- Includes ``X-SLM-Hook-Token`` header from ``~/.superlocalmemory/.install_token``
|
|
13
|
-
when available. Without a token, the POST is skipped (daemon would
|
|
14
|
-
reject anyway) but we still emit ``{"async": true}``.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import json
|
|
20
|
-
import os
|
|
21
|
-
import sys
|
|
22
|
-
import urllib.error
|
|
23
|
-
import urllib.request
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
|
|
26
|
-
from superlocalmemory.infra.data_root import state_path
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
_ALLOWED_DAEMON_HOSTS: frozenset[str] = frozenset({
|
|
30
|
-
"127.0.0.1", "localhost", "::1", "[::1]",
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
_DEFAULT_DAEMON_PORT = 8765
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _port_file_url() -> str:
|
|
37
|
-
"""Loopback daemon URL from the per-user port file (default 8765).
|
|
38
|
-
|
|
39
|
-
On a shared host each user runs their own daemon on a different port,
|
|
40
|
-
written to ``~/.superlocalmemory/daemon.port`` at startup. Falling back
|
|
41
|
-
to this instead of a hard-coded ``8765`` keeps the hook pointed at the
|
|
42
|
-
caller's own daemon. Stdlib only.
|
|
43
|
-
"""
|
|
44
|
-
port = _DEFAULT_DAEMON_PORT
|
|
45
|
-
try:
|
|
46
|
-
port = int(state_path("daemon.port").read_text().strip())
|
|
47
|
-
except Exception:
|
|
48
|
-
pass
|
|
49
|
-
return f"http://127.0.0.1:{port}"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def _sanitised_daemon_url() -> str:
|
|
53
|
-
"""Return the configured daemon URL only if it's loopback-scoped.
|
|
54
|
-
|
|
55
|
-
S8-SEC-02: without this guard, a hostile env (e.g. a compromised
|
|
56
|
-
shell profile) could set ``SLM_HOOK_DAEMON_URL`` to a remote host
|
|
57
|
-
and exfiltrate the install token via the ``X-SLM-Hook-Token``
|
|
58
|
-
header. We refuse any non-loopback URL and fall back to the local
|
|
59
|
-
daemon (resolved via the per-user port file, not a hard-coded port).
|
|
60
|
-
"""
|
|
61
|
-
raw = os.environ.get("SLM_HOOK_DAEMON_URL", "").strip()
|
|
62
|
-
if not raw:
|
|
63
|
-
return _port_file_url()
|
|
64
|
-
try:
|
|
65
|
-
from urllib.parse import urlparse
|
|
66
|
-
parsed = urlparse(raw)
|
|
67
|
-
except Exception: # pragma: no cover — urllib always importable
|
|
68
|
-
return _port_file_url()
|
|
69
|
-
if parsed.scheme not in ("http", "https"):
|
|
70
|
-
return _port_file_url()
|
|
71
|
-
host = (parsed.hostname or "").lower()
|
|
72
|
-
if host not in _ALLOWED_DAEMON_HOSTS:
|
|
73
|
-
return _port_file_url()
|
|
74
|
-
# Preserve the scheme + port (user may bind daemon on a non-default port).
|
|
75
|
-
port = f":{parsed.port}" if parsed.port else ""
|
|
76
|
-
return f"{parsed.scheme}://{host}{port}"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
DAEMON_URL: str = _sanitised_daemon_url()
|
|
80
|
-
DAEMON_TIMEOUT: float = float(os.environ.get("SLM_HOOK_DAEMON_TIMEOUT", "0.5"))
|
|
81
|
-
PREWARM_PATH: str = "/internal/prewarm"
|
|
82
|
-
|
|
83
|
-
_INPUT_CAP: int = 2000
|
|
84
|
-
_OUTPUT_CAP: int = 4000
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def _install_token() -> str:
|
|
88
|
-
"""Read the install token. Returns '' on any problem."""
|
|
89
|
-
path = state_path(".install_token")
|
|
90
|
-
if not path.exists():
|
|
91
|
-
return ""
|
|
92
|
-
try:
|
|
93
|
-
return path.read_text(encoding="utf-8").strip()
|
|
94
|
-
except OSError: # pragma: no cover — FS transient failure
|
|
95
|
-
return ""
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def _summarize(obj, cap: int) -> str:
|
|
99
|
-
"""Stringify with size cap."""
|
|
100
|
-
if obj is None:
|
|
101
|
-
return ""
|
|
102
|
-
if isinstance(obj, str):
|
|
103
|
-
return obj[:cap]
|
|
104
|
-
try:
|
|
105
|
-
return json.dumps(obj, default=str)[:cap]
|
|
106
|
-
except Exception: # pragma: no cover — exotic non-serializable object
|
|
107
|
-
try:
|
|
108
|
-
return str(obj)[:cap]
|
|
109
|
-
except Exception:
|
|
110
|
-
return ""
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _post(body: dict, token: str) -> None:
|
|
114
|
-
"""Fire the prewarm POST. Silently swallows all failures."""
|
|
115
|
-
try:
|
|
116
|
-
data = json.dumps(body).encode("utf-8")
|
|
117
|
-
req = urllib.request.Request(
|
|
118
|
-
f"{DAEMON_URL}{PREWARM_PATH}",
|
|
119
|
-
data=data,
|
|
120
|
-
headers={
|
|
121
|
-
"Content-Type": "application/json",
|
|
122
|
-
"X-SLM-Hook-Token": token,
|
|
123
|
-
},
|
|
124
|
-
method="POST",
|
|
125
|
-
)
|
|
126
|
-
resp = urllib.request.urlopen(req, timeout=DAEMON_TIMEOUT)
|
|
127
|
-
try:
|
|
128
|
-
resp.read()
|
|
129
|
-
except Exception: # pragma: no cover — partial response flush
|
|
130
|
-
pass
|
|
131
|
-
try:
|
|
132
|
-
resp.close()
|
|
133
|
-
except Exception: # pragma: no cover — already closed
|
|
134
|
-
pass
|
|
135
|
-
except Exception:
|
|
136
|
-
# Daemon unreachable / timeout / auth rejected — by spec this is
|
|
137
|
-
# best-effort. Hook still returns {"async": true} upstream.
|
|
138
|
-
return
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def main() -> int:
|
|
142
|
-
"""Entry point. Reads stdin JSON, posts to daemon, always prints
|
|
143
|
-
``{"async": true}`` and returns 0."""
|
|
144
|
-
try:
|
|
145
|
-
raw = sys.stdin.read()
|
|
146
|
-
except Exception: # pragma: no cover — stdin unreadable in container
|
|
147
|
-
sys.stdout.write('{"async": true}')
|
|
148
|
-
return 0
|
|
149
|
-
|
|
150
|
-
if not raw:
|
|
151
|
-
sys.stdout.write('{"async": true}')
|
|
152
|
-
return 0
|
|
153
|
-
|
|
154
|
-
try:
|
|
155
|
-
payload = json.loads(raw)
|
|
156
|
-
except Exception:
|
|
157
|
-
sys.stdout.write('{"async": true}')
|
|
158
|
-
return 0
|
|
159
|
-
|
|
160
|
-
if not isinstance(payload, dict):
|
|
161
|
-
sys.stdout.write('{"async": true}')
|
|
162
|
-
return 0
|
|
163
|
-
|
|
164
|
-
try:
|
|
165
|
-
token = _install_token()
|
|
166
|
-
if token:
|
|
167
|
-
body = {
|
|
168
|
-
"session_id": str(payload.get("session_id", "")),
|
|
169
|
-
"tool_name": str(payload.get("tool_name", "")),
|
|
170
|
-
"input_summary": _summarize(payload.get("tool_input"), _INPUT_CAP),
|
|
171
|
-
"output_summary": _summarize(payload.get("tool_response"), _OUTPUT_CAP),
|
|
172
|
-
}
|
|
173
|
-
_post(body, token)
|
|
174
|
-
except Exception: # pragma: no cover — defense in depth
|
|
175
|
-
# Never propagate.
|
|
176
|
-
pass
|
|
177
|
-
|
|
178
|
-
sys.stdout.write('{"async": true}')
|
|
179
|
-
return 0
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if __name__ == "__main__": # pragma: no cover — CLI entry only
|
|
183
|
-
sys.exit(main())
|
|
@@ -1,351 +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
|
-
"""PostToolUse hook — detect fact usage + write engagement signal.
|
|
6
|
-
|
|
7
|
-
Flow (hot path, <10 ms typical, <20 ms hard):
|
|
8
|
-
1. Read Claude Code JSON from stdin.
|
|
9
|
-
2. Resolve session_id via ``safe_resolve_identifier`` (LLD-00 §4).
|
|
10
|
-
3. Cap tool_response to 100 KB (bounded scan, LLD-09 §7 failure-mode #4).
|
|
11
|
-
4. Extract HMAC markers (``slm:fact:<id>:<hmac8>``) — validate each
|
|
12
|
-
(LLD-00 §3). Bare substring scans are **banned** by the Stage-5b
|
|
13
|
-
CI gate.
|
|
14
|
-
5. For each validated fact_id, find a pending_outcomes row where
|
|
15
|
-
``session_id`` matches AND ``fact_ids_json`` includes the fact_id
|
|
16
|
-
AND ``status='pending'`` — call ``register_signal(outcome_id,
|
|
17
|
-
signal_name, True)``. ``signal_name`` is ``'edit'`` for
|
|
18
|
-
mutating tools (Edit/Write/NotebookEdit), else ``'dwell_ms'`` with
|
|
19
|
-
a nominal 3000 ms value.
|
|
20
|
-
6. Always emit ``{}`` on stdout and return 0. NEVER raise.
|
|
21
|
-
|
|
22
|
-
Crash-safety (LLD-09 §6):
|
|
23
|
-
- Outer try/except around every code path. stderr breadcrumb (no
|
|
24
|
-
stack trace, no payload echo). Always exit 0.
|
|
25
|
-
- SQLite ``busy_timeout=50`` → fast-fail on DB contention.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
from __future__ import annotations
|
|
29
|
-
|
|
30
|
-
import re
|
|
31
|
-
import sys
|
|
32
|
-
import time
|
|
33
|
-
from pathlib import Path
|
|
34
|
-
|
|
35
|
-
from superlocalmemory.hooks._outcome_common import (
|
|
36
|
-
emit_empty_json,
|
|
37
|
-
log_perf,
|
|
38
|
-
read_stdin_json,
|
|
39
|
-
session_state_file,
|
|
40
|
-
summarize_response,
|
|
41
|
-
)
|
|
42
|
-
from superlocalmemory.hooks._outcome_common import (
|
|
43
|
-
memory_db_path as _memory_db_path_fn,
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
_HOOK_NAME = "post_tool_outcome"
|
|
47
|
-
|
|
48
|
-
# Monkey-patchable indirection for tests.
|
|
49
|
-
def _memory_db_path() -> Path:
|
|
50
|
-
return _memory_db_path_fn()
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
# Tools that imply an "edit" signal (the agent acted on the fact).
|
|
54
|
-
_EDIT_TOOLS = frozenset({"Edit", "Write", "NotebookEdit"})
|
|
55
|
-
|
|
56
|
-
# Nominal dwell value for non-edit tool uses that hit a marker.
|
|
57
|
-
# The label formula clamps 2s..10s → 0.05..0.15 reward bonus.
|
|
58
|
-
_DEFAULT_DWELL_MS = 3000
|
|
59
|
-
|
|
60
|
-
# Marker regex — mirrors recall_pipeline._emit_marker but scoped locally
|
|
61
|
-
# so this module has no hot-path import of the full recall pipeline.
|
|
62
|
-
#
|
|
63
|
-
# S-L04 — ``fact_id`` is constrained to a conservative alphabet
|
|
64
|
-
# (alphanumerics, ``-`` and ``_``). The previous ``[^:\s]+`` allowed
|
|
65
|
-
# colons and let a malicious tool response emit markers like
|
|
66
|
-
# ``slm:fact:evil:deadbeef:abcdef01`` that the regex grouped wrong and
|
|
67
|
-
# still handed off to the validator. Defence-in-depth: the HMAC
|
|
68
|
-
# validator already rejects these, but disallowing colons keeps garbage
|
|
69
|
-
# from reaching it in the first place. The HMAC suffix stays lowercase
|
|
70
|
-
# hex (matches ``recall_pipeline._emit_marker``).
|
|
71
|
-
_MARKER_RE = re.compile(r"slm:fact:([A-Za-z0-9_\-]+):([0-9a-f]{8})")
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _validate(marker: str) -> str | None:
|
|
75
|
-
"""Delegate to the canonical validator (LLD-00 §3)."""
|
|
76
|
-
try:
|
|
77
|
-
from superlocalmemory.core.recall_pipeline import _validate_marker
|
|
78
|
-
except Exception:
|
|
79
|
-
return None
|
|
80
|
-
try:
|
|
81
|
-
return _validate_marker(marker)
|
|
82
|
-
except Exception:
|
|
83
|
-
return None
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
# --- Behavioural telemetry -------------------------------------------------
|
|
87
|
-
# ``tool_events`` is the record of what the agent did, and several readers
|
|
88
|
-
# depend on it: assertion mining, skill-performance mining, and the engagement
|
|
89
|
-
# features that settle a recall against the actions which followed it. Each of
|
|
90
|
-
# those reads the table; none of them writes it. The only writers were an
|
|
91
|
-
# explicit ``log_tool_event`` call and a bulk importer, so on an ordinary
|
|
92
|
-
# install the table simply stopped receiving invocations and every reader
|
|
93
|
-
# quietly aged out with it.
|
|
94
|
-
#
|
|
95
|
-
# This hook already runs on exactly the right edge -- after each tool completes,
|
|
96
|
-
# with the session that ran it -- so it records the invocation here. It happens
|
|
97
|
-
# before the marker scan and independently of it: whether a recalled memory was
|
|
98
|
-
# named in the output decides what a *reward* is worth, not whether the action
|
|
99
|
-
# occurred at all.
|
|
100
|
-
_MAX_SUMMARY_LEN = 500
|
|
101
|
-
|
|
102
|
-
# Compiled once at import. This path now runs on every tool call rather than
|
|
103
|
-
# only on the ~1-in-5 that carry a marker, so per-call ``re`` compilation or a
|
|
104
|
-
# module import would be paid on the hot path for no benefit.
|
|
105
|
-
_SECRET_PATTERNS = (
|
|
106
|
-
(re.compile(r"\b(?:sk-|pk-|api[_-]?key[_-]?)[A-Za-z0-9_-]{10,}\b"),
|
|
107
|
-
"[REDACTED]"),
|
|
108
|
-
(re.compile(r"\b[A-Za-z0-9+/]{40,}={0,2}\b"), "[REDACTED]"),
|
|
109
|
-
(re.compile(r"password\s*[=:]\s*\S+", re.IGNORECASE),
|
|
110
|
-
"password=[REDACTED]"),
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def _scrub(text: str) -> str:
|
|
115
|
-
"""Strip credential-shaped substrings from telemetry text."""
|
|
116
|
-
for pattern, replacement in _SECRET_PATTERNS:
|
|
117
|
-
text = pattern.sub(replacement, text)
|
|
118
|
-
return text
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def _summary(raw: object) -> str:
|
|
122
|
-
"""Truncate-then-scrub ``raw`` for a summary column.
|
|
123
|
-
|
|
124
|
-
Truncation comes first so the regex cost is bounded by
|
|
125
|
-
``_MAX_SUMMARY_LEN`` and not by the size of a tool response.
|
|
126
|
-
"""
|
|
127
|
-
if raw is None:
|
|
128
|
-
return ""
|
|
129
|
-
if not isinstance(raw, str):
|
|
130
|
-
try:
|
|
131
|
-
import json as _json
|
|
132
|
-
raw = _json.dumps(raw, default=str)
|
|
133
|
-
except Exception:
|
|
134
|
-
try:
|
|
135
|
-
raw = str(raw)
|
|
136
|
-
except Exception:
|
|
137
|
-
return ""
|
|
138
|
-
return _scrub(raw[:_MAX_SUMMARY_LEN])
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def _record_tool_event(
|
|
142
|
-
session_id: str,
|
|
143
|
-
tool_name: str,
|
|
144
|
-
payload: dict,
|
|
145
|
-
response_text: str,
|
|
146
|
-
) -> bool:
|
|
147
|
-
"""Append one ``tool_events`` row. Never raises; returns whether it wrote.
|
|
148
|
-
|
|
149
|
-
Failure is silent by design: telemetry must never be the reason a tool call
|
|
150
|
-
reports a problem to the user, and the hook contract is to exit 0 whatever
|
|
151
|
-
happens.
|
|
152
|
-
"""
|
|
153
|
-
if not tool_name:
|
|
154
|
-
return False
|
|
155
|
-
try:
|
|
156
|
-
import sqlite3
|
|
157
|
-
from datetime import datetime, timezone
|
|
158
|
-
|
|
159
|
-
try:
|
|
160
|
-
from superlocalmemory.hooks.session_registry import (
|
|
161
|
-
resolve_active_profile,
|
|
162
|
-
)
|
|
163
|
-
profile_id = resolve_active_profile() or "default"
|
|
164
|
-
except Exception:
|
|
165
|
-
profile_id = "default"
|
|
166
|
-
|
|
167
|
-
project_path = ""
|
|
168
|
-
raw_cwd = payload.get("cwd")
|
|
169
|
-
if isinstance(raw_cwd, str):
|
|
170
|
-
project_path = raw_cwd[:_MAX_SUMMARY_LEN]
|
|
171
|
-
|
|
172
|
-
conn = sqlite3.connect(str(_memory_db_path()), timeout=0.05)
|
|
173
|
-
try:
|
|
174
|
-
conn.execute("PRAGMA busy_timeout=50")
|
|
175
|
-
conn.execute(
|
|
176
|
-
"INSERT INTO tool_events "
|
|
177
|
-
"(session_id, profile_id, project_path, tool_name, event_type,"
|
|
178
|
-
" input_summary, output_summary, duration_ms, metadata,"
|
|
179
|
-
" created_at) "
|
|
180
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
181
|
-
(
|
|
182
|
-
session_id,
|
|
183
|
-
profile_id,
|
|
184
|
-
project_path,
|
|
185
|
-
tool_name,
|
|
186
|
-
"complete",
|
|
187
|
-
_summary(payload.get("tool_input")),
|
|
188
|
-
_summary(response_text),
|
|
189
|
-
0,
|
|
190
|
-
"{}",
|
|
191
|
-
datetime.now(timezone.utc).isoformat(),
|
|
192
|
-
),
|
|
193
|
-
)
|
|
194
|
-
conn.commit()
|
|
195
|
-
finally:
|
|
196
|
-
conn.close()
|
|
197
|
-
return True
|
|
198
|
-
except Exception:
|
|
199
|
-
return False
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def _inner_main() -> str:
|
|
203
|
-
"""Return an ``outcome`` string (for perf log); never raises."""
|
|
204
|
-
payload = read_stdin_json()
|
|
205
|
-
if payload is None:
|
|
206
|
-
return "invalid_payload"
|
|
207
|
-
|
|
208
|
-
session_id = payload.get("session_id")
|
|
209
|
-
tool_name = payload.get("tool_name") or ""
|
|
210
|
-
if not isinstance(session_id, str) or not session_id:
|
|
211
|
-
return "no_session"
|
|
212
|
-
|
|
213
|
-
# S9-DASH-10: keep registry fresh on every PostToolUse so the MCP
|
|
214
|
-
# server can pick up the current session even mid-turn.
|
|
215
|
-
try:
|
|
216
|
-
from superlocalmemory.hooks.session_registry import (
|
|
217
|
-
mark_active,
|
|
218
|
-
resolve_active_profile,
|
|
219
|
-
)
|
|
220
|
-
mark_active(
|
|
221
|
-
session_id,
|
|
222
|
-
agent_type="claude",
|
|
223
|
-
profile_id=resolve_active_profile(),
|
|
224
|
-
)
|
|
225
|
-
except Exception:
|
|
226
|
-
pass
|
|
227
|
-
|
|
228
|
-
# Path-escape defence (SEC-C-02) — any unsafe session_id means we
|
|
229
|
-
# must not touch the filesystem for this invocation. We still want
|
|
230
|
-
# to safely query the DB (it uses parameterised SQL), so we only
|
|
231
|
-
# gate the filesystem branch.
|
|
232
|
-
_ = session_state_file(session_id) # None → caller skips FS writes
|
|
233
|
-
# Note: for post_tool_outcome we do NOT need to write session state.
|
|
234
|
-
# Rehash / stop hooks are the writers/readers.
|
|
235
|
-
|
|
236
|
-
# Response scan — capped BEFORE regex (bound O(cap)).
|
|
237
|
-
response_text = summarize_response(payload.get("tool_response"))
|
|
238
|
-
|
|
239
|
-
# The invocation is recorded before anything is decided about markers. An
|
|
240
|
-
# action the agent took is a fact about the session on its own terms; the
|
|
241
|
-
# marker only decides whether it also settles a pending recall.
|
|
242
|
-
_record_tool_event(session_id, tool_name, payload, response_text)
|
|
243
|
-
|
|
244
|
-
if not response_text:
|
|
245
|
-
return "no_response"
|
|
246
|
-
|
|
247
|
-
# Fast pre-check: if the HMAC prefix is absent, no marker can exist.
|
|
248
|
-
if "slm:fact:" not in response_text:
|
|
249
|
-
return "no_marker"
|
|
250
|
-
|
|
251
|
-
# S9-W2 M-SEC-03: cap marker iteration to prevent adversarial
|
|
252
|
-
# response_text floods. 5,000 crafted markers × ~5 μs HMAC = 25 ms
|
|
253
|
-
# of CPU inside a 20 ms hook budget — enough to cascade budget
|
|
254
|
-
# misses. LLD-09 says ≤10 facts per recall; 100 is ample headroom.
|
|
255
|
-
_MAX_MARKERS = 100
|
|
256
|
-
hits: list[str] = []
|
|
257
|
-
for m in _MARKER_RE.finditer(response_text):
|
|
258
|
-
if len(hits) >= _MAX_MARKERS:
|
|
259
|
-
break
|
|
260
|
-
marker = m.group(0)
|
|
261
|
-
fact_id = _validate(marker)
|
|
262
|
-
if fact_id:
|
|
263
|
-
hits.append(fact_id)
|
|
264
|
-
if not hits:
|
|
265
|
-
return "no_validated_marker"
|
|
266
|
-
|
|
267
|
-
# Persist signals via the canonical reward model — the DB write is
|
|
268
|
-
# behind ``register_signal`` which enforces the schema contract and
|
|
269
|
-
# the pending→settled state machine.
|
|
270
|
-
try:
|
|
271
|
-
from superlocalmemory.learning.reward import EngagementRewardModel
|
|
272
|
-
except Exception:
|
|
273
|
-
return "import_fail"
|
|
274
|
-
|
|
275
|
-
signal_name = "edit" if tool_name in _EDIT_TOOLS else "dwell_ms"
|
|
276
|
-
signal_value: object = True if signal_name == "edit" else _DEFAULT_DWELL_MS
|
|
277
|
-
|
|
278
|
-
# S9-W3 C6: single connection for BOTH the pending-row match AND
|
|
279
|
-
# the signal writes. Previously the hook opened ``open_memory_db()``
|
|
280
|
-
# for the SELECT, closed it, then constructed EngagementRewardModel
|
|
281
|
-
# which cached its own writer — two connects per invocation × 1-4 ms
|
|
282
|
-
# each × FileVault contention = blown 20 ms hook budget.
|
|
283
|
-
#
|
|
284
|
-
# H-SKEP-03 / H-ARC-H4: pending-row window raised back to 50
|
|
285
|
-
# (SEC-M2 had tightened it to 5 which silently dropped signals on
|
|
286
|
-
# heavy Claude Code sessions). Outer cap on returned outcome_ids
|
|
287
|
-
# caps UPDATE amplification at PENDING_WRITE_CAP × 10 by default.
|
|
288
|
-
try:
|
|
289
|
-
model = EngagementRewardModel(_memory_db_path())
|
|
290
|
-
except Exception:
|
|
291
|
-
return "model_init_fail"
|
|
292
|
-
|
|
293
|
-
try:
|
|
294
|
-
target_outcome_ids = model.match_pending_for_fact_ids(
|
|
295
|
-
session_id=session_id, fact_ids=hits,
|
|
296
|
-
)
|
|
297
|
-
if not target_outcome_ids:
|
|
298
|
-
# Distinguish "no pending rows exist" from "rows exist but
|
|
299
|
-
# none matched" for perf-log observability.
|
|
300
|
-
with model._lock:
|
|
301
|
-
conn = model._get_conn()
|
|
302
|
-
has_pending = conn.execute(
|
|
303
|
-
"SELECT 1 FROM pending_outcomes "
|
|
304
|
-
"WHERE session_id = ? AND status = 'pending' "
|
|
305
|
-
"LIMIT 1",
|
|
306
|
-
(session_id,),
|
|
307
|
-
).fetchone()
|
|
308
|
-
return "no_match" if has_pending else "no_pending"
|
|
309
|
-
|
|
310
|
-
wrote = 0
|
|
311
|
-
for oid in target_outcome_ids:
|
|
312
|
-
ok = model.register_signal(
|
|
313
|
-
outcome_id=oid,
|
|
314
|
-
signal_name=signal_name,
|
|
315
|
-
signal_value=signal_value,
|
|
316
|
-
)
|
|
317
|
-
if ok:
|
|
318
|
-
wrote += 1
|
|
319
|
-
return f"signal_{signal_name}_x{wrote}"
|
|
320
|
-
finally:
|
|
321
|
-
try:
|
|
322
|
-
model.close()
|
|
323
|
-
except Exception:
|
|
324
|
-
pass
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
def main() -> int:
|
|
328
|
-
"""Hook entry point — stdin JSON → signals_json update. Always exits 0."""
|
|
329
|
-
t0 = time.perf_counter()
|
|
330
|
-
outcome = "exception"
|
|
331
|
-
try:
|
|
332
|
-
outcome = _inner_main()
|
|
333
|
-
except Exception as exc: # pragma: no cover — defensive
|
|
334
|
-
try:
|
|
335
|
-
sys.stderr.write(
|
|
336
|
-
f"slm-hook {_HOOK_NAME}: {type(exc).__name__}\n"
|
|
337
|
-
)
|
|
338
|
-
except Exception:
|
|
339
|
-
pass
|
|
340
|
-
finally:
|
|
341
|
-
duration_ms = (time.perf_counter() - t0) * 1000.0
|
|
342
|
-
emit_empty_json()
|
|
343
|
-
try:
|
|
344
|
-
log_perf(_HOOK_NAME, duration_ms, outcome)
|
|
345
|
-
except Exception:
|
|
346
|
-
pass
|
|
347
|
-
return 0
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
if __name__ == "__main__": # pragma: no cover — CLI entry only
|
|
351
|
-
sys.exit(main())
|