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,262 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Does this sentence describe something that has not happened yet?
|
|
6
|
-
|
|
7
|
-
A prospective memory is a plan: a deadline, an appointment, a scheduled event,
|
|
8
|
-
something with a date still ahead of it. It is a different kind of memory from
|
|
9
|
-
a record of what happened, and it is meant to be small and precise — the
|
|
10
|
-
handful of things a user is waiting on.
|
|
11
|
-
|
|
12
|
-
WHY THIS MODULE EXISTS
|
|
13
|
-
|
|
14
|
-
Two different regexes used to answer this question, one in ``fact_extractor``
|
|
15
|
-
and one in ``type_router``, and they disagreed. Measured on a real 468 MB
|
|
16
|
-
store: 869 facts carried the prospective type and **7** contained any planning
|
|
17
|
-
language at all. The rest were session summaries and records of completed work.
|
|
18
|
-
|
|
19
|
-
The extractor's pattern contained ``by \\w+``, which matches every passive-voice
|
|
20
|
-
and attribution sentence ever written — "was caused **by a** stale DNS entry" —
|
|
21
|
-
and ``yesterday``, which cannot indicate a plan. The router's contained bare
|
|
22
|
-
``ends?``, so "the service ends at midnight" was a plan.
|
|
23
|
-
|
|
24
|
-
WHAT REPLACED THEM
|
|
25
|
-
|
|
26
|
-
Two tiers, because the evidence really is of two strengths:
|
|
27
|
-
|
|
28
|
-
*Definite* markers point forward on their own. "Tomorrow" is tomorrow whatever
|
|
29
|
-
else the sentence says, and a deadline is a deadline.
|
|
30
|
-
|
|
31
|
-
*Circumstantial* markers — a weekday, a clock time, "starts", "in three days" —
|
|
32
|
-
are shaped like a plan but read equally well as narration. They count only when
|
|
33
|
-
nothing in the sentence says the thing already happened.
|
|
34
|
-
|
|
35
|
-
The asymmetry is deliberate. A plan wrongly filed as an ordinary memory is
|
|
36
|
-
still found by every other channel and costs a user nothing. An ordinary
|
|
37
|
-
memory wrongly filed as a plan pollutes the one list a user checks to see what
|
|
38
|
-
is coming up. **When in doubt, it is not a plan.**
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
from __future__ import annotations
|
|
42
|
-
|
|
43
|
-
import re
|
|
44
|
-
|
|
45
|
-
__all__ = [
|
|
46
|
-
"ANCHORED_FUTURE",
|
|
47
|
-
"PLANNING_LANGUAGE",
|
|
48
|
-
"CIRCUMSTANTIAL_FUTURE",
|
|
49
|
-
"RECURRING",
|
|
50
|
-
"ALREADY_HAPPENED",
|
|
51
|
-
"CALLED_OFF",
|
|
52
|
-
"PLACEMENT",
|
|
53
|
-
"RESCHEDULING",
|
|
54
|
-
"DEFINITE_FUTURE",
|
|
55
|
-
"looks_prospective",
|
|
56
|
-
]
|
|
57
|
-
|
|
58
|
-
_WEEKDAY = r"(?:mon|tues?|wednes|thurs?|fri|satur|sun)day"
|
|
59
|
-
_MONTH = (
|
|
60
|
-
r"(?:january|february|march|april|may|june|july|august|september|"
|
|
61
|
-
r"october|november|december|jan|feb|mar|apr|jun|jul|aug|sep|sept|oct|nov|dec)"
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
#: Points forward on its own, whatever else the sentence says. Every member
|
|
65
|
-
#: carries an explicit forward time anchor, so "rescheduled to next Friday" is
|
|
66
|
-
#: still a plan even though "rescheduled" reads as past.
|
|
67
|
-
ANCHORED_FUTURE = re.compile(
|
|
68
|
-
r"\b(?:"
|
|
69
|
-
r"tomorrow|"
|
|
70
|
-
r"next\s+(?:week|weekend|month|year|quarter|sprint|release|" + _WEEKDAY + r")|"
|
|
71
|
-
r"this\s+(?:coming|weekend)|"
|
|
72
|
-
r"upcoming\s+(?:release|meeting|week|month|sprint|deadline|event|launch|"
|
|
73
|
-
r"call|review|milestone)|"
|
|
74
|
-
r"by\s+(?:end\s+of|eod|eow|cob|" + _WEEKDAY + r"|" + _MONTH + r"|\d{4}-\d{2}-\d{2})|"
|
|
75
|
-
r"due\s+(?:date|by|on|" + _WEEKDAY + r"|" + _MONTH + r")"
|
|
76
|
-
r")\b",
|
|
77
|
-
re.IGNORECASE,
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
#: The vocabulary of planning. These words are ABOUT something being planned,
|
|
81
|
-
#: and they read exactly as well in the past: a deadline can be missed, an
|
|
82
|
-
#: appointment cancelled, a launch date long gone. They count only when nothing
|
|
83
|
-
#: says the thing already happened.
|
|
84
|
-
#:
|
|
85
|
-
#: Treating them as definite is what re-polluted the list this module exists to
|
|
86
|
-
#: clean — "the appointment was cancelled yesterday" was filed as something to
|
|
87
|
-
#: look forward to.
|
|
88
|
-
PLANNING_LANGUAGE = re.compile(
|
|
89
|
-
r"\b(?:"
|
|
90
|
-
r"deadline|"
|
|
91
|
-
r"appointment|"
|
|
92
|
-
r"before\s+(?:" + _WEEKDAY + r"|" + _MONTH + r"|\d{4}-\d{2}-\d{2})|"
|
|
93
|
-
r"expir(?:es|ing|e)\s+(?:on|at)\s+(?:" + _WEEKDAY + r"|" + _MONTH + r"|\d)|"
|
|
94
|
-
r"expir(?:y|ation)\s+date|"
|
|
95
|
-
r"scheduled?\s+(?:for|on|at|to)|reschedul(?:e|ed|ing)|"
|
|
96
|
-
r"plans?\s+to|planning\s+to|"
|
|
97
|
-
r"go[-\s]?live|cut[-\s]?over|launch\s+date|"
|
|
98
|
-
r"will\s+(?:happen|start|begin|expire|ship|launch|resume|reopen|take\s+place)|"
|
|
99
|
-
r"will\s+be\s+(?:deleted|removed|released|deployed|held|published|migrated|"
|
|
100
|
-
r"archived|retired|rotated|decommissioned|shut\s+down)|"
|
|
101
|
-
r"going\s+to\s+(?:happen|ship|start|launch|begin)"
|
|
102
|
-
r")\b",
|
|
103
|
-
re.IGNORECASE,
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
#: Kept for callers that imported the old name; the two tiers together are what
|
|
107
|
-
#: it used to mean.
|
|
108
|
-
DEFINITE_FUTURE = ANCHORED_FUTURE
|
|
109
|
-
|
|
110
|
-
#: Shaped like a plan, but reads equally well as narration.
|
|
111
|
-
CIRCUMSTANTIAL_FUTURE = re.compile(
|
|
112
|
-
r"\b(?:"
|
|
113
|
-
r"on\s+" + _WEEKDAY + r"|"
|
|
114
|
-
r"(?:is|are)\s+(?:this\s+)?" + _WEEKDAY + r"|"
|
|
115
|
-
r"this\s+(?:week|" + _WEEKDAY + r")|"
|
|
116
|
-
r"at\s+\d{1,2}:\d{2}|"
|
|
117
|
-
r"in\s+\d+\s+(?:days?|weeks?|months?|years?)|"
|
|
118
|
-
r"(?:starts?|begins?|resumes?|reopens?)\s+(?:on|at)|"
|
|
119
|
-
r"(?:on|at)\s+\d{4}-\d{2}-\d{2}|"
|
|
120
|
-
r"meeting\s+(?:on|at)"
|
|
121
|
-
r")\b",
|
|
122
|
-
re.IGNORECASE,
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
#: A thing that happens on a cycle is not a thing that is coming up. "Standup at
|
|
126
|
-
#: 09:30 every day" belongs in nobody's list of what to expect this week.
|
|
127
|
-
RECURRING = re.compile(
|
|
128
|
-
r"\b(?:every|each)\s+(?:day|week|month|morning|afternoon|evening|night|"
|
|
129
|
-
r"sprint|release|" + _WEEKDAY + r")|\b(?:daily|weekly|monthly|nightly|"
|
|
130
|
-
r"hourly|per\s+request|recurring)\b",
|
|
131
|
-
re.IGNORECASE,
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
#: Verbs that PUT an event on a date, rather than report on one. "Rescheduled
|
|
135
|
-
#: to next Friday" and "was scheduled for next Monday" are both still plans;
|
|
136
|
-
#: "discussed the deadline for next month" is a record of a conversation. All
|
|
137
|
-
#: three are past-tense sentences containing a forward date, and only the first
|
|
138
|
-
#: two are something to look forward to — so a forward anchor overrides the past
|
|
139
|
-
#: only when one of these is what made the sentence past.
|
|
140
|
-
#:
|
|
141
|
-
#: The passive forms matter more than they look: people write notes that way
|
|
142
|
-
#: ("the appointment was booked for Tuesday"), and leaving them out missed a
|
|
143
|
-
#: whole class of ordinary phrasing.
|
|
144
|
-
PLACEMENT = re.compile(
|
|
145
|
-
r"\b(?:reschedul(?:e|ed|ing)|mov(?:e|ed|ing)\s+to|postpon(?:e|ed|ing)|"
|
|
146
|
-
r"push(?:ed)?\s+(?:to|back)|shift(?:ed)?\s+to|defer(?:red)?\s+to|"
|
|
147
|
-
r"brought\s+forward|pull(?:ed)?\s+forward|bumped\s+to|"
|
|
148
|
-
r"(?:scheduled?|booked|planned|slated|arranged|set|pencilled|penciled)\s+"
|
|
149
|
-
r"(?:for|on|at|to)|"
|
|
150
|
-
r"extend(?:ed)?\s+to|mov(?:e|ed)\s+forward\s+to|"
|
|
151
|
-
r"chang(?:e|ed)\s+(?:the\s+)?(?:\w+\s+)?"
|
|
152
|
-
r"(?:date|deadline|time|schedule|window)\s+to)\b",
|
|
153
|
-
re.IGNORECASE,
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
#: The old name, kept because it reads in the one place it is used.
|
|
157
|
-
RESCHEDULING = PLACEMENT
|
|
158
|
-
|
|
159
|
-
#: Says the thing has already happened. Vetoes anything but an anchored future
|
|
160
|
-
#: that was anchored BY a rescheduling.
|
|
161
|
-
ALREADY_HAPPENED = re.compile(
|
|
162
|
-
r"\b(?:"
|
|
163
|
-
r"yesterday|"
|
|
164
|
-
r"last\s+(?:night|week|month|year|" + _WEEKDAY + r")|"
|
|
165
|
-
r"\d+\s+(?:days?|weeks?|months?|years?)\s+ago|ago|"
|
|
166
|
-
r"already|"
|
|
167
|
-
r"was|were|had\s+been|has\s+been|have\s+been|"
|
|
168
|
-
r"did|done|"
|
|
169
|
-
r"complet(?:e|ed)|finish(?:ed)?|"
|
|
170
|
-
r"shipped|released|landed|merged|deployed|"
|
|
171
|
-
r"fixed|resolved|closed|cancelled|canceled|missed|happened|expired|"
|
|
172
|
-
r"turned\s+out|ended|began|begun|started|"
|
|
173
|
-
r"produced|caused|created|caught|found|"
|
|
174
|
-
r"updated|changed|edited|modified|renamed|bumped|committed|"
|
|
175
|
-
r"restarted|configured|installed|"
|
|
176
|
-
r"had|met|arrived|attended|ate|spoke|talked|visited|saw|"
|
|
177
|
-
# deleted / removed / added are deliberately absent: each is both a simple
|
|
178
|
-
# past AND the participle in a future passive, and "the worktrees will be
|
|
179
|
-
# deleted" is a plan. The future-passive list in PLANNING_LANGUAGE is the
|
|
180
|
-
# narrower half of that ambiguity and it is the half worth keeping.
|
|
181
|
-
r"decided|agreed|discussed|reviewed|reported|"
|
|
182
|
-
r"ran|wrote|built|took|made|went|came|said|led|"
|
|
183
|
-
r"failed|passed|broke|resulted"
|
|
184
|
-
r")\b",
|
|
185
|
-
re.IGNORECASE,
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
#: The event is off. This outranks everything, including a present-tense clause
|
|
190
|
-
#: saying when it was going to be.
|
|
191
|
-
CALLED_OFF = re.compile(
|
|
192
|
-
r"\b(?:cancel(?:led|ed|s)?|called\s+off|scrapped|abandoned|"
|
|
193
|
-
r"dropped|shelved|withdrawn|no\s+longer\s+(?:happening|planned|scheduled))\b",
|
|
194
|
-
re.IGNORECASE,
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
#: A present-tense statement that something is on a future date: "the launch is
|
|
199
|
-
#: next Friday", "the freeze starts Monday", "the review is this Tuesday".
|
|
200
|
-
#: Present tense about a forward date is a plan whatever else the surrounding
|
|
201
|
-
#: sentence reports having done.
|
|
202
|
-
#:
|
|
203
|
-
#: Every part of this is bounded on both sides. A first attempt was not, and it
|
|
204
|
-
#: matched "is dec" inside "is decision", "are mar" inside "are marked", and
|
|
205
|
-
#: "this a" inside "is this a" — turning 14 memories into 72 on a real store.
|
|
206
|
-
#: An unbounded month abbreviation is a trap in any prose.
|
|
207
|
-
_FUTURE_FACT = re.compile(
|
|
208
|
-
r"\b(?:is|are|starts?|begins?|opens?|closes?|resumes?|reopens?|runs?|"
|
|
209
|
-
r"lands?|ships?|goes\s+live|kicks\s+off)\s+"
|
|
210
|
-
r"(?:on\s+|at\s+)?"
|
|
211
|
-
r"(?:"
|
|
212
|
-
r"tomorrow"
|
|
213
|
-
r"|next\s+(?:week|weekend|month|year|quarter|sprint|release|" + _WEEKDAY + r")"
|
|
214
|
-
r"|this\s+(?:coming\s+)?(?:week|weekend|" + _WEEKDAY + r")"
|
|
215
|
-
r"|" + _WEEKDAY +
|
|
216
|
-
r"|\d{4}-\d{2}-\d{2}"
|
|
217
|
-
r")\b",
|
|
218
|
-
re.IGNORECASE,
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
def _states_a_future_fact(text: str) -> bool:
|
|
223
|
-
"""Present tense about a forward date, inside any sentence."""
|
|
224
|
-
return bool(_FUTURE_FACT.search(text))
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
def looks_prospective(text: str) -> bool:
|
|
228
|
-
"""True when the text describes something still ahead.
|
|
229
|
-
|
|
230
|
-
Three tiers, because the evidence really is of three strengths. An anchored
|
|
231
|
-
future — "next Tuesday", "by Friday", "on 2026-09-04" — points forward
|
|
232
|
-
whatever else the sentence says. Planning vocabulary and circumstantial
|
|
233
|
-
wording both read equally well in the past, so they count only when nothing
|
|
234
|
-
says the thing already happened. Anything on a cycle is not a plan at all.
|
|
235
|
-
"""
|
|
236
|
-
if not text:
|
|
237
|
-
return False
|
|
238
|
-
behind = ALREADY_HAPPENED.search(text)
|
|
239
|
-
if CALLED_OFF.search(text):
|
|
240
|
-
# "The deadline is next Friday but was cancelled yesterday" reads as a
|
|
241
|
-
# future fact and is not one. Cancelling is the one thing that beats a
|
|
242
|
-
# present-tense statement about a forward date.
|
|
243
|
-
return False
|
|
244
|
-
if _states_a_future_fact(text):
|
|
245
|
-
# "I updated the timeline so the launch IS next Friday" — the past-tense
|
|
246
|
-
# verb is about the note, and the clause with the date is in the present
|
|
247
|
-
# about something ahead. A veto that scans the whole sentence cannot see
|
|
248
|
-
# that difference and drops a real deadline.
|
|
249
|
-
return True
|
|
250
|
-
if ANCHORED_FUTURE.search(text):
|
|
251
|
-
# Checked BEFORE the recurring veto. "The weekly review is next Tuesday"
|
|
252
|
-
# names one dated occurrence of a recurring thing, and that occurrence
|
|
253
|
-
# is coming up; "weekly" describes the series, not this instance.
|
|
254
|
-
# A forward anchor beats the past only when the past word is what moved
|
|
255
|
-
# the event. "Rescheduled to next Friday" is a plan; "discussed the
|
|
256
|
-
# deadline for next month" is a record of a conversation.
|
|
257
|
-
return not behind or bool(RESCHEDULING.search(text))
|
|
258
|
-
if RECURRING.search(text):
|
|
259
|
-
return False
|
|
260
|
-
if PLANNING_LANGUAGE.search(text) or CIRCUMSTANTIAL_FUTURE.search(text):
|
|
261
|
-
return not behind
|
|
262
|
-
return False
|
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SuperLocalMemory V3 — Scene Builder (Memory Clustering).
|
|
6
|
-
|
|
7
|
-
Groups related facts into thematic scenes (EverMemOS MemScene pattern).
|
|
8
|
-
Scenes provide contextual retrieval — related facts come together.
|
|
9
|
-
|
|
10
|
-
V1 had this module but NEVER CALLED it. Now wired into the encoding pipeline.
|
|
11
|
-
|
|
12
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
import json
|
|
18
|
-
|
|
19
|
-
from superlocalmemory.storage.embedding_codec import decode_embedding
|
|
20
|
-
import logging
|
|
21
|
-
from datetime import UTC, datetime
|
|
22
|
-
|
|
23
|
-
from superlocalmemory.storage.models import AtomicFact, MemoryScene
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger(__name__)
|
|
26
|
-
|
|
27
|
-
# Similarity threshold for assigning fact to existing scene
|
|
28
|
-
_ASSIGN_THRESHOLD = 0.6
|
|
29
|
-
_MAX_ASSIGNMENT_CANDIDATES = 256
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class SceneBuilder:
|
|
33
|
-
"""Cluster related facts into thematic scenes.
|
|
34
|
-
|
|
35
|
-
When a new fact arrives:
|
|
36
|
-
1. Compute similarity to existing scenes (via scene theme embedding)
|
|
37
|
-
2. If above threshold: assign to nearest scene, update scene
|
|
38
|
-
3. If below threshold: create new scene
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
def __init__(self, db, embedder=None, vector_store=None) -> None:
|
|
42
|
-
self._db = db
|
|
43
|
-
self._embedder = embedder
|
|
44
|
-
self._vector_store = vector_store
|
|
45
|
-
# Key by scene ID, never theme. Themes are deliberately non-unique,
|
|
46
|
-
# while eligibility and durable anchor membership are scene-specific.
|
|
47
|
-
self._scene_embeddings_cache: dict[str, list[float]] = {}
|
|
48
|
-
|
|
49
|
-
def assign_to_scene(
|
|
50
|
-
self,
|
|
51
|
-
new_fact: AtomicFact,
|
|
52
|
-
profile_id: str,
|
|
53
|
-
) -> MemoryScene:
|
|
54
|
-
"""Assign a fact to an existing scene or create a new one.
|
|
55
|
-
|
|
56
|
-
Always embeds the incoming fact content (when embedder is available)
|
|
57
|
-
so that the embedding is ready for comparison against existing scenes.
|
|
58
|
-
"""
|
|
59
|
-
if self._embedder is None:
|
|
60
|
-
return self._create_scene(new_fact, profile_id)
|
|
61
|
-
|
|
62
|
-
# Canonical ingestion already embeds the fact before scene assignment.
|
|
63
|
-
# Reuse that vector so scene clustering does not issue a duplicate model
|
|
64
|
-
# request for every remembered fact.
|
|
65
|
-
fact_emb = new_fact.embedding
|
|
66
|
-
if fact_emb is None:
|
|
67
|
-
fact_emb = self._embedder.embed(new_fact.content)
|
|
68
|
-
|
|
69
|
-
# v3.4.38: Defensive None guard. embedder.embed() returns None when
|
|
70
|
-
# the embedding worker is unavailable (timeout, crash). Without this
|
|
71
|
-
# guard, _cosine(None, theme_emb) → zip(None, ...) → 'NoneType'
|
|
72
|
-
# object is not iterable, propagating up to engine.store() and
|
|
73
|
-
# causing the entire memory to be lost. Better to skip scene
|
|
74
|
-
# assignment than lose the memory.
|
|
75
|
-
if fact_emb is None:
|
|
76
|
-
return self._create_scene(new_fact, profile_id)
|
|
77
|
-
|
|
78
|
-
scenes = self._get_assignment_scenes(profile_id, fact_emb)
|
|
79
|
-
if not scenes:
|
|
80
|
-
return self._create_scene(new_fact, profile_id)
|
|
81
|
-
|
|
82
|
-
live_scene_embeddings = self._load_live_scene_embeddings(
|
|
83
|
-
profile_id,
|
|
84
|
-
tuple(scene.scene_id for scene in scenes),
|
|
85
|
-
)
|
|
86
|
-
live_scene_ids = set(live_scene_embeddings)
|
|
87
|
-
self._scene_embeddings_cache.update({
|
|
88
|
-
scene_id: embedding
|
|
89
|
-
for scene_id, embedding in live_scene_embeddings.items()
|
|
90
|
-
if embedding is not None
|
|
91
|
-
})
|
|
92
|
-
# Old consolidation/deletion paths left scene rows whose fact IDs no
|
|
93
|
-
# longer exist. They are not evidence and must not trigger thousands of
|
|
94
|
-
# replacement model calls after restart. A cache hit cannot prove that
|
|
95
|
-
# a scene still has a surviving fact, so eligibility is always derived
|
|
96
|
-
# from the current database state.
|
|
97
|
-
scenes = [
|
|
98
|
-
scene for scene in scenes if scene.scene_id in live_scene_ids
|
|
99
|
-
]
|
|
100
|
-
if not scenes:
|
|
101
|
-
return self._create_scene(new_fact, profile_id)
|
|
102
|
-
|
|
103
|
-
# Find best matching scene
|
|
104
|
-
best_scene: MemoryScene | None = None
|
|
105
|
-
best_sim = -1.0
|
|
106
|
-
|
|
107
|
-
# A scene's theme is derived from its first (anchor) fact. On daemon
|
|
108
|
-
# restart the in-memory cache is empty, but the anchor embeddings remain
|
|
109
|
-
# durable in atomic_facts. Prime from those vectors before calling the
|
|
110
|
-
# model; otherwise a mature database re-embeds thousands of themes and
|
|
111
|
-
# repeatedly recycles the shared foreground worker.
|
|
112
|
-
# V3.3.27: Batch-embed all still-uncached scene themes in ONE call.
|
|
113
|
-
# Previously: 200+ individual embed() calls per fact (30s on Mode B).
|
|
114
|
-
# Now: 1 batch call for all uncached themes, then cache hits for the rest.
|
|
115
|
-
uncached_scenes = [
|
|
116
|
-
scene for scene in scenes
|
|
117
|
-
if scene.scene_id not in self._scene_embeddings_cache
|
|
118
|
-
]
|
|
119
|
-
if uncached_scenes and hasattr(self._embedder, 'embed_batch'):
|
|
120
|
-
try:
|
|
121
|
-
batch_embs = self._embedder.embed_batch(
|
|
122
|
-
[scene.theme for scene in uncached_scenes]
|
|
123
|
-
)
|
|
124
|
-
for scene, emb in zip(uncached_scenes, batch_embs):
|
|
125
|
-
if emb is not None:
|
|
126
|
-
self._scene_embeddings_cache[scene.scene_id] = emb
|
|
127
|
-
except Exception:
|
|
128
|
-
pass # Fall through to individual embeds below
|
|
129
|
-
|
|
130
|
-
for scene in scenes:
|
|
131
|
-
if scene.scene_id in self._scene_embeddings_cache:
|
|
132
|
-
theme_emb = self._scene_embeddings_cache[scene.scene_id]
|
|
133
|
-
else:
|
|
134
|
-
theme_emb = self._embedder.embed(scene.theme)
|
|
135
|
-
if theme_emb is not None:
|
|
136
|
-
self._scene_embeddings_cache[scene.scene_id] = theme_emb
|
|
137
|
-
if theme_emb is None:
|
|
138
|
-
continue
|
|
139
|
-
sim = _cosine(fact_emb, theme_emb)
|
|
140
|
-
if sim > best_sim:
|
|
141
|
-
best_sim = sim
|
|
142
|
-
best_scene = scene
|
|
143
|
-
|
|
144
|
-
if best_scene is not None and best_sim >= _ASSIGN_THRESHOLD:
|
|
145
|
-
return self._add_to_scene(best_scene, new_fact, profile_id)
|
|
146
|
-
|
|
147
|
-
return self._create_scene(new_fact, profile_id)
|
|
148
|
-
|
|
149
|
-
def get_scene_for_fact(self, fact_id: str, profile_id: str) -> MemoryScene | None:
|
|
150
|
-
"""Get the scene containing a specific fact."""
|
|
151
|
-
rows = self._db.execute(
|
|
152
|
-
"SELECT * FROM memory_scenes WHERE profile_id = ?", (profile_id,)
|
|
153
|
-
)
|
|
154
|
-
for row in rows:
|
|
155
|
-
d = dict(row)
|
|
156
|
-
fids = json.loads(d.get("fact_ids_json", "[]"))
|
|
157
|
-
if fact_id in fids:
|
|
158
|
-
return self._row_to_scene(d)
|
|
159
|
-
return None
|
|
160
|
-
|
|
161
|
-
def get_all_scenes(self, profile_id: str) -> list[MemoryScene]:
|
|
162
|
-
"""Get all scenes for a profile."""
|
|
163
|
-
return self._get_scenes(profile_id)
|
|
164
|
-
|
|
165
|
-
# -- Internal ----------------------------------------------------------
|
|
166
|
-
|
|
167
|
-
def _create_scene(self, fact: AtomicFact, profile_id: str) -> MemoryScene:
|
|
168
|
-
"""Create a new scene from a single fact.
|
|
169
|
-
|
|
170
|
-
Pre-computes and caches the theme embedding for efficient later
|
|
171
|
-
comparisons in assign_to_scene.
|
|
172
|
-
"""
|
|
173
|
-
theme = fact.content[:200]
|
|
174
|
-
scene = MemoryScene(
|
|
175
|
-
profile_id=profile_id,
|
|
176
|
-
theme=theme,
|
|
177
|
-
fact_ids=[fact.fact_id],
|
|
178
|
-
entity_ids=list(fact.canonical_entities),
|
|
179
|
-
created_at=datetime.now(UTC).isoformat(),
|
|
180
|
-
last_updated=datetime.now(UTC).isoformat(),
|
|
181
|
-
)
|
|
182
|
-
# Pre-compute theme embedding for future comparisons. The canonical fact
|
|
183
|
-
# vector represents this exact theme and avoids a duplicate model call.
|
|
184
|
-
if self._embedder is not None:
|
|
185
|
-
theme_embedding = fact.embedding
|
|
186
|
-
if theme_embedding is None:
|
|
187
|
-
theme_embedding = self._embedder.embed(theme)
|
|
188
|
-
if theme_embedding is not None:
|
|
189
|
-
self._scene_embeddings_cache[scene.scene_id] = theme_embedding
|
|
190
|
-
self._save_scene(scene)
|
|
191
|
-
return scene
|
|
192
|
-
|
|
193
|
-
def _add_to_scene(
|
|
194
|
-
self, scene: MemoryScene, fact: AtomicFact, profile_id: str
|
|
195
|
-
) -> MemoryScene:
|
|
196
|
-
"""Add a fact to an existing scene."""
|
|
197
|
-
new_fact_ids = [*scene.fact_ids, fact.fact_id]
|
|
198
|
-
new_entity_ids = list(set(scene.entity_ids) | set(fact.canonical_entities))
|
|
199
|
-
updated = MemoryScene(
|
|
200
|
-
scene_id=scene.scene_id,
|
|
201
|
-
profile_id=profile_id,
|
|
202
|
-
theme=scene.theme,
|
|
203
|
-
fact_ids=new_fact_ids,
|
|
204
|
-
entity_ids=new_entity_ids,
|
|
205
|
-
created_at=scene.created_at,
|
|
206
|
-
last_updated=datetime.now(UTC).isoformat(),
|
|
207
|
-
)
|
|
208
|
-
self._save_scene(updated)
|
|
209
|
-
return updated
|
|
210
|
-
|
|
211
|
-
def _get_scenes(self, profile_id: str) -> list[MemoryScene]:
|
|
212
|
-
"""Load all scenes from DB."""
|
|
213
|
-
rows = self._db.execute(
|
|
214
|
-
"SELECT * FROM memory_scenes WHERE profile_id = ? ORDER BY last_updated DESC",
|
|
215
|
-
(profile_id,),
|
|
216
|
-
)
|
|
217
|
-
return [self._row_to_scene(dict(r)) for r in rows]
|
|
218
|
-
|
|
219
|
-
def _get_assignment_scenes(
|
|
220
|
-
self,
|
|
221
|
-
profile_id: str,
|
|
222
|
-
fact_embedding: list[float],
|
|
223
|
-
) -> list[MemoryScene]:
|
|
224
|
-
"""Load bounded semantic candidates with a recency fallback.
|
|
225
|
-
|
|
226
|
-
Mature stores must not compare every new fact with every historical
|
|
227
|
-
scene. The fact vector index finds nearby members in bounded time; the
|
|
228
|
-
normalized membership projection maps them back to scenes. Recent
|
|
229
|
-
scenes remain a fail-soft fallback for fresh or unavailable indexes.
|
|
230
|
-
Semantic candidates are ordered first so an old relevant scene cannot
|
|
231
|
-
be displaced by the recency cap.
|
|
232
|
-
"""
|
|
233
|
-
recent_rows = self._db.execute(
|
|
234
|
-
"SELECT ms.* FROM memory_scenes AS ms WHERE ms.profile_id = ? "
|
|
235
|
-
"AND EXISTS (SELECT 1 FROM scene_fact_members AS live_member "
|
|
236
|
-
"WHERE live_member.scene_id = ms.scene_id "
|
|
237
|
-
"AND live_member.profile_id = ms.profile_id) "
|
|
238
|
-
"ORDER BY ms.last_updated DESC LIMIT ?",
|
|
239
|
-
(profile_id, _MAX_ASSIGNMENT_CANDIDATES),
|
|
240
|
-
)
|
|
241
|
-
recent = [self._row_to_scene(dict(row)) for row in recent_rows]
|
|
242
|
-
|
|
243
|
-
nearest_fact_ids: list[str] = []
|
|
244
|
-
if self._vector_store is not None:
|
|
245
|
-
try:
|
|
246
|
-
nearest_fact_ids = [
|
|
247
|
-
fact_id
|
|
248
|
-
for fact_id, _score in self._vector_store.search(
|
|
249
|
-
fact_embedding,
|
|
250
|
-
top_k=_MAX_ASSIGNMENT_CANDIDATES,
|
|
251
|
-
profile_id=profile_id,
|
|
252
|
-
)
|
|
253
|
-
]
|
|
254
|
-
except Exception:
|
|
255
|
-
nearest_fact_ids = []
|
|
256
|
-
|
|
257
|
-
semantic: list[MemoryScene] = []
|
|
258
|
-
if nearest_fact_ids:
|
|
259
|
-
placeholders = ",".join("?" for _ in nearest_fact_ids)
|
|
260
|
-
try:
|
|
261
|
-
semantic_rows = self._db.execute(
|
|
262
|
-
f"""
|
|
263
|
-
SELECT ms.*, member.fact_id AS matched_fact_id
|
|
264
|
-
FROM scene_fact_members AS member
|
|
265
|
-
JOIN memory_scenes AS ms
|
|
266
|
-
ON ms.scene_id = member.scene_id
|
|
267
|
-
AND ms.profile_id = member.profile_id
|
|
268
|
-
WHERE member.profile_id = ?
|
|
269
|
-
AND member.fact_id IN ({placeholders})
|
|
270
|
-
""",
|
|
271
|
-
(profile_id, *nearest_fact_ids),
|
|
272
|
-
)
|
|
273
|
-
hit_rank = {
|
|
274
|
-
fact_id: rank
|
|
275
|
-
for rank, fact_id in enumerate(nearest_fact_ids)
|
|
276
|
-
}
|
|
277
|
-
ranked_scenes: dict[str, tuple[int, MemoryScene]] = {}
|
|
278
|
-
for row in semantic_rows:
|
|
279
|
-
data = dict(row)
|
|
280
|
-
rank = hit_rank.get(
|
|
281
|
-
str(data.pop("matched_fact_id", "")),
|
|
282
|
-
len(hit_rank),
|
|
283
|
-
)
|
|
284
|
-
scene = self._row_to_scene(data)
|
|
285
|
-
previous = ranked_scenes.get(scene.scene_id)
|
|
286
|
-
if previous is None or rank < previous[0]:
|
|
287
|
-
ranked_scenes[scene.scene_id] = (rank, scene)
|
|
288
|
-
semantic = [
|
|
289
|
-
scene
|
|
290
|
-
for _rank, scene in sorted(
|
|
291
|
-
ranked_scenes.values(), key=lambda item: item[0]
|
|
292
|
-
)
|
|
293
|
-
]
|
|
294
|
-
except Exception:
|
|
295
|
-
# Migration failure or a disabled vector projection must not
|
|
296
|
-
# make remember fail. The bounded recent set remains valid.
|
|
297
|
-
semantic = []
|
|
298
|
-
|
|
299
|
-
candidates: list[MemoryScene] = []
|
|
300
|
-
seen: set[str] = set()
|
|
301
|
-
for scene in (*semantic, *recent):
|
|
302
|
-
if scene.scene_id in seen:
|
|
303
|
-
continue
|
|
304
|
-
seen.add(scene.scene_id)
|
|
305
|
-
candidates.append(scene)
|
|
306
|
-
if len(candidates) >= _MAX_ASSIGNMENT_CANDIDATES:
|
|
307
|
-
break
|
|
308
|
-
return candidates
|
|
309
|
-
|
|
310
|
-
def _load_live_scene_embeddings(
|
|
311
|
-
self,
|
|
312
|
-
profile_id: str,
|
|
313
|
-
scene_ids: tuple[str, ...],
|
|
314
|
-
) -> dict[str, list[float] | None]:
|
|
315
|
-
"""Load one durable anchor embedding for every live scene.
|
|
316
|
-
|
|
317
|
-
The normalized membership projection resolves the first still-existing
|
|
318
|
-
fact in each scene without expanding every scene's JSON array. Scenes
|
|
319
|
-
whose original anchor was consolidated away can still reuse a surviving
|
|
320
|
-
member. Fully stale scene rows are ignored instead of being re-embedded.
|
|
321
|
-
"""
|
|
322
|
-
if not scene_ids:
|
|
323
|
-
return {}
|
|
324
|
-
placeholders = ",".join("?" for _ in scene_ids)
|
|
325
|
-
try:
|
|
326
|
-
rows = self._db.execute(
|
|
327
|
-
f"""
|
|
328
|
-
WITH live_scene_facts AS (
|
|
329
|
-
SELECT
|
|
330
|
-
ms.scene_id,
|
|
331
|
-
af.embedding,
|
|
332
|
-
ROW_NUMBER() OVER (
|
|
333
|
-
PARTITION BY ms.scene_id
|
|
334
|
-
ORDER BY member.position
|
|
335
|
-
) AS member_rank
|
|
336
|
-
FROM memory_scenes AS ms
|
|
337
|
-
JOIN scene_fact_members AS member
|
|
338
|
-
ON member.scene_id = ms.scene_id
|
|
339
|
-
AND member.profile_id = ms.profile_id
|
|
340
|
-
JOIN atomic_facts AS af
|
|
341
|
-
ON af.fact_id = member.fact_id
|
|
342
|
-
AND af.profile_id = ms.profile_id
|
|
343
|
-
WHERE ms.profile_id = ?
|
|
344
|
-
AND ms.scene_id IN ({placeholders})
|
|
345
|
-
)
|
|
346
|
-
SELECT scene_id, embedding
|
|
347
|
-
FROM live_scene_facts
|
|
348
|
-
WHERE member_rank = 1
|
|
349
|
-
""",
|
|
350
|
-
(profile_id, *scene_ids),
|
|
351
|
-
)
|
|
352
|
-
except Exception:
|
|
353
|
-
return {}
|
|
354
|
-
|
|
355
|
-
result: dict[str, list[float] | None] = {}
|
|
356
|
-
for row in rows:
|
|
357
|
-
data = dict(row)
|
|
358
|
-
raw_embedding = data.get("embedding")
|
|
359
|
-
embedding = None
|
|
360
|
-
if raw_embedding:
|
|
361
|
-
try:
|
|
362
|
-
embedding = decode_embedding(
|
|
363
|
-
raw_embedding, fact_id=str(data.get("scene_id", "<scene>")),
|
|
364
|
-
)
|
|
365
|
-
except ValueError:
|
|
366
|
-
# A malformed stored value, not an absent one. Scenes are an
|
|
367
|
-
# optimisation, so one bad row must not sink the batch.
|
|
368
|
-
embedding = None
|
|
369
|
-
result[str(data["scene_id"])] = embedding
|
|
370
|
-
return result
|
|
371
|
-
|
|
372
|
-
def _save_scene(self, scene: MemoryScene) -> None:
|
|
373
|
-
"""Upsert scene to DB."""
|
|
374
|
-
self._db.execute(
|
|
375
|
-
"""INSERT OR REPLACE INTO memory_scenes
|
|
376
|
-
(scene_id, profile_id, theme, fact_ids_json, entity_ids_json,
|
|
377
|
-
created_at, last_updated)
|
|
378
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
379
|
-
(
|
|
380
|
-
scene.scene_id, scene.profile_id, scene.theme,
|
|
381
|
-
json.dumps(scene.fact_ids), json.dumps(scene.entity_ids),
|
|
382
|
-
scene.created_at, scene.last_updated,
|
|
383
|
-
),
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
@staticmethod
|
|
387
|
-
def _row_to_scene(d: dict) -> MemoryScene:
|
|
388
|
-
return MemoryScene(
|
|
389
|
-
scene_id=d["scene_id"],
|
|
390
|
-
profile_id=d["profile_id"],
|
|
391
|
-
theme=d.get("theme", ""),
|
|
392
|
-
fact_ids=json.loads(d.get("fact_ids_json", "[]")),
|
|
393
|
-
entity_ids=json.loads(d.get("entity_ids_json", "[]")),
|
|
394
|
-
created_at=d.get("created_at", ""),
|
|
395
|
-
last_updated=d.get("last_updated", ""),
|
|
396
|
-
)
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
def _cosine(a: list[float] | None, b: list[float] | None) -> float:
|
|
400
|
-
# v3.4.38: Defensive None guard — embedder can return None on worker
|
|
401
|
-
# unavailability. Returning 0.0 is correct: zero similarity means no
|
|
402
|
-
# match, which falls back to creating a new scene.
|
|
403
|
-
if a is None or b is None:
|
|
404
|
-
return 0.0
|
|
405
|
-
dot = sum(x * y for x, y in zip(a, b))
|
|
406
|
-
na = sum(x * x for x in a) ** 0.5
|
|
407
|
-
nb = sum(x * x for x in b) ** 0.5
|
|
408
|
-
if na == 0 or nb == 0:
|
|
409
|
-
return 0.0
|
|
410
|
-
return dot / (na * nb)
|