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,637 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
"""EventBus -- Real-time event broadcasting for memory operations.
|
|
5
|
-
|
|
6
|
-
Thread-safe singleton per DB path. In-memory deque buffer + SQLite persistence.
|
|
7
|
-
Listener callbacks run on the emitter's thread.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import json
|
|
11
|
-
import logging
|
|
12
|
-
import sqlite3
|
|
13
|
-
import threading
|
|
14
|
-
from collections import deque
|
|
15
|
-
from datetime import datetime, timedelta, timezone
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.infra.data_root import state_path
|
|
20
|
-
from superlocalmemory.storage.write_lock import get_write_lock
|
|
21
|
-
|
|
22
|
-
if TYPE_CHECKING:
|
|
23
|
-
from superlocalmemory.storage.database import DatabaseManager
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger("superlocalmemory.events")
|
|
26
|
-
|
|
27
|
-
# Default retention windows (hours)
|
|
28
|
-
DEFAULT_HOT_HOURS = 48
|
|
29
|
-
DEFAULT_WARM_HOURS = 14 * 24 # 14 days
|
|
30
|
-
DEFAULT_COLD_HOURS = 30 * 24 # 30 days
|
|
31
|
-
|
|
32
|
-
# In-memory buffer size for real-time delivery
|
|
33
|
-
EVENT_BUFFER_SIZE = 200
|
|
34
|
-
|
|
35
|
-
# Valid event types (V3 superset)
|
|
36
|
-
VALID_EVENT_TYPES = frozenset([
|
|
37
|
-
"memory.stored", # New memory written (was memory.created in V2)
|
|
38
|
-
"memory.updated", # Existing memory modified
|
|
39
|
-
"memory.deleted", # Memory removed
|
|
40
|
-
"memory.recalled", # Memory retrieved by an agent
|
|
41
|
-
"memory.observed", # /observe accepted content into the debounce buffer
|
|
42
|
-
"memory.captured", # AutoCapture matched a buffered observation
|
|
43
|
-
"memory.dropped", # AutoCapture rejected a buffered observation
|
|
44
|
-
"memory.queued", # /remember accepted content into pending.db (async)
|
|
45
|
-
"graph.updated", # Knowledge graph rebuilt
|
|
46
|
-
"pattern.learned", # New pattern detected
|
|
47
|
-
"agent.connected", # New agent connects
|
|
48
|
-
"agent.disconnected", # Agent disconnects
|
|
49
|
-
"trust.signal", # V3: trust score change
|
|
50
|
-
"compliance.audit", # V3: compliance event logged
|
|
51
|
-
"learning.feedback", # V3: learning feedback received
|
|
52
|
-
# CodeGraph events (v3.4) — NOTE: "graph.updated" is SLM entity graph, "code_graph.*" is AST code graph
|
|
53
|
-
"code_graph.built", # Full code graph build completed
|
|
54
|
-
"code_graph.updated", # Incremental code graph update completed
|
|
55
|
-
"code_graph.node_changed", # Function/class signature or body changed
|
|
56
|
-
"code_graph.node_deleted", # Function/class/file removed from codebase
|
|
57
|
-
])
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class EventBus:
|
|
61
|
-
"""
|
|
62
|
-
Central event bus for SuperLocalMemory V3.
|
|
63
|
-
|
|
64
|
-
Singleton per database path. Emits events to persistent storage and
|
|
65
|
-
in-memory listeners simultaneously. Thread-safe.
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
_instances: Dict[str, "EventBus"] = {}
|
|
69
|
-
_instances_lock = threading.Lock()
|
|
70
|
-
|
|
71
|
-
@classmethod
|
|
72
|
-
def get_instance(
|
|
73
|
-
cls,
|
|
74
|
-
db_path: Optional[Path] = None,
|
|
75
|
-
db: "DatabaseManager | None" = None,
|
|
76
|
-
) -> "EventBus":
|
|
77
|
-
"""Get or create the singleton EventBus for a database path.
|
|
78
|
-
|
|
79
|
-
Fix C: optional ``db`` forwarded to the constructor on first creation.
|
|
80
|
-
On subsequent calls for the same path the existing instance is returned;
|
|
81
|
-
callers that need to wire a DatabaseManager after construction should
|
|
82
|
-
call ``instance.set_db(db)`` separately.
|
|
83
|
-
"""
|
|
84
|
-
if db_path is None:
|
|
85
|
-
db_path = state_path("memory.db")
|
|
86
|
-
|
|
87
|
-
key = str(db_path)
|
|
88
|
-
with cls._instances_lock:
|
|
89
|
-
if key not in cls._instances:
|
|
90
|
-
cls._instances[key] = cls(db_path, db=db)
|
|
91
|
-
return cls._instances[key]
|
|
92
|
-
|
|
93
|
-
@classmethod
|
|
94
|
-
def reset_instance(cls, db_path: Optional[Path] = None) -> None:
|
|
95
|
-
"""Remove and close a singleton instance. Used for testing."""
|
|
96
|
-
with cls._instances_lock:
|
|
97
|
-
if db_path is None:
|
|
98
|
-
cls._instances.clear()
|
|
99
|
-
else:
|
|
100
|
-
key = str(db_path)
|
|
101
|
-
if key in cls._instances:
|
|
102
|
-
del cls._instances[key]
|
|
103
|
-
|
|
104
|
-
def __init__(
|
|
105
|
-
self,
|
|
106
|
-
db_path: Path,
|
|
107
|
-
db: "DatabaseManager | None" = None,
|
|
108
|
-
) -> None:
|
|
109
|
-
"""Initialize EventBus. Prefer get_instance() over direct construction.
|
|
110
|
-
|
|
111
|
-
Fix C: optional ``db`` parameter. When provided, all write paths
|
|
112
|
-
(INSERT / UPDATE / DELETE) are routed through DatabaseManager.execute()
|
|
113
|
-
which acquires the process-level RLock before opening a connection.
|
|
114
|
-
This eliminates the EventBus write-storm contribution to the memory.db
|
|
115
|
-
lock contention: instead of 5 independent bare sqlite3.connect() calls
|
|
116
|
-
racing the materialiser, all writes queue through the single writer.
|
|
117
|
-
|
|
118
|
-
When ``db`` is None the fallback path is used — direct sqlite3.connect()
|
|
119
|
-
with ``PRAGMA busy_timeout=10000`` on every connection. This is safe
|
|
120
|
-
for standalone / testing use but is NOT process-lock-serialised.
|
|
121
|
-
"""
|
|
122
|
-
self.db_path = Path(db_path)
|
|
123
|
-
self._db: "DatabaseManager | None" = db
|
|
124
|
-
if db is None:
|
|
125
|
-
logger.debug(
|
|
126
|
-
"EventBus operating in standalone mode — no DatabaseManager "
|
|
127
|
-
"provided; concurrency is unmanaged (busy_timeout=10000 applied)"
|
|
128
|
-
)
|
|
129
|
-
self._buffer: deque = deque(maxlen=EVENT_BUFFER_SIZE)
|
|
130
|
-
self._buffer_lock = threading.Lock()
|
|
131
|
-
self._event_counter = 0
|
|
132
|
-
self._counter_lock = threading.Lock()
|
|
133
|
-
self._listeners: List[Callable[[dict], None]] = []
|
|
134
|
-
self._listeners_lock = threading.Lock()
|
|
135
|
-
self._write_count = 0
|
|
136
|
-
self._last_prune = datetime.now()
|
|
137
|
-
self._init_schema()
|
|
138
|
-
logger.info("EventBus initialized: db=%s", self.db_path)
|
|
139
|
-
|
|
140
|
-
def set_db(self, db: "DatabaseManager") -> None:
|
|
141
|
-
"""Wire EventBus to an already-initialised DatabaseManager.
|
|
142
|
-
|
|
143
|
-
For daemon start-up sequences where EventBus is constructed before
|
|
144
|
-
DatabaseManager is ready. Call once from the daemon after both
|
|
145
|
-
are initialised. Subsequent write calls will use ``db``.
|
|
146
|
-
"""
|
|
147
|
-
self._db = db
|
|
148
|
-
|
|
149
|
-
def _init_schema(self) -> None:
|
|
150
|
-
"""Create the memory_events table if it does not exist.
|
|
151
|
-
|
|
152
|
-
Self-migrates a pre-isolation DB (memory_events without profile_id) so a
|
|
153
|
-
dashboard viewing profile A never sees profile B's events. This table is
|
|
154
|
-
store-owned (created here, not by the migration runner), so the store
|
|
155
|
-
owns its upgrade. Existing rows backfill to the 'default' profile.
|
|
156
|
-
|
|
157
|
-
Uses a direct connection here (before DatabaseManager may be available)
|
|
158
|
-
with busy_timeout=10000 for robustness during daemon start-up.
|
|
159
|
-
"""
|
|
160
|
-
# Startup DDL is a memory.db write — serialise it with the process
|
|
161
|
-
# write lock so a bus created concurrently with active writers cannot
|
|
162
|
-
# race the schema create/migrate at the WAL layer.
|
|
163
|
-
with get_write_lock(self.db_path):
|
|
164
|
-
conn = sqlite3.connect(str(self.db_path))
|
|
165
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
166
|
-
try:
|
|
167
|
-
cur = conn.cursor()
|
|
168
|
-
cur.execute("""
|
|
169
|
-
CREATE TABLE IF NOT EXISTS memory_events (
|
|
170
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
171
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
172
|
-
event_type TEXT NOT NULL,
|
|
173
|
-
memory_id INTEGER,
|
|
174
|
-
source_agent TEXT DEFAULT 'user',
|
|
175
|
-
source_protocol TEXT DEFAULT 'internal',
|
|
176
|
-
payload TEXT,
|
|
177
|
-
importance INTEGER DEFAULT 5,
|
|
178
|
-
tier TEXT DEFAULT 'hot',
|
|
179
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
180
|
-
)
|
|
181
|
-
""")
|
|
182
|
-
existing = {r[1] for r in cur.execute(
|
|
183
|
-
"PRAGMA table_info(memory_events)").fetchall()}
|
|
184
|
-
if "profile_id" not in existing:
|
|
185
|
-
cur.execute(
|
|
186
|
-
"ALTER TABLE memory_events "
|
|
187
|
-
"ADD COLUMN profile_id TEXT NOT NULL DEFAULT 'default'"
|
|
188
|
-
)
|
|
189
|
-
cur.execute("CREATE INDEX IF NOT EXISTS idx_events_type ON memory_events(event_type)")
|
|
190
|
-
cur.execute("CREATE INDEX IF NOT EXISTS idx_events_created ON memory_events(created_at)")
|
|
191
|
-
cur.execute("CREATE INDEX IF NOT EXISTS idx_events_tier ON memory_events(tier)")
|
|
192
|
-
cur.execute("CREATE INDEX IF NOT EXISTS idx_events_profile ON memory_events(profile_id, id)")
|
|
193
|
-
conn.commit()
|
|
194
|
-
finally:
|
|
195
|
-
conn.close()
|
|
196
|
-
|
|
197
|
-
@staticmethod
|
|
198
|
-
def _resolve_profile(profile_id: Optional[str]) -> str:
|
|
199
|
-
"""Resolve the active profile for an event when not passed explicitly.
|
|
200
|
-
|
|
201
|
-
Uses the request-runtime helper (ContextVar for HTTP, else the
|
|
202
|
-
profiles.json active_profile cache that every switch keeps in sync) so
|
|
203
|
-
MCP-in-daemon and CLI emits are attributed correctly too. Lazy import
|
|
204
|
-
keeps the infra layer free of a hard server dependency; any failure
|
|
205
|
-
falls back to 'default'.
|
|
206
|
-
"""
|
|
207
|
-
if profile_id:
|
|
208
|
-
return profile_id
|
|
209
|
-
try:
|
|
210
|
-
from superlocalmemory.server.routes.helpers import get_active_profile
|
|
211
|
-
resolved = get_active_profile()
|
|
212
|
-
if resolved:
|
|
213
|
-
return resolved
|
|
214
|
-
except Exception:
|
|
215
|
-
pass
|
|
216
|
-
return "default"
|
|
217
|
-
|
|
218
|
-
def emit(
|
|
219
|
-
self,
|
|
220
|
-
event_type: str,
|
|
221
|
-
payload: Optional[Dict[str, Any]] = None,
|
|
222
|
-
memory_id: Optional[int] = None,
|
|
223
|
-
source_agent: str = "user",
|
|
224
|
-
source_protocol: str = "internal",
|
|
225
|
-
importance: int = 5,
|
|
226
|
-
profile_id: Optional[str] = None,
|
|
227
|
-
) -> Optional[int]:
|
|
228
|
-
"""Emit an event to all subscribers and persist to database.
|
|
229
|
-
|
|
230
|
-
``profile_id`` scopes the event to a memory profile. When omitted it is
|
|
231
|
-
resolved from the active profile so a dashboard viewing one profile
|
|
232
|
-
never sees another profile's real-time or historical events.
|
|
233
|
-
"""
|
|
234
|
-
if event_type not in VALID_EVENT_TYPES:
|
|
235
|
-
raise ValueError(
|
|
236
|
-
f"Invalid event type: {event_type}. "
|
|
237
|
-
f"Valid: {', '.join(sorted(VALID_EVENT_TYPES))}"
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
importance = max(1, min(10, importance))
|
|
241
|
-
profile_id = self._resolve_profile(profile_id)
|
|
242
|
-
|
|
243
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
244
|
-
with self._counter_lock:
|
|
245
|
-
self._event_counter += 1
|
|
246
|
-
seq = self._event_counter
|
|
247
|
-
|
|
248
|
-
event: Dict[str, Any] = {
|
|
249
|
-
"seq": seq,
|
|
250
|
-
"profile_id": profile_id,
|
|
251
|
-
"event_type": event_type,
|
|
252
|
-
"memory_id": memory_id,
|
|
253
|
-
"source_agent": source_agent,
|
|
254
|
-
"source_protocol": source_protocol,
|
|
255
|
-
"payload": payload or {},
|
|
256
|
-
"importance": importance,
|
|
257
|
-
"timestamp": now,
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
# 1. Persist
|
|
261
|
-
event_id = self._persist_event(event)
|
|
262
|
-
if event_id is not None:
|
|
263
|
-
event["id"] = event_id
|
|
264
|
-
|
|
265
|
-
# 2. Buffer
|
|
266
|
-
with self._buffer_lock:
|
|
267
|
-
self._buffer.append(event)
|
|
268
|
-
|
|
269
|
-
# 3. Notify
|
|
270
|
-
self._notify_listeners(event)
|
|
271
|
-
|
|
272
|
-
logger.debug(
|
|
273
|
-
"Event emitted: type=%s id=%s memory_id=%s",
|
|
274
|
-
event_type, event_id, memory_id,
|
|
275
|
-
)
|
|
276
|
-
|
|
277
|
-
# Auto-prune heuristic. Decide + reset the counter atomically under the
|
|
278
|
-
# lock so concurrent emit() calls cannot both cross the threshold and
|
|
279
|
-
# double-run the prune; run the prune itself OUTSIDE the lock.
|
|
280
|
-
should_prune = False
|
|
281
|
-
with self._counter_lock:
|
|
282
|
-
self._write_count += 1
|
|
283
|
-
if (
|
|
284
|
-
self._write_count >= 100
|
|
285
|
-
or (datetime.now() - self._last_prune).total_seconds() > 86400
|
|
286
|
-
):
|
|
287
|
-
should_prune = True
|
|
288
|
-
self._write_count = 0
|
|
289
|
-
self._last_prune = datetime.now()
|
|
290
|
-
if should_prune:
|
|
291
|
-
try:
|
|
292
|
-
self.prune_events()
|
|
293
|
-
except Exception:
|
|
294
|
-
pass
|
|
295
|
-
|
|
296
|
-
return event_id
|
|
297
|
-
|
|
298
|
-
# Alias for V3 compatibility
|
|
299
|
-
publish = emit
|
|
300
|
-
|
|
301
|
-
def _persist_event(self, event: dict) -> Optional[int]:
|
|
302
|
-
"""Persist event to the memory_events table. Returns row id or None.
|
|
303
|
-
|
|
304
|
-
Fix C: when a DatabaseManager is available, routes the INSERT through
|
|
305
|
-
db.execute() (which acquires the process-level RLock for the write).
|
|
306
|
-
The fallback path (no db) uses a direct connection with
|
|
307
|
-
busy_timeout=10000 for resilience against short lock holds.
|
|
308
|
-
|
|
309
|
-
Note: db.execute() returns list[sqlite3.Row] — for an INSERT the
|
|
310
|
-
return value is empty. The ROWID of the inserted row is retrieved
|
|
311
|
-
with a follow-up SELECT last_insert_rowid() on the same connection.
|
|
312
|
-
Because db.execute() is a per-call connect/commit/close, the rowid
|
|
313
|
-
is obtained inside the same logical operation.
|
|
314
|
-
"""
|
|
315
|
-
sql = (
|
|
316
|
-
"INSERT INTO memory_events (profile_id, event_type, memory_id,"
|
|
317
|
-
" source_agent, source_protocol, payload, importance, tier,"
|
|
318
|
-
" created_at)"
|
|
319
|
-
" VALUES (?, ?, ?, ?, ?, ?, ?, 'hot', ?)"
|
|
320
|
-
)
|
|
321
|
-
params = (
|
|
322
|
-
event.get("profile_id", "default"),
|
|
323
|
-
event["event_type"],
|
|
324
|
-
event.get("memory_id"),
|
|
325
|
-
event["source_agent"],
|
|
326
|
-
event["source_protocol"],
|
|
327
|
-
json.dumps(event["payload"]),
|
|
328
|
-
event["importance"],
|
|
329
|
-
event["timestamp"],
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
try:
|
|
333
|
-
if self._db is not None:
|
|
334
|
-
# Serialised path: routes through DatabaseManager's RLock.
|
|
335
|
-
# Use a transaction() context to get the lastrowid.
|
|
336
|
-
with self._db.transaction():
|
|
337
|
-
self._db.execute(sql, params)
|
|
338
|
-
rows = self._db.execute("SELECT last_insert_rowid() AS id")
|
|
339
|
-
return int(rows[0]["id"]) if rows else None
|
|
340
|
-
else:
|
|
341
|
-
# Fallback: acquire the process write lock BEFORE opening the
|
|
342
|
-
# connection so this INSERT is serialised with every other
|
|
343
|
-
# memory.db writer even when no DatabaseManager was wired in
|
|
344
|
-
# (daemon/route/MCP callers construct via get_instance(path)).
|
|
345
|
-
# The write is a single tiny row — the lock is held for <1ms.
|
|
346
|
-
with get_write_lock(self.db_path):
|
|
347
|
-
conn = sqlite3.connect(str(self.db_path))
|
|
348
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
349
|
-
try:
|
|
350
|
-
cur = conn.cursor()
|
|
351
|
-
cur.execute(sql, params)
|
|
352
|
-
conn.commit()
|
|
353
|
-
return cur.lastrowid
|
|
354
|
-
finally:
|
|
355
|
-
conn.close()
|
|
356
|
-
except Exception as exc:
|
|
357
|
-
logger.error("Failed to persist event: %s", exc)
|
|
358
|
-
return None
|
|
359
|
-
|
|
360
|
-
def add_listener(self, callback: Callable[[dict], None]) -> None:
|
|
361
|
-
"""Register a listener that receives every emitted event."""
|
|
362
|
-
with self._listeners_lock:
|
|
363
|
-
self._listeners.append(callback)
|
|
364
|
-
|
|
365
|
-
# Alias
|
|
366
|
-
subscribe = add_listener
|
|
367
|
-
|
|
368
|
-
def remove_listener(self, callback: Callable[[dict], None]) -> None:
|
|
369
|
-
"""Remove a previously registered listener."""
|
|
370
|
-
with self._listeners_lock:
|
|
371
|
-
try:
|
|
372
|
-
self._listeners.remove(callback)
|
|
373
|
-
except ValueError:
|
|
374
|
-
pass
|
|
375
|
-
|
|
376
|
-
# Alias
|
|
377
|
-
unsubscribe = remove_listener
|
|
378
|
-
|
|
379
|
-
def _notify_listeners(self, event: dict) -> None:
|
|
380
|
-
"""Call all registered listeners. Errors are logged, not raised."""
|
|
381
|
-
with self._listeners_lock:
|
|
382
|
-
listeners = list(self._listeners)
|
|
383
|
-
|
|
384
|
-
for listener in listeners:
|
|
385
|
-
try:
|
|
386
|
-
listener(event)
|
|
387
|
-
except Exception as exc:
|
|
388
|
-
logger.error("Event listener failed: %s", exc)
|
|
389
|
-
|
|
390
|
-
def get_recent_events(
|
|
391
|
-
self,
|
|
392
|
-
since_id: Optional[int] = None,
|
|
393
|
-
limit: int = 50,
|
|
394
|
-
event_type: Optional[str] = None,
|
|
395
|
-
profile_id: Optional[str] = None,
|
|
396
|
-
) -> List[dict]:
|
|
397
|
-
"""Get recent events from the database, scoped to a profile.
|
|
398
|
-
|
|
399
|
-
``profile_id`` defaults to the active profile so callers never leak
|
|
400
|
-
another profile's events. Pass ``profile_id="*"`` to bypass scoping
|
|
401
|
-
(internal maintenance/pruning only — never a client-facing path).
|
|
402
|
-
"""
|
|
403
|
-
limit = min(limit, 200)
|
|
404
|
-
scope = profile_id if profile_id == "*" else self._resolve_profile(profile_id)
|
|
405
|
-
|
|
406
|
-
try:
|
|
407
|
-
conn = sqlite3.connect(str(self.db_path))
|
|
408
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
409
|
-
try:
|
|
410
|
-
cur = conn.cursor()
|
|
411
|
-
|
|
412
|
-
query = ("SELECT id, event_type, memory_id, source_agent,"
|
|
413
|
-
" source_protocol, payload, importance, tier, created_at,"
|
|
414
|
-
" profile_id"
|
|
415
|
-
" FROM memory_events WHERE 1=1")
|
|
416
|
-
params: List[Any] = []
|
|
417
|
-
|
|
418
|
-
if scope != "*":
|
|
419
|
-
query += " AND profile_id = ?"
|
|
420
|
-
params.append(scope)
|
|
421
|
-
|
|
422
|
-
if since_id is not None:
|
|
423
|
-
query += " AND id > ?"
|
|
424
|
-
params.append(since_id)
|
|
425
|
-
|
|
426
|
-
if event_type:
|
|
427
|
-
query += " AND event_type = ?"
|
|
428
|
-
params.append(event_type)
|
|
429
|
-
|
|
430
|
-
query += " ORDER BY id ASC LIMIT ?"
|
|
431
|
-
params.append(limit)
|
|
432
|
-
|
|
433
|
-
cur.execute(query, params)
|
|
434
|
-
rows = cur.fetchall()
|
|
435
|
-
finally:
|
|
436
|
-
conn.close()
|
|
437
|
-
|
|
438
|
-
events: List[dict] = []
|
|
439
|
-
for row in rows:
|
|
440
|
-
try:
|
|
441
|
-
parsed = json.loads(row[5]) if row[5] else {}
|
|
442
|
-
except (json.JSONDecodeError, TypeError):
|
|
443
|
-
parsed = {}
|
|
444
|
-
events.append({
|
|
445
|
-
"id": row[0], "event_type": row[1], "memory_id": row[2],
|
|
446
|
-
"source_agent": row[3], "source_protocol": row[4],
|
|
447
|
-
"payload": parsed, "importance": row[6],
|
|
448
|
-
"tier": row[7], "timestamp": row[8], "profile_id": row[9],
|
|
449
|
-
})
|
|
450
|
-
return events
|
|
451
|
-
|
|
452
|
-
except Exception as exc:
|
|
453
|
-
logger.error("Failed to get recent events: %s", exc)
|
|
454
|
-
return []
|
|
455
|
-
|
|
456
|
-
def get_buffered_events(self, since_seq: int = 0) -> List[dict]:
|
|
457
|
-
"""Get events from the in-memory buffer (no DB hit)."""
|
|
458
|
-
with self._buffer_lock:
|
|
459
|
-
return [e for e in self._buffer if e.get("seq", 0) > since_seq]
|
|
460
|
-
|
|
461
|
-
def get_event_stats(self, profile_id: Optional[str] = None) -> dict:
|
|
462
|
-
"""Get event system statistics, scoped to a profile.
|
|
463
|
-
|
|
464
|
-
``profile_id`` defaults to the active profile so dashboard event
|
|
465
|
-
counts never blend across profiles.
|
|
466
|
-
"""
|
|
467
|
-
scope = self._resolve_profile(profile_id)
|
|
468
|
-
try:
|
|
469
|
-
conn = sqlite3.connect(str(self.db_path))
|
|
470
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
471
|
-
try:
|
|
472
|
-
cur = conn.cursor()
|
|
473
|
-
|
|
474
|
-
total = cur.execute(
|
|
475
|
-
"SELECT COUNT(*) FROM memory_events WHERE profile_id = ?",
|
|
476
|
-
(scope,)).fetchone()[0]
|
|
477
|
-
cur.execute(
|
|
478
|
-
"SELECT event_type, COUNT(*) FROM memory_events "
|
|
479
|
-
"WHERE profile_id = ? GROUP BY event_type", (scope,))
|
|
480
|
-
by_type = dict(cur.fetchall())
|
|
481
|
-
cur.execute(
|
|
482
|
-
"SELECT tier, COUNT(*) FROM memory_events "
|
|
483
|
-
"WHERE profile_id = ? GROUP BY tier", (scope,))
|
|
484
|
-
by_tier = dict(cur.fetchall())
|
|
485
|
-
cur.execute(
|
|
486
|
-
"SELECT COUNT(*) FROM memory_events WHERE profile_id = ? "
|
|
487
|
-
"AND created_at >= datetime('now', '-24 hours')", (scope,))
|
|
488
|
-
last_24h = cur.fetchone()[0]
|
|
489
|
-
finally:
|
|
490
|
-
conn.close()
|
|
491
|
-
|
|
492
|
-
return {
|
|
493
|
-
**by_type,
|
|
494
|
-
"total_events": total,
|
|
495
|
-
"events_last_24h": last_24h,
|
|
496
|
-
"by_type": by_type,
|
|
497
|
-
"by_tier": by_tier,
|
|
498
|
-
"buffer_size": len(self._buffer),
|
|
499
|
-
"listener_count": len(self._listeners),
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
except Exception as exc:
|
|
503
|
-
logger.error("Failed to get event stats: %s", exc)
|
|
504
|
-
return {"total_events": 0, "error": str(exc)}
|
|
505
|
-
|
|
506
|
-
def prune_events(
|
|
507
|
-
self,
|
|
508
|
-
hot_hours: int = DEFAULT_HOT_HOURS,
|
|
509
|
-
warm_hours: int = DEFAULT_WARM_HOURS,
|
|
510
|
-
cold_hours: int = DEFAULT_COLD_HOURS,
|
|
511
|
-
) -> dict:
|
|
512
|
-
"""Apply tiered retention policy to persisted events.
|
|
513
|
-
|
|
514
|
-
INTENTIONALLY GLOBAL (all profiles): this is age/tier-based housekeeping
|
|
515
|
-
of the shared event log, not a per-tenant read or retention-policy
|
|
516
|
-
surface. Tenant isolation of event CONTENT is enforced on read via the
|
|
517
|
-
profile_id filter; this sweep only demotes/expires old rows by age.
|
|
518
|
-
"""
|
|
519
|
-
now = datetime.now()
|
|
520
|
-
warm_cutoff = (now - timedelta(hours=hot_hours)).isoformat()
|
|
521
|
-
cold_cutoff = (now - timedelta(hours=warm_hours)).isoformat()
|
|
522
|
-
archive_cutoff = (now - timedelta(hours=cold_hours)).isoformat()
|
|
523
|
-
stats = {"hot_to_warm": 0, "warm_to_cold": 0, "archived": 0}
|
|
524
|
-
|
|
525
|
-
_PRUNE_BATCH = 5000 # max rows per transaction — keeps lock time bounded
|
|
526
|
-
|
|
527
|
-
if self._db is not None:
|
|
528
|
-
# Fix C: route tier-management writes through DatabaseManager.
|
|
529
|
-
# Use separate short transactions per batch to avoid one long hold.
|
|
530
|
-
try:
|
|
531
|
-
# Hot → warm (UPDATE, bounded loop)
|
|
532
|
-
while True:
|
|
533
|
-
with self._db.transaction():
|
|
534
|
-
self._db.execute(
|
|
535
|
-
"UPDATE memory_events SET tier = 'warm' "
|
|
536
|
-
"WHERE rowid IN ("
|
|
537
|
-
" SELECT rowid FROM memory_events "
|
|
538
|
-
" WHERE tier = 'hot' AND created_at < ? AND importance < 5 "
|
|
539
|
-
" LIMIT ?"
|
|
540
|
-
")",
|
|
541
|
-
(warm_cutoff, _PRUNE_BATCH),
|
|
542
|
-
)
|
|
543
|
-
rows = self._db.execute("SELECT changes()")
|
|
544
|
-
changed = rows[0][0] if rows else 0
|
|
545
|
-
stats["hot_to_warm"] += changed
|
|
546
|
-
if changed < _PRUNE_BATCH:
|
|
547
|
-
break
|
|
548
|
-
|
|
549
|
-
# Warm → cold (DELETE, bounded loop)
|
|
550
|
-
while True:
|
|
551
|
-
with self._db.transaction():
|
|
552
|
-
self._db.execute(
|
|
553
|
-
"DELETE FROM memory_events "
|
|
554
|
-
"WHERE rowid IN ("
|
|
555
|
-
" SELECT rowid FROM memory_events "
|
|
556
|
-
" WHERE tier = 'warm' AND created_at < ? "
|
|
557
|
-
" LIMIT ?"
|
|
558
|
-
")",
|
|
559
|
-
(cold_cutoff, _PRUNE_BATCH),
|
|
560
|
-
)
|
|
561
|
-
rows = self._db.execute("SELECT changes()")
|
|
562
|
-
changed = rows[0][0] if rows else 0
|
|
563
|
-
stats["warm_to_cold"] += changed
|
|
564
|
-
if changed < _PRUNE_BATCH:
|
|
565
|
-
break
|
|
566
|
-
|
|
567
|
-
# Archive prune (DELETE, bounded loop)
|
|
568
|
-
while True:
|
|
569
|
-
with self._db.transaction():
|
|
570
|
-
self._db.execute(
|
|
571
|
-
"DELETE FROM memory_events "
|
|
572
|
-
"WHERE rowid IN ("
|
|
573
|
-
" SELECT rowid FROM memory_events "
|
|
574
|
-
" WHERE created_at < ? "
|
|
575
|
-
" LIMIT ?"
|
|
576
|
-
")",
|
|
577
|
-
(archive_cutoff, _PRUNE_BATCH),
|
|
578
|
-
)
|
|
579
|
-
rows = self._db.execute("SELECT changes()")
|
|
580
|
-
changed = rows[0][0] if rows else 0
|
|
581
|
-
stats["archived"] += changed
|
|
582
|
-
if changed < _PRUNE_BATCH:
|
|
583
|
-
break
|
|
584
|
-
|
|
585
|
-
logger.info(
|
|
586
|
-
"Prune complete (via db): hot->warm=%d warm->cold=%d archived=%d",
|
|
587
|
-
stats["hot_to_warm"], stats["warm_to_cold"], stats["archived"],
|
|
588
|
-
)
|
|
589
|
-
return stats
|
|
590
|
-
except Exception as exc:
|
|
591
|
-
logger.error("Event pruning failed (db path): %s", exc)
|
|
592
|
-
return {"error": str(exc)}
|
|
593
|
-
|
|
594
|
-
# Fallback: acquire the process write lock so this maintenance prune
|
|
595
|
-
# is serialised with all other memory.db writers even when no
|
|
596
|
-
# DatabaseManager was wired in. memory_events is a small bounded table
|
|
597
|
-
# (retention-capped) so the lock is held only briefly.
|
|
598
|
-
try:
|
|
599
|
-
with get_write_lock(self.db_path):
|
|
600
|
-
conn = sqlite3.connect(str(self.db_path))
|
|
601
|
-
conn.execute("PRAGMA busy_timeout=10000")
|
|
602
|
-
try:
|
|
603
|
-
cur = conn.cursor()
|
|
604
|
-
|
|
605
|
-
cur.execute(
|
|
606
|
-
"UPDATE memory_events SET tier = 'warm' "
|
|
607
|
-
"WHERE tier = 'hot' AND created_at < ? AND importance < 5",
|
|
608
|
-
(warm_cutoff,),
|
|
609
|
-
)
|
|
610
|
-
stats["hot_to_warm"] = cur.rowcount
|
|
611
|
-
|
|
612
|
-
cur.execute(
|
|
613
|
-
"DELETE FROM memory_events "
|
|
614
|
-
"WHERE tier = 'warm' AND created_at < ?",
|
|
615
|
-
(cold_cutoff,),
|
|
616
|
-
)
|
|
617
|
-
stats["warm_to_cold"] = cur.rowcount
|
|
618
|
-
|
|
619
|
-
cur.execute(
|
|
620
|
-
"DELETE FROM memory_events WHERE created_at < ?",
|
|
621
|
-
(archive_cutoff,),
|
|
622
|
-
)
|
|
623
|
-
stats["archived"] = cur.rowcount
|
|
624
|
-
|
|
625
|
-
conn.commit()
|
|
626
|
-
finally:
|
|
627
|
-
conn.close()
|
|
628
|
-
|
|
629
|
-
logger.info(
|
|
630
|
-
"Prune complete: hot->warm=%d warm->cold=%d archived=%d",
|
|
631
|
-
stats["hot_to_warm"], stats["warm_to_cold"], stats["archived"],
|
|
632
|
-
)
|
|
633
|
-
return stats
|
|
634
|
-
|
|
635
|
-
except Exception as exc:
|
|
636
|
-
logger.error("Event pruning failed: %s", exc)
|
|
637
|
-
return {"error": str(exc)}
|