superlocalmemory 4.1.13 → 4.1.15
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 +103 -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,45 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import threading
|
|
7
|
-
import time
|
|
8
|
-
|
|
9
|
-
_TTL_SECONDS = 300.0
|
|
10
|
-
|
|
11
|
-
_lock = threading.RLock()
|
|
12
|
-
_marks: dict[tuple[str, str], float] = {}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def mark_erasing(profile_id: str, fact_id: str) -> None:
|
|
16
|
-
now = time.time()
|
|
17
|
-
with _lock:
|
|
18
|
-
_marks[(profile_id, fact_id)] = now
|
|
19
|
-
_prune(now)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def clear_erasing(profile_id: str, fact_id: str) -> None:
|
|
23
|
-
with _lock:
|
|
24
|
-
_marks.pop((profile_id, fact_id), None)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def is_erasing(profile_id: str, fact_id: str) -> bool:
|
|
28
|
-
now = time.time()
|
|
29
|
-
with _lock:
|
|
30
|
-
ts = _marks.get((profile_id, fact_id))
|
|
31
|
-
if ts is None:
|
|
32
|
-
return False
|
|
33
|
-
if now - ts > _TTL_SECONDS:
|
|
34
|
-
_marks.pop((profile_id, fact_id), None)
|
|
35
|
-
return False
|
|
36
|
-
return True
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def _prune(now: float) -> None:
|
|
40
|
-
expired = [key for key, ts in _marks.items() if now - ts > _TTL_SECONDS]
|
|
41
|
-
for key in expired:
|
|
42
|
-
_marks.pop(key, None)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
__all__ = ["mark_erasing", "clear_erasing", "is_erasing"]
|
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
"""Bridge-v2 immutable receipt storage and strictly bounded execution learning.
|
|
2
|
-
|
|
3
|
-
This module deliberately has no dependency on recall, semantic facts, or user
|
|
4
|
-
preferences. Bounded Loops receipts can only update the rebuildable execution
|
|
5
|
-
event projection after the consumer validates every eligibility condition.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import hashlib
|
|
11
|
-
import json
|
|
12
|
-
import re
|
|
13
|
-
import sqlite3
|
|
14
|
-
from copy import deepcopy
|
|
15
|
-
from dataclasses import dataclass
|
|
16
|
-
from datetime import datetime, timezone
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
from typing import Any, Callable
|
|
19
|
-
|
|
20
|
-
from superlocalmemory.storage.agent_experience import (
|
|
21
|
-
_ProfileAdmissionGate,
|
|
22
|
-
_PROCESS_LOCKS_GUARD,
|
|
23
|
-
_PROFILE_GATES,
|
|
24
|
-
ProfileAdmissionError,
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
_CONTRACT = "bounded-loops.dev/slm-bridge/v2"
|
|
28
|
-
_SHA256_PREFIX = "sha256:"
|
|
29
|
-
_ALLOWED_STATES = frozenset({"SUCCEEDED", "FAILED"})
|
|
30
|
-
_MAX_PAYLOAD_BYTES = 32 * 1024
|
|
31
|
-
_MAX_NODES = 256
|
|
32
|
-
_MAX_ARTIFACTS_PER_NODE = 64
|
|
33
|
-
_SAFE_ID = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$")
|
|
34
|
-
_DIGEST = re.compile(r"^sha256:[0-9a-f]{64}$")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class ExecutionLearningValidationError(ValueError):
|
|
38
|
-
"""A v2 receipt is not eligible for execution-learning ingestion."""
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# This is deliberately an in-process capability, not a serializable field in
|
|
42
|
-
# the producer payload. An MCP producer can send JSON; it cannot mint this
|
|
43
|
-
# boundary witness. It prevents an accidental future caller from turning a
|
|
44
|
-
# schema-valid JSON document directly into learned execution behaviour.
|
|
45
|
-
_BRIDGE_SEAL = object()
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@dataclass(frozen=True)
|
|
49
|
-
class VerifiedExecutionEvidence:
|
|
50
|
-
"""A v2 payload bound to one negotiated, locally observed producer session.
|
|
51
|
-
|
|
52
|
-
``payload`` intentionally remains available for the immutable receipt
|
|
53
|
-
record. The private seal is checked by :class:`ExecutionLearningStore`
|
|
54
|
-
and never crosses MCP or disk boundaries.
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
payload: dict[str, Any]
|
|
58
|
-
producer_identity: str
|
|
59
|
-
capability_digest: str
|
|
60
|
-
terminal_listing_digest: str
|
|
61
|
-
payload_sha256: str
|
|
62
|
-
_seal: object
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def _seal_verified_execution_evidence(
|
|
66
|
-
payload: dict[str, Any],
|
|
67
|
-
*,
|
|
68
|
-
producer_identity: str,
|
|
69
|
-
capability_digest: str,
|
|
70
|
-
terminal_listing_digest: str,
|
|
71
|
-
) -> VerifiedExecutionEvidence:
|
|
72
|
-
"""Create the sole accepted execution-learning input at the MCP boundary."""
|
|
73
|
-
_validate(payload)
|
|
74
|
-
for label, value in {
|
|
75
|
-
"producer identity": producer_identity,
|
|
76
|
-
"capability digest": capability_digest,
|
|
77
|
-
"terminal listing digest": terminal_listing_digest,
|
|
78
|
-
}.items():
|
|
79
|
-
if not isinstance(value, str) or not value:
|
|
80
|
-
raise ExecutionLearningValidationError(f"v2 receipt has no verified {label}")
|
|
81
|
-
sealed_payload = deepcopy(payload)
|
|
82
|
-
return VerifiedExecutionEvidence(
|
|
83
|
-
payload=sealed_payload,
|
|
84
|
-
producer_identity=producer_identity,
|
|
85
|
-
capability_digest=capability_digest,
|
|
86
|
-
terminal_listing_digest=terminal_listing_digest,
|
|
87
|
-
payload_sha256=_digest(sealed_payload),
|
|
88
|
-
_seal=_BRIDGE_SEAL,
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
class ExecutionLearningStore:
|
|
93
|
-
"""Atomically persist v2 receipts before their derived event projection."""
|
|
94
|
-
|
|
95
|
-
def __init__(self, path: str | Path, *, is_profile_active: Callable[[str], bool]) -> None:
|
|
96
|
-
self._path = Path(path).resolve()
|
|
97
|
-
self._is_profile_active = is_profile_active
|
|
98
|
-
with _PROCESS_LOCKS_GUARD:
|
|
99
|
-
self._gate = _PROFILE_GATES.setdefault(str(self._path), _ProfileAdmissionGate())
|
|
100
|
-
|
|
101
|
-
def ingest(self, evidence: VerifiedExecutionEvidence) -> bool:
|
|
102
|
-
if (
|
|
103
|
-
not isinstance(evidence, VerifiedExecutionEvidence)
|
|
104
|
-
or evidence._seal is not _BRIDGE_SEAL
|
|
105
|
-
):
|
|
106
|
-
raise ExecutionLearningValidationError(
|
|
107
|
-
"v2 execution learning requires verified bridge provenance"
|
|
108
|
-
)
|
|
109
|
-
payload = evidence.payload
|
|
110
|
-
if evidence.payload_sha256 != _digest(payload):
|
|
111
|
-
raise ExecutionLearningValidationError(
|
|
112
|
-
"v2 execution-learning provenance was modified after verification"
|
|
113
|
-
)
|
|
114
|
-
_validate(payload)
|
|
115
|
-
profile_id = payload["profile_id"]
|
|
116
|
-
self._gate.admit(profile_id, self._is_profile_active)
|
|
117
|
-
digest = _digest(payload)
|
|
118
|
-
receipt = payload["receipt"]
|
|
119
|
-
route_key = _route_key(payload["route"])
|
|
120
|
-
signal = 1 if payload["run_state"] == "SUCCEEDED" else -1
|
|
121
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
122
|
-
conn: sqlite3.Connection | None = None
|
|
123
|
-
try:
|
|
124
|
-
conn = sqlite3.connect(str(self._path), timeout=1.0, isolation_level=None)
|
|
125
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
126
|
-
# The same process-wide admission gate drains in-flight writes
|
|
127
|
-
# before erasure. This durable closure check also prevents a late
|
|
128
|
-
# transaction from resurrecting a profile after a completed close.
|
|
129
|
-
closed = conn.execute(
|
|
130
|
-
"SELECT 1 FROM agent_receipt_profile_closures WHERE profile_id=?", (profile_id,)
|
|
131
|
-
).fetchone()
|
|
132
|
-
if closed is not None:
|
|
133
|
-
raise ProfileAdmissionError("profile is inactive or closing for erasure")
|
|
134
|
-
existing = conn.execute(
|
|
135
|
-
"SELECT payload_sha256 FROM execution_learning_receipts "
|
|
136
|
-
"WHERE profile_id=? AND workspace_id=? AND run_ref=?",
|
|
137
|
-
(profile_id, payload["workspace_id"], payload["run_ref"]),
|
|
138
|
-
).fetchone()
|
|
139
|
-
if existing is not None:
|
|
140
|
-
if existing[0] != digest:
|
|
141
|
-
raise ExecutionLearningValidationError(
|
|
142
|
-
"external run address has a different receipt head"
|
|
143
|
-
)
|
|
144
|
-
conn.execute("ROLLBACK")
|
|
145
|
-
return False
|
|
146
|
-
conn.execute(
|
|
147
|
-
"INSERT INTO execution_learning_receipts "
|
|
148
|
-
"(profile_id, workspace_id, run_ref, run_id, receipt_head_digest, "
|
|
149
|
-
"payload_json, payload_sha256, producer_identity, capability_digest, "
|
|
150
|
-
"terminal_listing_digest, observed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
151
|
-
(profile_id, payload["workspace_id"], payload["run_ref"], payload["run_id"],
|
|
152
|
-
receipt["head_digest"], _json(payload), digest, evidence.producer_identity,
|
|
153
|
-
evidence.capability_digest, evidence.terminal_listing_digest, now),
|
|
154
|
-
)
|
|
155
|
-
conn.execute(
|
|
156
|
-
"INSERT INTO execution_learning_events "
|
|
157
|
-
"(profile_id, workspace_id, run_ref, receipt_head_digest, route_key, signal, created_at) "
|
|
158
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
159
|
-
(profile_id, payload["workspace_id"], payload["run_ref"],
|
|
160
|
-
receipt["head_digest"], route_key, signal, now),
|
|
161
|
-
)
|
|
162
|
-
conn.execute("COMMIT")
|
|
163
|
-
return True
|
|
164
|
-
except Exception:
|
|
165
|
-
if conn is not None and conn.in_transaction:
|
|
166
|
-
conn.execute("ROLLBACK")
|
|
167
|
-
raise
|
|
168
|
-
finally:
|
|
169
|
-
if conn is not None:
|
|
170
|
-
conn.close()
|
|
171
|
-
self._gate.release(profile_id)
|
|
172
|
-
|
|
173
|
-
def status(self, profile_id: str) -> dict[str, int]:
|
|
174
|
-
conn = sqlite3.connect(str(self._path), timeout=0.5)
|
|
175
|
-
try:
|
|
176
|
-
receipts = conn.execute(
|
|
177
|
-
"SELECT COUNT(*) FROM execution_learning_receipts WHERE profile_id=?", (profile_id,)
|
|
178
|
-
).fetchone()[0]
|
|
179
|
-
totals = conn.execute(
|
|
180
|
-
"SELECT COUNT(*), COALESCE(SUM(signal = 1), 0), COALESCE(SUM(signal = -1), 0) "
|
|
181
|
-
"FROM execution_learning_events WHERE profile_id=?", (profile_id,),
|
|
182
|
-
).fetchone()
|
|
183
|
-
return {"receipts_total": int(receipts), "learning_events_total": int(totals[0]),
|
|
184
|
-
"positive_events": int(totals[1]), "negative_events": int(totals[2])}
|
|
185
|
-
finally:
|
|
186
|
-
conn.close()
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
def _validate(payload: dict[str, Any]) -> None:
|
|
190
|
-
required = {"contract", "profile_id", "workspace_id", "run_ref", "run_id", "outcome",
|
|
191
|
-
"run_state", "demonstration", "eligible_for_learning", "terminal_at",
|
|
192
|
-
"graph_digest", "plan_digest", "policy_digest", "receipt", "nodes",
|
|
193
|
-
"learning_authority", "route", "usage"}
|
|
194
|
-
if set(payload) != required or payload.get("contract") != _CONTRACT:
|
|
195
|
-
raise ExecutionLearningValidationError("v2 receipt does not match the bounded contract")
|
|
196
|
-
if len(_json(payload).encode("utf-8")) > _MAX_PAYLOAD_BYTES:
|
|
197
|
-
raise ExecutionLearningValidationError("v2 receipt exceeds the bounded payload size")
|
|
198
|
-
for field in ("profile_id", "workspace_id", "run_ref", "run_id"):
|
|
199
|
-
if not isinstance(payload[field], str) or not _SAFE_ID.fullmatch(payload[field]):
|
|
200
|
-
raise ExecutionLearningValidationError(f"v2 receipt has an invalid {field}")
|
|
201
|
-
for field in ("workspace_id", "graph_digest", "plan_digest", "policy_digest"):
|
|
202
|
-
if not isinstance(payload[field], str) or not _DIGEST.fullmatch(payload[field]):
|
|
203
|
-
raise ExecutionLearningValidationError(f"v2 receipt has an invalid {field}")
|
|
204
|
-
if not isinstance(payload["terminal_at"], str) or len(payload["terminal_at"]) > 64:
|
|
205
|
-
raise ExecutionLearningValidationError("v2 receipt has an invalid terminal timestamp")
|
|
206
|
-
if payload["demonstration"] is not False or payload["eligible_for_learning"] is not True:
|
|
207
|
-
raise ExecutionLearningValidationError("receipt is not eligible for execution learning")
|
|
208
|
-
if payload["run_state"] not in _ALLOWED_STATES or payload["outcome"] != payload["run_state"]:
|
|
209
|
-
raise ExecutionLearningValidationError("only terminal succeeded or executed-gate failure is learnable")
|
|
210
|
-
receipt, authority = payload["receipt"], payload["learning_authority"]
|
|
211
|
-
if not isinstance(receipt, dict) or not isinstance(authority, dict):
|
|
212
|
-
raise ExecutionLearningValidationError("receipt authority is malformed")
|
|
213
|
-
if set(receipt) != {"sequence", "head_digest", "trust"}:
|
|
214
|
-
raise ExecutionLearningValidationError("receipt chain metadata is malformed")
|
|
215
|
-
if (
|
|
216
|
-
isinstance(receipt["sequence"], bool)
|
|
217
|
-
or not isinstance(receipt["sequence"], int)
|
|
218
|
-
or receipt["sequence"] < 1
|
|
219
|
-
or receipt["trust"] != "local_hash_chain_only"
|
|
220
|
-
or not isinstance(receipt.get("head_digest"), str)
|
|
221
|
-
or not _DIGEST.fullmatch(receipt["head_digest"])
|
|
222
|
-
):
|
|
223
|
-
raise ExecutionLearningValidationError("receipt chain head is invalid")
|
|
224
|
-
if authority != {"scope": "execution_reliability_only", "reason_code": "verified_terminal_receipt",
|
|
225
|
-
"verification_state": "reconciled", "gate_authority": "deterministic_gate",
|
|
226
|
-
"trust_class": "local_hash_chain_only"}:
|
|
227
|
-
raise ExecutionLearningValidationError("receipt lacks bounded deterministic learning authority")
|
|
228
|
-
_validate_nodes(payload["nodes"])
|
|
229
|
-
_validate_route(payload["route"])
|
|
230
|
-
_validate_usage(payload["usage"])
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
def _validate_nodes(nodes: Any) -> None:
|
|
234
|
-
if not isinstance(nodes, list) or not nodes or len(nodes) > _MAX_NODES:
|
|
235
|
-
raise ExecutionLearningValidationError("receipt nodes are malformed")
|
|
236
|
-
for node in nodes:
|
|
237
|
-
if not isinstance(node, dict) or set(node) != {
|
|
238
|
-
"node_id", "state", "gate_passed", "attempts", "artifact_digests"
|
|
239
|
-
}:
|
|
240
|
-
raise ExecutionLearningValidationError("receipt node schema is malformed")
|
|
241
|
-
if (
|
|
242
|
-
not isinstance(node["node_id"], str)
|
|
243
|
-
or not _SAFE_ID.fullmatch(node["node_id"])
|
|
244
|
-
or not isinstance(node["state"], str)
|
|
245
|
-
or not _SAFE_ID.fullmatch(node["state"])
|
|
246
|
-
or node["gate_passed"] not in (True, False, None)
|
|
247
|
-
or isinstance(node["attempts"], bool)
|
|
248
|
-
or not isinstance(node["attempts"], int)
|
|
249
|
-
or not 0 <= node["attempts"] <= 10_000
|
|
250
|
-
or not isinstance(node["artifact_digests"], list)
|
|
251
|
-
or len(node["artifact_digests"]) > _MAX_ARTIFACTS_PER_NODE
|
|
252
|
-
or not all(isinstance(item, str) and _DIGEST.fullmatch(item)
|
|
253
|
-
for item in node["artifact_digests"])
|
|
254
|
-
):
|
|
255
|
-
raise ExecutionLearningValidationError("receipt node values are malformed")
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
def _validate_route(route: Any) -> None:
|
|
259
|
-
if not isinstance(route, dict) or set(route) - {"runner", "provider", "model", "effort"}:
|
|
260
|
-
raise ExecutionLearningValidationError("route or usage is malformed")
|
|
261
|
-
if not all(isinstance(value, str) and _SAFE_ID.fullmatch(value) for value in route.values()):
|
|
262
|
-
raise ExecutionLearningValidationError("route or usage is malformed")
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
def _validate_usage(usage: Any) -> None:
|
|
266
|
-
if (
|
|
267
|
-
not isinstance(usage, dict)
|
|
268
|
-
or set(usage) != {"attempts"}
|
|
269
|
-
or isinstance(usage["attempts"], bool)
|
|
270
|
-
or not isinstance(usage["attempts"], int)
|
|
271
|
-
or not 0 <= usage["attempts"] <= 1_000_000
|
|
272
|
-
):
|
|
273
|
-
raise ExecutionLearningValidationError("route or usage is malformed")
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
def _route_key(route: dict[str, Any]) -> str:
|
|
277
|
-
return "|".join(str(route.get(key, "")) for key in ("runner", "provider", "model", "effort"))
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
def _json(value: Any) -> str:
|
|
281
|
-
return json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
def _digest(value: dict[str, Any]) -> str:
|
|
285
|
-
return hashlib.sha256(_json(value).encode("utf-8")).hexdigest()
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
"""Typed storage for versioned, observation-only MCP evidence."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import hashlib
|
|
6
|
-
import json
|
|
7
|
-
import re
|
|
8
|
-
import sqlite3
|
|
9
|
-
import threading
|
|
10
|
-
import time
|
|
11
|
-
from datetime import datetime, timezone
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any, Callable
|
|
14
|
-
|
|
15
|
-
from superlocalmemory.storage.agent_experience import (
|
|
16
|
-
_PROCESS_LOCKS,
|
|
17
|
-
_PROCESS_LOCKS_GUARD,
|
|
18
|
-
_PROFILE_GATES,
|
|
19
|
-
LearningWriteBusyError,
|
|
20
|
-
ProfileAdmissionError,
|
|
21
|
-
_ProfileAdmissionGate,
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
_CONTRACT = "bounded-loops.dev/slm-bridge/v1"
|
|
25
|
-
_SHA256 = re.compile(r"\Asha256:[a-f0-9]{64}\Z")
|
|
26
|
-
_IDENTIFIER = re.compile(r"\A[A-Za-z0-9][A-Za-z0-9._-]{0,127}\Z")
|
|
27
|
-
_RUN_STATES = frozenset({"SUCCEEDED", "FAILED", "HALTED", "CANCELLED", "EXPIRED"})
|
|
28
|
-
_OUTCOMES = frozenset({"SUCCEEDED", "FAILED", "CANCELLED"})
|
|
29
|
-
_MAX_NODES = 256
|
|
30
|
-
_MAX_ARTIFACTS_PER_NODE = 64
|
|
31
|
-
_MAX_ARTIFACTS_TOTAL = 2_048
|
|
32
|
-
_MAX_NODES_JSON_BYTES = 64 * 1024
|
|
33
|
-
_MAX_TIMESTAMP_BYTES = 128
|
|
34
|
-
_MAX_RECEIPT_SEQUENCE = (1 << 63) - 1
|
|
35
|
-
_INSERT = (
|
|
36
|
-
"INSERT INTO external_evidence_receipts (profile_id, contract_id, workspace_id, "
|
|
37
|
-
"run_ref, run_id, outcome, run_state, demonstration, "
|
|
38
|
-
"eligible_for_learning, terminal_at, graph_digest, plan_digest, "
|
|
39
|
-
"policy_digest, receipt_sequence, receipt_head_digest, receipt_trust, "
|
|
40
|
-
"nodes_json, artifact_digests_json, payload_sha256, observed_at) "
|
|
41
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "
|
|
42
|
-
"ON CONFLICT(profile_id, contract_id, workspace_id, run_ref) DO NOTHING"
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class ExternalEvidenceConflictError(ValueError):
|
|
47
|
-
"""A stable external run address produced a different terminal receipt head."""
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
class ExternalEvidenceValidationError(ValueError):
|
|
51
|
-
"""An external evidence document does not satisfy the public v1 contract."""
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class ExternalEvidenceStore:
|
|
55
|
-
"""Persist evidence without entering SLM's memory/recall lock domain."""
|
|
56
|
-
|
|
57
|
-
def __init__(self, path: str | Path, *, is_profile_active: Callable[[str], bool]) -> None:
|
|
58
|
-
self._path = Path(path)
|
|
59
|
-
self._is_profile_active = is_profile_active
|
|
60
|
-
resolved = str(self._path.resolve())
|
|
61
|
-
with _PROCESS_LOCKS_GUARD:
|
|
62
|
-
self._lock = _PROCESS_LOCKS.setdefault(resolved, threading.Lock())
|
|
63
|
-
self._gate = _PROFILE_GATES.setdefault(resolved, _ProfileAdmissionGate())
|
|
64
|
-
|
|
65
|
-
def record(self, payload: dict[str, Any]) -> bool:
|
|
66
|
-
_validate(payload)
|
|
67
|
-
profile_id = payload["profile_id"]
|
|
68
|
-
self._gate.admit(profile_id, self._is_profile_active)
|
|
69
|
-
digest = _payload_digest(payload)
|
|
70
|
-
deadline = time.monotonic() + 0.90
|
|
71
|
-
if not self._lock.acquire(timeout=0.90):
|
|
72
|
-
self._gate.release(profile_id)
|
|
73
|
-
raise LearningWriteBusyError("external evidence write deadline exceeded")
|
|
74
|
-
try:
|
|
75
|
-
while True:
|
|
76
|
-
conn: sqlite3.Connection | None = None
|
|
77
|
-
try:
|
|
78
|
-
conn = sqlite3.connect(str(self._path), timeout=0, isolation_level=None)
|
|
79
|
-
conn.row_factory = sqlite3.Row
|
|
80
|
-
conn.execute("PRAGMA journal_mode=WAL")
|
|
81
|
-
conn.execute("PRAGMA busy_timeout=0")
|
|
82
|
-
conn.execute("PRAGMA synchronous=NORMAL")
|
|
83
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
84
|
-
_assert_profile_open(conn, profile_id)
|
|
85
|
-
row = _row(payload, digest)
|
|
86
|
-
cursor = conn.execute(_INSERT, row)
|
|
87
|
-
if cursor.rowcount:
|
|
88
|
-
conn.execute("COMMIT")
|
|
89
|
-
return True
|
|
90
|
-
existing = _get_conn(
|
|
91
|
-
conn,
|
|
92
|
-
profile_id,
|
|
93
|
-
payload["contract"],
|
|
94
|
-
payload["workspace_id"],
|
|
95
|
-
payload["run_ref"],
|
|
96
|
-
)
|
|
97
|
-
conn.execute("ROLLBACK")
|
|
98
|
-
if _payload_digest(existing) == digest:
|
|
99
|
-
return False
|
|
100
|
-
raise ExternalEvidenceConflictError(
|
|
101
|
-
"external run address has a different receipt head"
|
|
102
|
-
)
|
|
103
|
-
except sqlite3.OperationalError as exc:
|
|
104
|
-
if conn is not None and conn.in_transaction:
|
|
105
|
-
conn.execute("ROLLBACK")
|
|
106
|
-
busy = "locked" in str(exc).lower() or "busy" in str(exc).lower()
|
|
107
|
-
if not busy or time.monotonic() >= deadline:
|
|
108
|
-
if busy:
|
|
109
|
-
raise LearningWriteBusyError(
|
|
110
|
-
"external evidence write deadline exceeded"
|
|
111
|
-
) from exc
|
|
112
|
-
raise
|
|
113
|
-
time.sleep(0.02)
|
|
114
|
-
finally:
|
|
115
|
-
if conn is not None:
|
|
116
|
-
conn.close()
|
|
117
|
-
finally:
|
|
118
|
-
self._lock.release()
|
|
119
|
-
self._gate.release(profile_id)
|
|
120
|
-
|
|
121
|
-
def get(self, profile_id: str, workspace_id: str, run_ref: str) -> dict[str, Any] | None:
|
|
122
|
-
conn = sqlite3.connect(f"{self._path.resolve().as_uri()}?mode=ro", uri=True, timeout=0.5)
|
|
123
|
-
conn.row_factory = sqlite3.Row
|
|
124
|
-
try:
|
|
125
|
-
return _get_conn(conn, profile_id, _CONTRACT, workspace_id, run_ref)
|
|
126
|
-
finally:
|
|
127
|
-
conn.close()
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def get_profile_external_evidence_summary(path: str | Path, profile_id: str) -> dict[str, Any]:
|
|
131
|
-
"""Return indexed Living Brain totals without opening SLM's memory database."""
|
|
132
|
-
empty = {
|
|
133
|
-
"is_real": False,
|
|
134
|
-
"availability": "unavailable",
|
|
135
|
-
"total": 0,
|
|
136
|
-
"by_run_state": {},
|
|
137
|
-
"demonstrations": 0,
|
|
138
|
-
}
|
|
139
|
-
target = Path(path)
|
|
140
|
-
if not target.exists():
|
|
141
|
-
return empty
|
|
142
|
-
conn: sqlite3.Connection | None = None
|
|
143
|
-
try:
|
|
144
|
-
conn = sqlite3.connect(f"{target.resolve().as_uri()}?mode=ro", uri=True, timeout=0.5)
|
|
145
|
-
total = conn.execute(
|
|
146
|
-
"SELECT COUNT(*) FROM external_evidence_receipts WHERE profile_id=?", (profile_id,)
|
|
147
|
-
).fetchone()[0]
|
|
148
|
-
demo = conn.execute(
|
|
149
|
-
"SELECT COUNT(*) FROM external_evidence_receipts "
|
|
150
|
-
"WHERE profile_id=? AND demonstration=1",
|
|
151
|
-
(profile_id,),
|
|
152
|
-
).fetchone()[0]
|
|
153
|
-
rows = conn.execute(
|
|
154
|
-
"SELECT run_state, COUNT(*) FROM external_evidence_receipts "
|
|
155
|
-
"WHERE profile_id=? GROUP BY run_state",
|
|
156
|
-
(profile_id,),
|
|
157
|
-
).fetchall()
|
|
158
|
-
except sqlite3.Error:
|
|
159
|
-
return empty
|
|
160
|
-
finally:
|
|
161
|
-
if conn is not None:
|
|
162
|
-
conn.close()
|
|
163
|
-
return {
|
|
164
|
-
"is_real": True,
|
|
165
|
-
"availability": "available",
|
|
166
|
-
"total": int(total),
|
|
167
|
-
"by_run_state": {str(k): int(v) for k, v in rows},
|
|
168
|
-
"demonstrations": int(demo),
|
|
169
|
-
"control_plane": "observation_only",
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def _validate(payload: dict[str, Any]) -> None:
|
|
174
|
-
required = {
|
|
175
|
-
"contract",
|
|
176
|
-
"profile_id",
|
|
177
|
-
"workspace_id",
|
|
178
|
-
"run_ref",
|
|
179
|
-
"run_id",
|
|
180
|
-
"outcome",
|
|
181
|
-
"run_state",
|
|
182
|
-
"demonstration",
|
|
183
|
-
"eligible_for_learning",
|
|
184
|
-
"terminal_at",
|
|
185
|
-
"graph_digest",
|
|
186
|
-
"plan_digest",
|
|
187
|
-
"policy_digest",
|
|
188
|
-
"receipt",
|
|
189
|
-
"nodes",
|
|
190
|
-
}
|
|
191
|
-
if set(payload) != required:
|
|
192
|
-
raise ExternalEvidenceValidationError("external evidence fields do not match v1")
|
|
193
|
-
if payload["contract"] != _CONTRACT:
|
|
194
|
-
raise ExternalEvidenceValidationError("unsupported external evidence contract")
|
|
195
|
-
for name in ("profile_id", "run_ref", "run_id"):
|
|
196
|
-
if not isinstance(payload[name], str) or not _IDENTIFIER.match(payload[name]):
|
|
197
|
-
raise ExternalEvidenceValidationError(f"{name} must be a safe identifier")
|
|
198
|
-
for name in ("workspace_id", "graph_digest", "plan_digest", "policy_digest"):
|
|
199
|
-
if not isinstance(payload[name], str) or not _SHA256.match(payload[name]):
|
|
200
|
-
raise ExternalEvidenceValidationError(f"{name} must be a sha256 digest")
|
|
201
|
-
if payload["outcome"] not in _OUTCOMES or payload["run_state"] not in _RUN_STATES:
|
|
202
|
-
raise ExternalEvidenceValidationError("outcome or run_state is unsupported")
|
|
203
|
-
if payload["run_state"] == "SUCCEEDED" and payload["outcome"] != "SUCCEEDED":
|
|
204
|
-
raise ExternalEvidenceValidationError("SUCCEEDED run_state must keep its outcome")
|
|
205
|
-
if (
|
|
206
|
-
not isinstance(payload["terminal_at"], str)
|
|
207
|
-
or len(payload["terminal_at"].encode("utf-8")) > _MAX_TIMESTAMP_BYTES
|
|
208
|
-
):
|
|
209
|
-
raise ExternalEvidenceValidationError("terminal_at must be an RFC3339 timestamp")
|
|
210
|
-
try:
|
|
211
|
-
datetime.fromisoformat(payload["terminal_at"].replace("Z", "+00:00"))
|
|
212
|
-
except ValueError as exc:
|
|
213
|
-
raise ExternalEvidenceValidationError("terminal_at must be an RFC3339 timestamp") from exc
|
|
214
|
-
if (
|
|
215
|
-
not isinstance(payload["demonstration"], bool)
|
|
216
|
-
or payload["eligible_for_learning"] is not False
|
|
217
|
-
):
|
|
218
|
-
raise ExternalEvidenceValidationError("v1 evidence is observation-only")
|
|
219
|
-
receipt = payload["receipt"]
|
|
220
|
-
if not isinstance(receipt, dict) or set(receipt) != {
|
|
221
|
-
"sequence",
|
|
222
|
-
"head_digest",
|
|
223
|
-
"trust",
|
|
224
|
-
}:
|
|
225
|
-
raise ExternalEvidenceValidationError("receipt shape is invalid")
|
|
226
|
-
if (
|
|
227
|
-
not isinstance(receipt["sequence"], int)
|
|
228
|
-
or receipt["sequence"] < 1
|
|
229
|
-
or receipt["sequence"] > _MAX_RECEIPT_SEQUENCE
|
|
230
|
-
or receipt["trust"] != "local_hash_chain_only"
|
|
231
|
-
):
|
|
232
|
-
raise ExternalEvidenceValidationError("receipt metadata is invalid")
|
|
233
|
-
if not isinstance(receipt["head_digest"], str) or not _SHA256.match(receipt["head_digest"]):
|
|
234
|
-
raise ExternalEvidenceValidationError("receipt head digest is invalid")
|
|
235
|
-
if not isinstance(payload["nodes"], list):
|
|
236
|
-
raise ExternalEvidenceValidationError("nodes must be a list")
|
|
237
|
-
if len(payload["nodes"]) > _MAX_NODES:
|
|
238
|
-
raise ExternalEvidenceValidationError("node count exceeds v1 safety limit")
|
|
239
|
-
artifact_count = 0
|
|
240
|
-
for node in payload["nodes"]:
|
|
241
|
-
if not isinstance(node, dict) or set(node) != {
|
|
242
|
-
"node_id",
|
|
243
|
-
"state",
|
|
244
|
-
"gate_passed",
|
|
245
|
-
"attempts",
|
|
246
|
-
"artifact_digests",
|
|
247
|
-
}:
|
|
248
|
-
raise ExternalEvidenceValidationError("node shape is invalid")
|
|
249
|
-
valid_node = _IDENTIFIER.match(str(node["node_id"])) and _IDENTIFIER.match(
|
|
250
|
-
str(node["state"])
|
|
251
|
-
)
|
|
252
|
-
if not valid_node:
|
|
253
|
-
raise ExternalEvidenceValidationError("node identifiers are invalid")
|
|
254
|
-
if (
|
|
255
|
-
node["gate_passed"] not in (True, False, None)
|
|
256
|
-
or not isinstance(node["attempts"], int)
|
|
257
|
-
or node["attempts"] < 1
|
|
258
|
-
):
|
|
259
|
-
raise ExternalEvidenceValidationError("node gate metadata is invalid")
|
|
260
|
-
if not isinstance(node["artifact_digests"], list) or any(
|
|
261
|
-
not isinstance(item, str) or not _SHA256.match(item)
|
|
262
|
-
for item in node["artifact_digests"]
|
|
263
|
-
):
|
|
264
|
-
raise ExternalEvidenceValidationError("node artifact digests are invalid")
|
|
265
|
-
if len(node["artifact_digests"]) > _MAX_ARTIFACTS_PER_NODE:
|
|
266
|
-
raise ExternalEvidenceValidationError("node artifact count exceeds v1 safety limit")
|
|
267
|
-
artifact_count += len(node["artifact_digests"])
|
|
268
|
-
if artifact_count > _MAX_ARTIFACTS_TOTAL:
|
|
269
|
-
raise ExternalEvidenceValidationError("artifact count exceeds v1 safety limit")
|
|
270
|
-
if len(_json(payload["nodes"]).encode("utf-8")) > _MAX_NODES_JSON_BYTES:
|
|
271
|
-
raise ExternalEvidenceValidationError("node evidence exceeds v1 size limit")
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
def _row(payload: dict[str, Any], digest: str) -> tuple[Any, ...]:
|
|
275
|
-
artifacts = sorted({item for node in payload["nodes"] for item in node["artifact_digests"]})
|
|
276
|
-
receipt = payload["receipt"]
|
|
277
|
-
return (
|
|
278
|
-
payload["profile_id"],
|
|
279
|
-
payload["contract"],
|
|
280
|
-
payload["workspace_id"],
|
|
281
|
-
payload["run_ref"],
|
|
282
|
-
payload["run_id"],
|
|
283
|
-
payload["outcome"],
|
|
284
|
-
payload["run_state"],
|
|
285
|
-
int(payload["demonstration"]),
|
|
286
|
-
0,
|
|
287
|
-
payload["terminal_at"],
|
|
288
|
-
payload["graph_digest"],
|
|
289
|
-
payload["plan_digest"],
|
|
290
|
-
payload["policy_digest"],
|
|
291
|
-
receipt["sequence"],
|
|
292
|
-
receipt["head_digest"],
|
|
293
|
-
receipt["trust"],
|
|
294
|
-
_json(payload["nodes"]),
|
|
295
|
-
_json(artifacts),
|
|
296
|
-
digest,
|
|
297
|
-
datetime.now(timezone.utc).isoformat(),
|
|
298
|
-
)
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
def _assert_profile_open(conn: sqlite3.Connection, profile_id: str) -> None:
|
|
302
|
-
"""Use M040's durable tombstone inside this writer transaction."""
|
|
303
|
-
table = conn.execute(
|
|
304
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' "
|
|
305
|
-
"AND name='agent_receipt_profile_closures'"
|
|
306
|
-
).fetchone()
|
|
307
|
-
if (
|
|
308
|
-
table is not None
|
|
309
|
-
and conn.execute(
|
|
310
|
-
"SELECT 1 FROM agent_receipt_profile_closures WHERE profile_id=?", (profile_id,)
|
|
311
|
-
).fetchone()
|
|
312
|
-
is not None
|
|
313
|
-
):
|
|
314
|
-
raise ProfileAdmissionError("profile is inactive or closing for erasure")
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
def _get_conn(
|
|
318
|
-
conn: sqlite3.Connection,
|
|
319
|
-
profile_id: str,
|
|
320
|
-
contract_id: str,
|
|
321
|
-
workspace_id: str,
|
|
322
|
-
run_ref: str,
|
|
323
|
-
) -> dict[str, Any] | None:
|
|
324
|
-
row = conn.execute(
|
|
325
|
-
"SELECT * FROM external_evidence_receipts WHERE profile_id=? AND contract_id=? "
|
|
326
|
-
"AND workspace_id=? AND run_ref=?",
|
|
327
|
-
(profile_id, contract_id, workspace_id, run_ref),
|
|
328
|
-
).fetchone()
|
|
329
|
-
if row is None:
|
|
330
|
-
return None
|
|
331
|
-
return {
|
|
332
|
-
"contract": row["contract_id"],
|
|
333
|
-
"profile_id": row["profile_id"],
|
|
334
|
-
"workspace_id": row["workspace_id"],
|
|
335
|
-
"run_ref": row["run_ref"],
|
|
336
|
-
"run_id": row["run_id"],
|
|
337
|
-
"outcome": row["outcome"],
|
|
338
|
-
"run_state": row["run_state"],
|
|
339
|
-
"demonstration": bool(row["demonstration"]),
|
|
340
|
-
"eligible_for_learning": bool(row["eligible_for_learning"]),
|
|
341
|
-
"terminal_at": row["terminal_at"],
|
|
342
|
-
"graph_digest": row["graph_digest"],
|
|
343
|
-
"plan_digest": row["plan_digest"],
|
|
344
|
-
"policy_digest": row["policy_digest"],
|
|
345
|
-
"receipt": {
|
|
346
|
-
"sequence": row["receipt_sequence"],
|
|
347
|
-
"head_digest": row["receipt_head_digest"],
|
|
348
|
-
"trust": row["receipt_trust"],
|
|
349
|
-
},
|
|
350
|
-
"nodes": json.loads(row["nodes_json"]),
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def _payload_digest(payload: dict[str, Any]) -> str:
|
|
355
|
-
return hashlib.sha256(_json(payload).encode("utf-8")).hexdigest()
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
def _json(value: Any) -> str:
|
|
359
|
-
return json.dumps(value, ensure_ascii=False, separators=(",", ":"), sort_keys=True)
|