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,58 +0,0 @@
|
|
|
1
|
-
"""SuperLocalMemory bounded loops.
|
|
2
|
-
|
|
3
|
-
Agent loops that stop when an independent gate passes — not when the agent
|
|
4
|
-
says it is done — with the run's history persisted in SLM's durable memory.
|
|
5
|
-
|
|
6
|
-
Public API::
|
|
7
|
-
|
|
8
|
-
from superlocalmemory.loops import (
|
|
9
|
-
Bounds, Rung, Status, Verdict, LapResult, Outcome,
|
|
10
|
-
run_bounded_loop, InMemoryLedger, SLMMemoryLedger, open_engine_store,
|
|
11
|
-
)
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
from superlocalmemory.loops.engine import run_bounded_loop
|
|
17
|
-
from superlocalmemory.loops.ledger import (
|
|
18
|
-
InMemoryLedger,
|
|
19
|
-
LedgerEntry,
|
|
20
|
-
LedgerStore,
|
|
21
|
-
SLMMemoryLedger,
|
|
22
|
-
engine_backed_ledger,
|
|
23
|
-
open_engine_store,
|
|
24
|
-
pool_backed_ledger,
|
|
25
|
-
)
|
|
26
|
-
from superlocalmemory.loops.models import (
|
|
27
|
-
Bounds,
|
|
28
|
-
LapResult,
|
|
29
|
-
Outcome,
|
|
30
|
-
Rung,
|
|
31
|
-
Status,
|
|
32
|
-
Verdict,
|
|
33
|
-
)
|
|
34
|
-
from superlocalmemory.loops.rules import (
|
|
35
|
-
no_progress,
|
|
36
|
-
rung_requires_approval,
|
|
37
|
-
stop_condition_met,
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
__all__ = [
|
|
41
|
-
"Bounds",
|
|
42
|
-
"Rung",
|
|
43
|
-
"Status",
|
|
44
|
-
"Verdict",
|
|
45
|
-
"LapResult",
|
|
46
|
-
"Outcome",
|
|
47
|
-
"run_bounded_loop",
|
|
48
|
-
"LedgerEntry",
|
|
49
|
-
"LedgerStore",
|
|
50
|
-
"InMemoryLedger",
|
|
51
|
-
"SLMMemoryLedger",
|
|
52
|
-
"engine_backed_ledger",
|
|
53
|
-
"pool_backed_ledger",
|
|
54
|
-
"open_engine_store",
|
|
55
|
-
"no_progress",
|
|
56
|
-
"rung_requires_approval",
|
|
57
|
-
"stop_condition_met",
|
|
58
|
-
]
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"""Cumulative budget accounting for a bounded-loop run.
|
|
2
|
-
|
|
3
|
-
The meter tracks laps, tokens, and wall-clock time and reports when any bound
|
|
4
|
-
in effect has been exceeded. It is intentionally tiny and side-effect-free
|
|
5
|
-
apart from its own internal counters, and the clock is injected so tests are
|
|
6
|
-
deterministic.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from __future__ import annotations
|
|
10
|
-
|
|
11
|
-
from typing import Callable
|
|
12
|
-
|
|
13
|
-
from superlocalmemory.loops.models import Bounds
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class BudgetMeter:
|
|
17
|
-
"""Accumulate spend across laps and answer "have we gone over?".
|
|
18
|
-
|
|
19
|
-
``now`` is a zero-argument callable returning monotonic-ish seconds
|
|
20
|
-
(``time.monotonic`` in production, a fake in tests). The start time is
|
|
21
|
-
captured at construction so wall-clock enforcement needs no globals.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
def __init__(self, now: Callable[[], float]) -> None:
|
|
25
|
-
self._now = now
|
|
26
|
-
self._start = now()
|
|
27
|
-
self._tokens = 0
|
|
28
|
-
|
|
29
|
-
def spend(self, tokens: int) -> None:
|
|
30
|
-
"""Record token spend for a completed lap (negative values ignored)."""
|
|
31
|
-
if tokens > 0:
|
|
32
|
-
self._tokens += tokens
|
|
33
|
-
|
|
34
|
-
def exceeded(self, lap: int, bounds: Bounds) -> tuple[bool, str]:
|
|
35
|
-
"""Return ``(tripped, reason)`` for the bounds checked before a lap runs.
|
|
36
|
-
|
|
37
|
-
Checked in priority order: iteration cap, token budget, wall-clock.
|
|
38
|
-
``lap`` is the 1-based number of the lap about to run, so exceeding
|
|
39
|
-
``max_iterations`` is reported when the (max+1)-th lap is attempted.
|
|
40
|
-
"""
|
|
41
|
-
if lap > bounds.max_iterations:
|
|
42
|
-
return True, "max-iterations"
|
|
43
|
-
# >= so a budget of N never permits an (N+1)-th lap's worth of spend:
|
|
44
|
-
# once cumulative tokens reach the ceiling, the next lap is refused.
|
|
45
|
-
if bounds.max_tokens is not None and self._tokens >= bounds.max_tokens:
|
|
46
|
-
return True, "token-budget"
|
|
47
|
-
if bounds.max_wallclock_s is not None:
|
|
48
|
-
elapsed = self._now() - self._start
|
|
49
|
-
if elapsed > bounds.max_wallclock_s:
|
|
50
|
-
return True, "wallclock"
|
|
51
|
-
return False, ""
|
|
52
|
-
|
|
53
|
-
def snapshot(self) -> dict:
|
|
54
|
-
"""Point-in-time spend, suitable for a ledger entry."""
|
|
55
|
-
return {
|
|
56
|
-
"tokens": self._tokens,
|
|
57
|
-
"wallclock_s": round(self._now() - self._start, 3),
|
|
58
|
-
}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
"""The bounded-loop orchestrator.
|
|
2
|
-
|
|
3
|
-
``run_bounded_loop`` executes a loop for a single goal under a fixed set of
|
|
4
|
-
:class:`Bounds`. Its one non-negotiable invariant: **the independent gate
|
|
5
|
-
decides when the loop is finished — never the agent.** A runner's
|
|
6
|
-
``agent_claimed_done`` flag is written to the ledger for audit and is never
|
|
7
|
-
read when deciding to terminate.
|
|
8
|
-
|
|
9
|
-
Each lap, in strict order:
|
|
10
|
-
|
|
11
|
-
1. Poll the kill switch (highest priority — checked before any work).
|
|
12
|
-
2. Check the budget bounds (iteration cap, tokens, wall-clock).
|
|
13
|
-
3. Run the agent's proposer for one lap.
|
|
14
|
-
4. Accumulate token spend.
|
|
15
|
-
5. Ask the *independent* gate for a verdict.
|
|
16
|
-
6. Decide: a passing gate (plus any required approval) ends the run; an
|
|
17
|
-
exhausted no-progress window halts it; otherwise continue.
|
|
18
|
-
|
|
19
|
-
Runner and gate are plain callables taking the 1-based lap number, so this
|
|
20
|
-
engine carries no subprocess, sandbox, or framework machinery — SLM loops
|
|
21
|
-
converge on a checkable memory/verification condition, and heavier isolation
|
|
22
|
-
belongs to the standalone bounded-loops engine, not here.
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
from __future__ import annotations
|
|
26
|
-
|
|
27
|
-
import os
|
|
28
|
-
import time
|
|
29
|
-
import uuid
|
|
30
|
-
from datetime import datetime, timezone
|
|
31
|
-
from typing import Callable, Optional
|
|
32
|
-
|
|
33
|
-
from superlocalmemory.loops.budget import BudgetMeter
|
|
34
|
-
from superlocalmemory.loops.ledger import InMemoryLedger, LedgerEntry, LedgerStore
|
|
35
|
-
from superlocalmemory.loops.models import (
|
|
36
|
-
Bounds,
|
|
37
|
-
LapResult,
|
|
38
|
-
Outcome,
|
|
39
|
-
Rung,
|
|
40
|
-
Status,
|
|
41
|
-
Verdict,
|
|
42
|
-
)
|
|
43
|
-
from superlocalmemory.loops.rules import (
|
|
44
|
-
no_progress,
|
|
45
|
-
rung_requires_approval,
|
|
46
|
-
stop_condition_met,
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
RunnerFn = Callable[[int], LapResult]
|
|
50
|
-
GateFn = Callable[[int], Verdict]
|
|
51
|
-
ApproverFn = Callable[[Verdict], bool]
|
|
52
|
-
KillSwitchFn = Callable[[], bool]
|
|
53
|
-
ClockFn = Callable[[], str]
|
|
54
|
-
|
|
55
|
-
_KILL_ENV = "SLM_LOOP_KILL"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def _utc_now_iso() -> str:
|
|
59
|
-
return datetime.now(timezone.utc).isoformat()
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def _env_killed() -> bool:
|
|
63
|
-
return bool(os.environ.get(_KILL_ENV))
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def run_bounded_loop(
|
|
67
|
-
name: str,
|
|
68
|
-
*,
|
|
69
|
-
bounds: Bounds,
|
|
70
|
-
runner: RunnerFn,
|
|
71
|
-
gate: GateFn,
|
|
72
|
-
rung: Rung = Rung.L1,
|
|
73
|
-
ledger: Optional[LedgerStore] = None,
|
|
74
|
-
approver: Optional[ApproverFn] = None,
|
|
75
|
-
killswitch: Optional[KillSwitchFn] = None,
|
|
76
|
-
clock: Optional[ClockFn] = None,
|
|
77
|
-
monotonic: Optional[Callable[[], float]] = None,
|
|
78
|
-
run_id: Optional[str] = None,
|
|
79
|
-
) -> Outcome:
|
|
80
|
-
"""Run one bounded loop and return its :class:`Outcome`.
|
|
81
|
-
|
|
82
|
-
Only ``name``, ``bounds``, ``runner`` and ``gate`` are required. Every
|
|
83
|
-
other dependency is injected for determinism in tests; sensible defaults
|
|
84
|
-
(UTC clock, monotonic timer, env-var kill switch, in-memory ledger) apply
|
|
85
|
-
otherwise.
|
|
86
|
-
"""
|
|
87
|
-
run_id = run_id or f"{name}-{uuid.uuid4().hex[:8]}"
|
|
88
|
-
ledger = ledger if ledger is not None else InMemoryLedger()
|
|
89
|
-
clock = clock or _utc_now_iso
|
|
90
|
-
monotonic = monotonic or time.monotonic
|
|
91
|
-
killswitch = killswitch or _env_killed
|
|
92
|
-
budget = BudgetMeter(monotonic)
|
|
93
|
-
|
|
94
|
-
lap_changes: list[bool] = []
|
|
95
|
-
lap = 0
|
|
96
|
-
|
|
97
|
-
def emit(decision: str, verdict: Verdict, result: LapResult | None = None) -> None:
|
|
98
|
-
ledger.record(
|
|
99
|
-
LedgerEntry(
|
|
100
|
-
run_id=run_id,
|
|
101
|
-
name=name,
|
|
102
|
-
lap=lap,
|
|
103
|
-
ts=clock(),
|
|
104
|
-
decision=decision,
|
|
105
|
-
passed=verdict.passed,
|
|
106
|
-
detail=verdict.detail,
|
|
107
|
-
# The agent's own claim is recorded for audit only — never used
|
|
108
|
-
# to terminate (see the loop invariant). Log is capped so a
|
|
109
|
-
# verbose runner can't bloat the ledger row.
|
|
110
|
-
agent_claimed_done=bool(result.agent_claimed_done) if result else False,
|
|
111
|
-
runner_log=(result.log or "")[:2000] if result else "",
|
|
112
|
-
budget=budget.snapshot(),
|
|
113
|
-
)
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
while True:
|
|
117
|
-
lap += 1
|
|
118
|
-
|
|
119
|
-
# 1. Kill switch — before any work (so laps reports completed laps).
|
|
120
|
-
if killswitch():
|
|
121
|
-
emit("killed", Verdict(False, "kill switch tripped"))
|
|
122
|
-
return Outcome(Status.KILLED, "killed", lap - 1, run_id)
|
|
123
|
-
|
|
124
|
-
# 2. Budget bounds — before running the agent.
|
|
125
|
-
tripped, why = budget.exceeded(lap, bounds)
|
|
126
|
-
if tripped:
|
|
127
|
-
emit("halt", Verdict(False, why))
|
|
128
|
-
return Outcome(Status.HALT, why, lap - 1, run_id)
|
|
129
|
-
|
|
130
|
-
# 3. Run the proposer for one lap.
|
|
131
|
-
try:
|
|
132
|
-
result = runner(lap)
|
|
133
|
-
except Exception as exc: # runner failure is a terminal ERROR
|
|
134
|
-
detail = f"runner error: {type(exc).__name__}: {exc}"
|
|
135
|
-
emit("error", Verdict(False, detail))
|
|
136
|
-
return Outcome(Status.ERROR, detail, lap, run_id)
|
|
137
|
-
|
|
138
|
-
# 4. Accumulate spend.
|
|
139
|
-
budget.spend(result.tokens)
|
|
140
|
-
lap_changes.append(result.changed)
|
|
141
|
-
|
|
142
|
-
# 4b. The budget is a HARD ceiling and takes precedence over the gate.
|
|
143
|
-
# Token spend and elapsed wall-clock are only knowable AFTER the lap
|
|
144
|
-
# runs, so re-check here: an overshooting lap must HALT even when its own
|
|
145
|
-
# gate would pass. ``lap`` (not lap+1) keeps the iteration cap from
|
|
146
|
-
# tripping while we are still within the allowed iteration count.
|
|
147
|
-
tripped, why = budget.exceeded(lap, bounds)
|
|
148
|
-
if tripped:
|
|
149
|
-
emit("halt", Verdict(False, why), result)
|
|
150
|
-
return Outcome(Status.HALT, why, lap, run_id)
|
|
151
|
-
|
|
152
|
-
# 5. Independent gate — agent's own claim is never consulted here.
|
|
153
|
-
try:
|
|
154
|
-
verdict = gate(lap)
|
|
155
|
-
except Exception as exc:
|
|
156
|
-
detail = f"gate error: {type(exc).__name__}: {exc}"
|
|
157
|
-
emit("error", Verdict(False, detail), result)
|
|
158
|
-
return Outcome(Status.ERROR, detail, lap, run_id)
|
|
159
|
-
|
|
160
|
-
# 6. Decide.
|
|
161
|
-
if stop_condition_met(verdict):
|
|
162
|
-
if rung_requires_approval(rung, bounds):
|
|
163
|
-
granted = bool(approver(verdict)) if approver is not None else False
|
|
164
|
-
if not granted:
|
|
165
|
-
emit("pause", verdict, result)
|
|
166
|
-
return Outcome(Status.PAUSE, "awaiting-approval", lap, run_id)
|
|
167
|
-
emit("done", verdict, result)
|
|
168
|
-
return Outcome(Status.DONE, "gate-passed", lap, run_id)
|
|
169
|
-
|
|
170
|
-
if no_progress(lap_changes, bounds.no_progress_window):
|
|
171
|
-
emit("halt", Verdict(False, "no-progress"), result)
|
|
172
|
-
return Outcome(Status.HALT, "no-progress", lap, run_id)
|
|
173
|
-
|
|
174
|
-
emit("continue", verdict, result)
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
"""Durable, queryable ledger for bounded-loop runs.
|
|
2
|
-
|
|
3
|
-
Every lap produces one append-only :class:`LedgerEntry`. A ledger persists
|
|
4
|
-
those entries so a run can be inspected, resumed, and audited after the fact.
|
|
5
|
-
|
|
6
|
-
Two implementations ship:
|
|
7
|
-
|
|
8
|
-
* :class:`InMemoryLedger` — a dict-backed store used by tests and as a safe
|
|
9
|
-
fallback when no SLM data root is available.
|
|
10
|
-
* :class:`SLMMemoryLedger` — the real backend. It writes each lap through a
|
|
11
|
-
SuperLocalMemory engine so the ledger *is* memory: queryable via ``slm
|
|
12
|
-
recall``, visible in the dashboard, and resumable across sessions. This is
|
|
13
|
-
what makes SLM's take on bounded loops distinct — the loop's history lives
|
|
14
|
-
in the same durable store as everything else the agent remembers.
|
|
15
|
-
|
|
16
|
-
The engine-backed store mirrors the exact profile-scoped SQL contract the
|
|
17
|
-
shipped framework adapters already rely on, so it stays valid as the engine
|
|
18
|
-
evolves.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
from __future__ import annotations
|
|
22
|
-
|
|
23
|
-
import json
|
|
24
|
-
from dataclasses import asdict, dataclass, field
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
from typing import Any, Protocol, runtime_checkable
|
|
27
|
-
|
|
28
|
-
LEDGER_TAG = "slm-loop"
|
|
29
|
-
_LEDGER_IMPORTANCE = 2 # below ordinary user memories so laps never crowd recall
|
|
30
|
-
_SESSION_PREFIX = "loop:"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@dataclass(frozen=True)
|
|
34
|
-
class LedgerEntry:
|
|
35
|
-
"""One immutable row recording what happened on a single lap."""
|
|
36
|
-
|
|
37
|
-
run_id: str
|
|
38
|
-
name: str
|
|
39
|
-
lap: int
|
|
40
|
-
ts: str
|
|
41
|
-
decision: str # continue | done | halt | pause | killed | error
|
|
42
|
-
passed: bool
|
|
43
|
-
detail: str
|
|
44
|
-
# The runner's own claim (audit-only; never terminates the loop) + its log.
|
|
45
|
-
agent_claimed_done: bool = False
|
|
46
|
-
runner_log: str = ""
|
|
47
|
-
budget: dict[str, Any] = field(default_factory=dict)
|
|
48
|
-
|
|
49
|
-
def to_json(self) -> str:
|
|
50
|
-
return json.dumps(asdict(self), ensure_ascii=False, separators=(",", ":"))
|
|
51
|
-
|
|
52
|
-
@classmethod
|
|
53
|
-
def from_json(cls, text: str) -> "LedgerEntry | None":
|
|
54
|
-
try:
|
|
55
|
-
data = json.loads(text)
|
|
56
|
-
except (TypeError, json.JSONDecodeError):
|
|
57
|
-
return None
|
|
58
|
-
if not isinstance(data, dict) or "run_id" not in data or "lap" not in data:
|
|
59
|
-
return None
|
|
60
|
-
return cls(
|
|
61
|
-
run_id=str(data.get("run_id", "")),
|
|
62
|
-
name=str(data.get("name", "")),
|
|
63
|
-
lap=int(data.get("lap", 0)),
|
|
64
|
-
ts=str(data.get("ts", "")),
|
|
65
|
-
decision=str(data.get("decision", "")),
|
|
66
|
-
passed=bool(data.get("passed", False)),
|
|
67
|
-
detail=str(data.get("detail", "")),
|
|
68
|
-
agent_claimed_done=bool(data.get("agent_claimed_done", False)),
|
|
69
|
-
runner_log=str(data.get("runner_log", "")),
|
|
70
|
-
budget=data.get("budget") if isinstance(data.get("budget"), dict) else {},
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
@runtime_checkable
|
|
75
|
-
class LedgerStore(Protocol):
|
|
76
|
-
"""Append-only audit trail keyed by run."""
|
|
77
|
-
|
|
78
|
-
def record(self, entry: LedgerEntry) -> None: ...
|
|
79
|
-
def laps(self, run_id: str) -> list[LedgerEntry]: ...
|
|
80
|
-
def runs(self, name: str) -> list[str]: ...
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class InMemoryLedger:
|
|
84
|
-
"""Process-local ledger. Never raises; ideal for tests and offline demos."""
|
|
85
|
-
|
|
86
|
-
def __init__(self) -> None:
|
|
87
|
-
self._by_run: dict[str, list[LedgerEntry]] = {}
|
|
88
|
-
|
|
89
|
-
def record(self, entry: LedgerEntry) -> None:
|
|
90
|
-
self._by_run.setdefault(entry.run_id, []).append(entry)
|
|
91
|
-
|
|
92
|
-
def laps(self, run_id: str) -> list[LedgerEntry]:
|
|
93
|
-
return list(self._by_run.get(run_id, ()))
|
|
94
|
-
|
|
95
|
-
def runs(self, name: str) -> list[str]:
|
|
96
|
-
seen: list[str] = []
|
|
97
|
-
for run_id, entries in self._by_run.items():
|
|
98
|
-
if entries and entries[0].name == name and run_id not in seen:
|
|
99
|
-
seen.append(run_id)
|
|
100
|
-
return seen
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
class SLMMemoryLedger:
|
|
104
|
-
"""Ledger backed by a SuperLocalMemory engine store.
|
|
105
|
-
|
|
106
|
-
``store`` is any object exposing ``add(content, *, session_id, metadata)``,
|
|
107
|
-
``list_session(session_id)`` and ``list_prefix(prefix)`` — the small
|
|
108
|
-
contract :func:`open_engine_store` provides. Injecting it keeps this class
|
|
109
|
-
free of engine-construction concerns and trivially testable with a fake.
|
|
110
|
-
"""
|
|
111
|
-
|
|
112
|
-
def __init__(self, store: Any) -> None:
|
|
113
|
-
self._store = store
|
|
114
|
-
|
|
115
|
-
@staticmethod
|
|
116
|
-
def _session_id(run_id: str) -> str:
|
|
117
|
-
return f"{_SESSION_PREFIX}{run_id}"
|
|
118
|
-
|
|
119
|
-
def record(self, entry: LedgerEntry) -> None:
|
|
120
|
-
self._store.add(
|
|
121
|
-
entry.to_json(),
|
|
122
|
-
session_id=self._session_id(entry.run_id),
|
|
123
|
-
metadata={
|
|
124
|
-
"integration": "slm-loop",
|
|
125
|
-
"loop_name": entry.name,
|
|
126
|
-
"loop_run_id": entry.run_id,
|
|
127
|
-
"loop_lap": entry.lap,
|
|
128
|
-
"loop_decision": entry.decision,
|
|
129
|
-
"tags": [LEDGER_TAG, f"loop:{entry.name}"],
|
|
130
|
-
"importance": _LEDGER_IMPORTANCE,
|
|
131
|
-
"project_name": "slm-loop",
|
|
132
|
-
},
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
def laps(self, run_id: str) -> list[LedgerEntry]:
|
|
136
|
-
rows = self._store.list_session(self._session_id(run_id))
|
|
137
|
-
entries = [LedgerEntry.from_json(r.get("content", "")) for r in rows]
|
|
138
|
-
return [e for e in entries if e is not None]
|
|
139
|
-
|
|
140
|
-
def runs(self, name: str) -> list[str]:
|
|
141
|
-
"""Run ids for ``name``, newest run first.
|
|
142
|
-
|
|
143
|
-
``list_prefix`` returns rows created_at DESC, so the first time a run's
|
|
144
|
-
id is seen it is its most-recent lap; ``slm loop history`` therefore
|
|
145
|
-
lists the most recent runs first.
|
|
146
|
-
"""
|
|
147
|
-
rows = self._store.list_prefix(_SESSION_PREFIX)
|
|
148
|
-
ordered: list[str] = []
|
|
149
|
-
for row in rows:
|
|
150
|
-
entry = LedgerEntry.from_json(row.get("content", ""))
|
|
151
|
-
if entry is not None and entry.name == name and entry.run_id not in ordered:
|
|
152
|
-
ordered.append(entry.run_id)
|
|
153
|
-
return ordered
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
class _EngineLedgerStore:
|
|
157
|
-
"""Minimal profile-scoped store over a SuperLocalMemory engine.
|
|
158
|
-
|
|
159
|
-
Uses the engine's non-blocking write-through path when available and
|
|
160
|
-
direct, escaped, profile-scoped reads. The ``store`` fallback preserves
|
|
161
|
-
compatibility with lightweight adapter/test engines that predate
|
|
162
|
-
``store_fast``.
|
|
163
|
-
"""
|
|
164
|
-
|
|
165
|
-
def __init__(self, engine: Any, *, owns_engine: bool = True) -> None:
|
|
166
|
-
self._engine = engine
|
|
167
|
-
# When False, this store does NOT own the engine's lifecycle (the
|
|
168
|
-
# caller — e.g. the MCP daemon — keeps it), so close() must not tear
|
|
169
|
-
# down a shared engine. open_engine_store() passes True (it built the
|
|
170
|
-
# engine); engine_backed_ledger() passes False (daemon-owned engine).
|
|
171
|
-
self._owns_engine = owns_engine
|
|
172
|
-
|
|
173
|
-
def add(self, content: str, *, session_id: str, metadata: dict) -> None:
|
|
174
|
-
# A loop ledger needs the durable parent row and immediate lexical
|
|
175
|
-
# recall, not synchronous embeddings/entity/graph enrichment. Loading
|
|
176
|
-
# the heavyweight embedding worker for every bounded-loop lap can stall
|
|
177
|
-
# the loop for the full worker timeout and consume ~1 GB for metadata.
|
|
178
|
-
# The write-through path persists the same session-scoped content in
|
|
179
|
-
# milliseconds; ordinary background enrichment can still promote it.
|
|
180
|
-
fast_metadata = {**metadata, "session_id": session_id}
|
|
181
|
-
store_fast = getattr(self._engine, "store_fast", None)
|
|
182
|
-
if callable(store_fast):
|
|
183
|
-
store_fast(
|
|
184
|
-
content,
|
|
185
|
-
metadata=fast_metadata,
|
|
186
|
-
index_external=False,
|
|
187
|
-
)
|
|
188
|
-
return
|
|
189
|
-
|
|
190
|
-
self._engine.store(
|
|
191
|
-
content,
|
|
192
|
-
session_id=session_id,
|
|
193
|
-
metadata=metadata,
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
def list_session(self, session_id: str) -> list[dict]:
|
|
197
|
-
# Cap the read: a bounded-loop run is capped at max_iterations laps, so
|
|
198
|
-
# a legitimate run is small; the LIMIT stops a pathologically long
|
|
199
|
-
# session_id from forcing an unbounded materialization on every
|
|
200
|
-
# `slm loop show` / history lookup.
|
|
201
|
-
rows = self._engine.db.execute(
|
|
202
|
-
"SELECT content, created_at FROM memories "
|
|
203
|
-
"WHERE profile_id=? AND session_id=? "
|
|
204
|
-
"ORDER BY created_at ASC, rowid ASC LIMIT 5000",
|
|
205
|
-
(self._engine.profile_id, session_id),
|
|
206
|
-
)
|
|
207
|
-
return [dict(row) for row in rows]
|
|
208
|
-
|
|
209
|
-
def list_prefix(self, prefix: str) -> list[dict]:
|
|
210
|
-
escaped = prefix.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_")
|
|
211
|
-
# Cap the scan so a long-lived, high-volume ledger can't force an
|
|
212
|
-
# unbounded read on `slm loop history`.
|
|
213
|
-
rows = self._engine.db.execute(
|
|
214
|
-
"SELECT content, created_at FROM memories "
|
|
215
|
-
"WHERE profile_id=? AND session_id LIKE ? ESCAPE '\\' "
|
|
216
|
-
"ORDER BY created_at DESC, rowid DESC LIMIT 5000",
|
|
217
|
-
(self._engine.profile_id, escaped + "%"),
|
|
218
|
-
)
|
|
219
|
-
return [dict(row) for row in rows]
|
|
220
|
-
|
|
221
|
-
def close(self) -> None:
|
|
222
|
-
if self._owns_engine:
|
|
223
|
-
self._engine.close()
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
class _PoolLedgerStore(_EngineLedgerStore):
|
|
227
|
-
"""Write through the owned daemon/worker; read through the LIGHT engine.
|
|
228
|
-
|
|
229
|
-
MCP intentionally keeps a LIGHT engine in-process. That engine owns a
|
|
230
|
-
read-only database view but refuses ``store``/``store_fast``. The pool is
|
|
231
|
-
the admitted writer and shares the same canonical store, so loop laps stay
|
|
232
|
-
immediately queryable without turning every MCP process into a heavy
|
|
233
|
-
writer.
|
|
234
|
-
"""
|
|
235
|
-
|
|
236
|
-
def __init__(self, pool: Any, reader_engine: Any) -> None:
|
|
237
|
-
super().__init__(reader_engine, owns_engine=False)
|
|
238
|
-
self._pool = pool
|
|
239
|
-
|
|
240
|
-
def add(self, content: str, *, session_id: str, metadata: dict) -> None:
|
|
241
|
-
result = self._pool.store(
|
|
242
|
-
content,
|
|
243
|
-
metadata={
|
|
244
|
-
**metadata,
|
|
245
|
-
"session_id": session_id,
|
|
246
|
-
"profile_id": self._engine.profile_id,
|
|
247
|
-
},
|
|
248
|
-
)
|
|
249
|
-
accepted = bool(result.get("ok") or result.get("success"))
|
|
250
|
-
if not accepted:
|
|
251
|
-
raise RuntimeError(
|
|
252
|
-
result.get("error", "owned SLM writer rejected loop ledger entry")
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def engine_backed_ledger(engine: Any) -> SLMMemoryLedger:
|
|
257
|
-
"""Build an SLM-backed ledger over an ALREADY-OPEN engine.
|
|
258
|
-
|
|
259
|
-
Unlike :func:`open_engine_store`, this neither creates nor owns the engine —
|
|
260
|
-
the caller (e.g. the MCP daemon, which keeps one long-lived engine per
|
|
261
|
-
profile) retains full ownership and lifecycle. The returned ledger never
|
|
262
|
-
closes the engine, so it is safe to build one per tool call. The engine's
|
|
263
|
-
per-call, WAL-mode connection model makes the ledger's reads/writes safe
|
|
264
|
-
from a worker thread.
|
|
265
|
-
"""
|
|
266
|
-
return SLMMemoryLedger(_EngineLedgerStore(engine, owns_engine=False))
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
def pool_backed_ledger(pool: Any, reader_engine: Any) -> SLMMemoryLedger:
|
|
270
|
-
"""Build an MCP-safe ledger: admitted pool writes, LIGHT engine reads."""
|
|
271
|
-
return SLMMemoryLedger(_PoolLedgerStore(pool, reader_engine))
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
def open_engine_store(db_path: str | Path) -> _EngineLedgerStore:
|
|
275
|
-
"""Build an engine-backed ledger store rooted at ``db_path``.
|
|
276
|
-
|
|
277
|
-
Raises ``ImportError`` with an install hint if the SLM runtime is missing.
|
|
278
|
-
"""
|
|
279
|
-
from dataclasses import replace
|
|
280
|
-
|
|
281
|
-
try:
|
|
282
|
-
from superlocalmemory.core.config import SLMConfig
|
|
283
|
-
from superlocalmemory.core.engine import MemoryEngine
|
|
284
|
-
from superlocalmemory.storage.models import Mode
|
|
285
|
-
except ImportError as exc: # pragma: no cover - defensive
|
|
286
|
-
raise ImportError(
|
|
287
|
-
"SuperLocalMemory runtime is required for the SLM-backed loop "
|
|
288
|
-
"ledger. Install it with: python -m pip install superlocalmemory."
|
|
289
|
-
) from exc
|
|
290
|
-
|
|
291
|
-
path = Path(db_path).expanduser().resolve()
|
|
292
|
-
config = SLMConfig.for_mode(Mode.A, base_dir=path.parent)
|
|
293
|
-
config.db_path = path
|
|
294
|
-
config.forgetting = replace(config.forgetting, enabled=False)
|
|
295
|
-
config.retrieval.use_cross_encoder = False
|
|
296
|
-
engine = MemoryEngine(config)
|
|
297
|
-
engine.initialize()
|
|
298
|
-
return _EngineLedgerStore(engine)
|