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,619 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Evolution Store — SQLite persistence for skill evolution history.
|
|
6
|
-
|
|
7
|
-
Stores evolution records, lineage DAG, and anti-loop state.
|
|
8
|
-
Uses the same memory.db as the rest of SLM — no separate database.
|
|
9
|
-
|
|
10
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
import hashlib
|
|
16
|
-
import json
|
|
17
|
-
import logging
|
|
18
|
-
import sqlite3
|
|
19
|
-
import warnings
|
|
20
|
-
from datetime import datetime, timezone
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
from typing import Optional
|
|
23
|
-
|
|
24
|
-
from superlocalmemory.evolution.types import (
|
|
25
|
-
EvolutionCandidate,
|
|
26
|
-
EvolutionRecord,
|
|
27
|
-
EvolutionStatus,
|
|
28
|
-
EvolutionType,
|
|
29
|
-
TriggerType,
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
logger = logging.getLogger(__name__)
|
|
33
|
-
|
|
34
|
-
_SCHEMA_DDL = """
|
|
35
|
-
CREATE TABLE IF NOT EXISTS skill_evolution_log (
|
|
36
|
-
id TEXT PRIMARY KEY,
|
|
37
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
38
|
-
skill_name TEXT NOT NULL,
|
|
39
|
-
parent_skill_id TEXT,
|
|
40
|
-
evolution_type TEXT NOT NULL,
|
|
41
|
-
trigger_type TEXT NOT NULL,
|
|
42
|
-
generation INTEGER DEFAULT 0,
|
|
43
|
-
status TEXT DEFAULT 'candidate',
|
|
44
|
-
mutation_summary TEXT DEFAULT '',
|
|
45
|
-
evidence TEXT DEFAULT '[]',
|
|
46
|
-
original_content TEXT DEFAULT '',
|
|
47
|
-
evolved_content TEXT DEFAULT '',
|
|
48
|
-
content_diff TEXT DEFAULT '',
|
|
49
|
-
blind_verified INTEGER DEFAULT 0,
|
|
50
|
-
rejection_reason TEXT DEFAULT '',
|
|
51
|
-
created_at TEXT NOT NULL,
|
|
52
|
-
completed_at TEXT
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
CREATE INDEX IF NOT EXISTS idx_evo_skill ON skill_evolution_log(profile_id, skill_name);
|
|
56
|
-
CREATE INDEX IF NOT EXISTS idx_evo_status ON skill_evolution_log(profile_id, status);
|
|
57
|
-
CREATE INDEX IF NOT EXISTS idx_evo_created ON skill_evolution_log(profile_id, created_at);
|
|
58
|
-
|
|
59
|
-
CREATE TABLE IF NOT EXISTS evolution_cycle_state (
|
|
60
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
61
|
-
key TEXT NOT NULL,
|
|
62
|
-
value INTEGER DEFAULT 0,
|
|
63
|
-
updated_at TEXT,
|
|
64
|
-
PRIMARY KEY (profile_id, key)
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
-- Phase 2: append-only status-transition log (LLD Decision B2).
|
|
68
|
-
-- Each state change for a record produces one new row here.
|
|
69
|
-
-- The BEFORE UPDATE trigger enforces immutability at the DB layer.
|
|
70
|
-
CREATE TABLE IF NOT EXISTS skill_evolution_transitions (
|
|
71
|
-
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
72
|
-
record_id TEXT NOT NULL,
|
|
73
|
-
profile_id TEXT NOT NULL DEFAULT 'default',
|
|
74
|
-
from_status TEXT NOT NULL,
|
|
75
|
-
to_status TEXT NOT NULL,
|
|
76
|
-
transitioned_at TEXT NOT NULL,
|
|
77
|
-
actor_id TEXT DEFAULT '',
|
|
78
|
-
reason TEXT DEFAULT '',
|
|
79
|
-
prev_hash TEXT DEFAULT '',
|
|
80
|
-
transition_hash TEXT NOT NULL,
|
|
81
|
-
metadata TEXT DEFAULT '{}'
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
CREATE INDEX IF NOT EXISTS idx_evo_trans_record
|
|
85
|
-
ON skill_evolution_transitions(record_id, seq);
|
|
86
|
-
|
|
87
|
-
CREATE INDEX IF NOT EXISTS idx_evo_trans_profile
|
|
88
|
-
ON skill_evolution_transitions(profile_id, transitioned_at);
|
|
89
|
-
|
|
90
|
-
-- DB-enforced append-only: any UPDATE on this table is a bug (LLD Decision B2).
|
|
91
|
-
CREATE TRIGGER IF NOT EXISTS no_update_evo_transitions
|
|
92
|
-
BEFORE UPDATE ON skill_evolution_transitions
|
|
93
|
-
BEGIN
|
|
94
|
-
SELECT RAISE(ABORT, 'skill_evolution_transitions is append-only');
|
|
95
|
-
END;
|
|
96
|
-
|
|
97
|
-
-- Audit P1-3: DELETE must also be forbidden — otherwise the hash chain can be
|
|
98
|
-
-- silently truncated/erased without a DB abort, breaking the immutable-log claim.
|
|
99
|
-
CREATE TRIGGER IF NOT EXISTS no_delete_evo_transitions
|
|
100
|
-
BEFORE DELETE ON skill_evolution_transitions
|
|
101
|
-
BEGIN
|
|
102
|
-
SELECT RAISE(ABORT, 'skill_evolution_transitions is append-only');
|
|
103
|
-
END;
|
|
104
|
-
"""
|
|
105
|
-
|
|
106
|
-
# Anti-loop budget
|
|
107
|
-
MAX_EVOLUTIONS_PER_CYCLE = 3
|
|
108
|
-
MAX_ATTEMPTS_PER_SKILL = 3
|
|
109
|
-
MIN_FRESH_INVOCATIONS = 5
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
class EvolutionStore:
|
|
113
|
-
"""SQLite persistence for evolution history and anti-loop state."""
|
|
114
|
-
|
|
115
|
-
def __init__(self, db_path: str | Path):
|
|
116
|
-
self._db_path = str(db_path)
|
|
117
|
-
self._ensure_schema()
|
|
118
|
-
self._addressed_degradations: dict[str, set[str]] = {}
|
|
119
|
-
|
|
120
|
-
def _ensure_schema(self) -> None:
|
|
121
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
122
|
-
try:
|
|
123
|
-
# Migrate an existing pre-isolation DB BEFORE running the schema DDL:
|
|
124
|
-
# the DDL creates indexes on profile_id, which would fail on a legacy
|
|
125
|
-
# table that still lacks the column. On a fresh DB the migration is a
|
|
126
|
-
# no-op (tables absent) and the DDL creates everything correctly.
|
|
127
|
-
self._migrate_profile_isolation(conn)
|
|
128
|
-
conn.executescript(_SCHEMA_DDL)
|
|
129
|
-
conn.commit()
|
|
130
|
-
except sqlite3.OperationalError as exc:
|
|
131
|
-
logger.warning("Evolution schema creation failed: %s", exc)
|
|
132
|
-
finally:
|
|
133
|
-
conn.close()
|
|
134
|
-
|
|
135
|
-
def _migrate_profile_isolation(self, conn: sqlite3.Connection) -> None:
|
|
136
|
-
"""Self-migrate pre-profile-isolation DBs to add per-profile scoping.
|
|
137
|
-
|
|
138
|
-
These tables are store-owned (created lazily here, not by the schema
|
|
139
|
-
migration runner which fires before this store exists), so the store
|
|
140
|
-
owns their upgrade too. Idempotent: only alters when the column/PK is
|
|
141
|
-
missing. Existing rows backfill to 'default' — the historical profile.
|
|
142
|
-
"""
|
|
143
|
-
# skill_evolution_log: additive column (safe, preserves rows).
|
|
144
|
-
cols = {r[1] for r in conn.execute(
|
|
145
|
-
"PRAGMA table_info(skill_evolution_log)").fetchall()}
|
|
146
|
-
if cols and "profile_id" not in cols:
|
|
147
|
-
conn.execute(
|
|
148
|
-
"ALTER TABLE skill_evolution_log "
|
|
149
|
-
"ADD COLUMN profile_id TEXT NOT NULL DEFAULT 'default'"
|
|
150
|
-
)
|
|
151
|
-
conn.execute(
|
|
152
|
-
"CREATE INDEX IF NOT EXISTS idx_evo_skill "
|
|
153
|
-
"ON skill_evolution_log(profile_id, skill_name)"
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
# evolution_cycle_state: PK changes from (key) to (profile_id, key).
|
|
157
|
-
# SQLite cannot alter a PK in place → rebuild + copy, backfilling
|
|
158
|
-
# existing counters to the 'default' profile.
|
|
159
|
-
cyc_cols = {r[1] for r in conn.execute(
|
|
160
|
-
"PRAGMA table_info(evolution_cycle_state)").fetchall()}
|
|
161
|
-
if cyc_cols and "profile_id" not in cyc_cols:
|
|
162
|
-
conn.execute(
|
|
163
|
-
"ALTER TABLE evolution_cycle_state RENAME TO _evo_cycle_old"
|
|
164
|
-
)
|
|
165
|
-
conn.execute(
|
|
166
|
-
"CREATE TABLE evolution_cycle_state ("
|
|
167
|
-
" profile_id TEXT NOT NULL DEFAULT 'default',"
|
|
168
|
-
" key TEXT NOT NULL,"
|
|
169
|
-
" value INTEGER DEFAULT 0,"
|
|
170
|
-
" updated_at TEXT,"
|
|
171
|
-
" PRIMARY KEY (profile_id, key))"
|
|
172
|
-
)
|
|
173
|
-
conn.execute(
|
|
174
|
-
"INSERT INTO evolution_cycle_state "
|
|
175
|
-
"(profile_id, key, value, updated_at) "
|
|
176
|
-
"SELECT 'default', key, value, updated_at FROM _evo_cycle_old"
|
|
177
|
-
)
|
|
178
|
-
conn.execute("DROP TABLE _evo_cycle_old")
|
|
179
|
-
|
|
180
|
-
def reset_cycle(self, profile_id: str) -> None:
|
|
181
|
-
"""Reset per-cycle counters for one profile. Called at cycle start.
|
|
182
|
-
|
|
183
|
-
The evolve budget is per-profile: one profile exhausting its budget
|
|
184
|
-
must never block another profile from evolving.
|
|
185
|
-
"""
|
|
186
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
187
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
188
|
-
try:
|
|
189
|
-
conn.execute(
|
|
190
|
-
"INSERT OR REPLACE INTO evolution_cycle_state "
|
|
191
|
-
"(profile_id, key, value, updated_at) "
|
|
192
|
-
"VALUES (?, 'cycle_count', 0, ?)",
|
|
193
|
-
(profile_id, now),
|
|
194
|
-
)
|
|
195
|
-
conn.commit()
|
|
196
|
-
finally:
|
|
197
|
-
conn.close()
|
|
198
|
-
|
|
199
|
-
def can_evolve(self, profile_id: str) -> bool:
|
|
200
|
-
"""Check if this profile's budget allows another evolution this cycle."""
|
|
201
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
202
|
-
try:
|
|
203
|
-
row = conn.execute(
|
|
204
|
-
"SELECT value FROM evolution_cycle_state "
|
|
205
|
-
"WHERE profile_id = ? AND key = 'cycle_count'",
|
|
206
|
-
(profile_id,),
|
|
207
|
-
).fetchone()
|
|
208
|
-
count = row[0] if row else 0
|
|
209
|
-
return count < MAX_EVOLUTIONS_PER_CYCLE
|
|
210
|
-
finally:
|
|
211
|
-
conn.close()
|
|
212
|
-
|
|
213
|
-
def record_evolution_attempt(self, profile_id: str) -> None:
|
|
214
|
-
"""Increment this profile's cycle counter in DB."""
|
|
215
|
-
now = datetime.now(timezone.utc).isoformat()
|
|
216
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
217
|
-
try:
|
|
218
|
-
row = conn.execute(
|
|
219
|
-
"SELECT value FROM evolution_cycle_state "
|
|
220
|
-
"WHERE profile_id = ? AND key = 'cycle_count'",
|
|
221
|
-
(profile_id,),
|
|
222
|
-
).fetchone()
|
|
223
|
-
current = row[0] if row else 0
|
|
224
|
-
conn.execute(
|
|
225
|
-
"INSERT OR REPLACE INTO evolution_cycle_state "
|
|
226
|
-
"(profile_id, key, value, updated_at) "
|
|
227
|
-
"VALUES (?, 'cycle_count', ?, ?)",
|
|
228
|
-
(profile_id, current + 1, now),
|
|
229
|
-
)
|
|
230
|
-
conn.commit()
|
|
231
|
-
finally:
|
|
232
|
-
conn.close()
|
|
233
|
-
|
|
234
|
-
def _get_cycle_count(self, profile_id: str) -> int:
|
|
235
|
-
"""Read this profile's current cycle count from DB."""
|
|
236
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
237
|
-
try:
|
|
238
|
-
row = conn.execute(
|
|
239
|
-
"SELECT value FROM evolution_cycle_state "
|
|
240
|
-
"WHERE profile_id = ? AND key = 'cycle_count'",
|
|
241
|
-
(profile_id,),
|
|
242
|
-
).fetchone()
|
|
243
|
-
return row[0] if row else 0
|
|
244
|
-
finally:
|
|
245
|
-
conn.close()
|
|
246
|
-
|
|
247
|
-
# ------------------------------------------------------------------
|
|
248
|
-
# Anti-loop: addressed degradations (adopted from OpenSpace)
|
|
249
|
-
# ------------------------------------------------------------------
|
|
250
|
-
|
|
251
|
-
def is_addressed(self, skill_name: str, context_hash: str) -> bool:
|
|
252
|
-
return context_hash in self._addressed_degradations.get(skill_name, set())
|
|
253
|
-
|
|
254
|
-
def mark_addressed(self, skill_name: str, context_hash: str) -> None:
|
|
255
|
-
self._addressed_degradations.setdefault(skill_name, set()).add(context_hash)
|
|
256
|
-
|
|
257
|
-
def prune_recovered(self, active_degraded_skills: set[str]) -> None:
|
|
258
|
-
"""Remove tracking for skills that recovered."""
|
|
259
|
-
recovered = [
|
|
260
|
-
k for k in self._addressed_degradations
|
|
261
|
-
if k not in active_degraded_skills
|
|
262
|
-
]
|
|
263
|
-
for k in recovered:
|
|
264
|
-
del self._addressed_degradations[k]
|
|
265
|
-
|
|
266
|
-
# ------------------------------------------------------------------
|
|
267
|
-
# Phase 2: append-only transition log
|
|
268
|
-
# ------------------------------------------------------------------
|
|
269
|
-
|
|
270
|
-
def insert_record(self, record: EvolutionRecord, profile_id: str) -> None:
|
|
271
|
-
"""INSERT a new evolution record (CANDIDATE status).
|
|
272
|
-
|
|
273
|
-
Unlike save_record, this uses plain INSERT — NOT INSERT OR REPLACE.
|
|
274
|
-
Raises sqlite3.IntegrityError if a row with the same id already exists.
|
|
275
|
-
Call this exactly once per candidate (CRIT-1: never reuse record_id).
|
|
276
|
-
"""
|
|
277
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
278
|
-
try:
|
|
279
|
-
conn.execute(
|
|
280
|
-
"INSERT INTO skill_evolution_log "
|
|
281
|
-
"(id, profile_id, skill_name, parent_skill_id, evolution_type, "
|
|
282
|
-
" trigger_type, generation, status, mutation_summary, evidence, "
|
|
283
|
-
" original_content, evolved_content, content_diff, "
|
|
284
|
-
" blind_verified, rejection_reason, created_at, completed_at) "
|
|
285
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
286
|
-
(
|
|
287
|
-
record.id,
|
|
288
|
-
profile_id,
|
|
289
|
-
record.skill_name,
|
|
290
|
-
record.parent_skill_id,
|
|
291
|
-
record.evolution_type.value,
|
|
292
|
-
record.trigger.value,
|
|
293
|
-
record.generation,
|
|
294
|
-
record.status.value,
|
|
295
|
-
record.mutation_summary,
|
|
296
|
-
json.dumps(list(record.evidence)),
|
|
297
|
-
record.original_content,
|
|
298
|
-
record.evolved_content,
|
|
299
|
-
record.content_diff,
|
|
300
|
-
1 if record.blind_verified else 0,
|
|
301
|
-
record.rejection_reason,
|
|
302
|
-
record.created_at,
|
|
303
|
-
record.completed_at,
|
|
304
|
-
),
|
|
305
|
-
)
|
|
306
|
-
conn.commit()
|
|
307
|
-
finally:
|
|
308
|
-
conn.close()
|
|
309
|
-
|
|
310
|
-
def append_transition(
|
|
311
|
-
self,
|
|
312
|
-
record_id: str,
|
|
313
|
-
profile_id: str,
|
|
314
|
-
from_status: EvolutionStatus,
|
|
315
|
-
to_status: EvolutionStatus,
|
|
316
|
-
*,
|
|
317
|
-
actor_id: str = "",
|
|
318
|
-
reason: str = "",
|
|
319
|
-
metadata: dict | None = None,
|
|
320
|
-
) -> str:
|
|
321
|
-
"""Append an immutable status-transition row. Returns transition_hash.
|
|
322
|
-
|
|
323
|
-
Hash linkage (audit P2-3): transition_hash = SHA-256 over a canonical,
|
|
324
|
-
pipe-delimited payload covering EVERY persisted field —
|
|
325
|
-
``prev_hash | record_id | from_status | to_status | ts | actor_id |
|
|
326
|
-
reason | metadata_str``. Delimiters remove concatenation ambiguity and
|
|
327
|
-
including reason+metadata makes those columns tamper-evident too.
|
|
328
|
-
|
|
329
|
-
prev_hash is the transition_hash of the most recent row for this
|
|
330
|
-
record_id, or 'genesis' for the first transition.
|
|
331
|
-
|
|
332
|
-
Concurrency (audit P1-5): the read-prev-then-insert is wrapped in a
|
|
333
|
-
single ``BEGIN IMMEDIATE`` transaction so two concurrent writers cannot
|
|
334
|
-
both read the same prev_hash and fork the chain.
|
|
335
|
-
|
|
336
|
-
Never calls UPDATE or DELETE. Raises ValueError if from_status == to_status.
|
|
337
|
-
"""
|
|
338
|
-
if from_status == to_status:
|
|
339
|
-
raise ValueError(
|
|
340
|
-
f"append_transition: from_status == to_status == {from_status!r}; "
|
|
341
|
-
"no-op transitions are not allowed in the append-only log."
|
|
342
|
-
)
|
|
343
|
-
ts = datetime.now(timezone.utc).isoformat()
|
|
344
|
-
metadata_str = json.dumps(metadata or {}, sort_keys=True)
|
|
345
|
-
|
|
346
|
-
# isolation_level=None + explicit BEGIN IMMEDIATE = one atomic
|
|
347
|
-
# select-prev-then-insert critical section per call (P1-5).
|
|
348
|
-
conn = sqlite3.connect(self._db_path, timeout=10, isolation_level=None)
|
|
349
|
-
try:
|
|
350
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
351
|
-
# Find prev_hash for this record_id (genesis if first)
|
|
352
|
-
row = conn.execute(
|
|
353
|
-
"SELECT transition_hash FROM skill_evolution_transitions "
|
|
354
|
-
"WHERE record_id = ? AND profile_id = ? "
|
|
355
|
-
"ORDER BY seq DESC LIMIT 1",
|
|
356
|
-
(record_id, profile_id),
|
|
357
|
-
).fetchone()
|
|
358
|
-
prev_hash = row[0] if row else "genesis"
|
|
359
|
-
|
|
360
|
-
# Canonical, delimited payload over ALL persisted fields (P2-3).
|
|
361
|
-
payload = "|".join((
|
|
362
|
-
prev_hash, record_id,
|
|
363
|
-
from_status.value, to_status.value,
|
|
364
|
-
ts, actor_id, reason, metadata_str,
|
|
365
|
-
))
|
|
366
|
-
transition_hash = hashlib.sha256(payload.encode("utf-8")).hexdigest()
|
|
367
|
-
|
|
368
|
-
conn.execute(
|
|
369
|
-
"INSERT INTO skill_evolution_transitions "
|
|
370
|
-
"(record_id, profile_id, from_status, to_status, "
|
|
371
|
-
" transitioned_at, actor_id, reason, prev_hash, "
|
|
372
|
-
" transition_hash, metadata) "
|
|
373
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
374
|
-
(
|
|
375
|
-
record_id,
|
|
376
|
-
profile_id,
|
|
377
|
-
from_status.value,
|
|
378
|
-
to_status.value,
|
|
379
|
-
ts,
|
|
380
|
-
actor_id,
|
|
381
|
-
reason,
|
|
382
|
-
prev_hash,
|
|
383
|
-
transition_hash,
|
|
384
|
-
metadata_str,
|
|
385
|
-
),
|
|
386
|
-
)
|
|
387
|
-
conn.execute("COMMIT")
|
|
388
|
-
return transition_hash
|
|
389
|
-
except Exception:
|
|
390
|
-
try:
|
|
391
|
-
conn.execute("ROLLBACK")
|
|
392
|
-
except Exception:
|
|
393
|
-
pass
|
|
394
|
-
raise
|
|
395
|
-
finally:
|
|
396
|
-
conn.close()
|
|
397
|
-
|
|
398
|
-
def get_latest_status(
|
|
399
|
-
self, record_id: str, profile_id: str,
|
|
400
|
-
) -> EvolutionStatus | None:
|
|
401
|
-
"""Return the to_status of the highest-seq transition for record_id.
|
|
402
|
-
|
|
403
|
-
Returns None if no transitions exist for this record_id / profile_id.
|
|
404
|
-
"""
|
|
405
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
406
|
-
try:
|
|
407
|
-
row = conn.execute(
|
|
408
|
-
"SELECT to_status FROM skill_evolution_transitions "
|
|
409
|
-
"WHERE record_id = ? AND profile_id = ? "
|
|
410
|
-
"ORDER BY seq DESC LIMIT 1",
|
|
411
|
-
(record_id, profile_id),
|
|
412
|
-
).fetchone()
|
|
413
|
-
if row is None:
|
|
414
|
-
return None
|
|
415
|
-
return EvolutionStatus(row[0])
|
|
416
|
-
finally:
|
|
417
|
-
conn.close()
|
|
418
|
-
|
|
419
|
-
def get_transitions(self, record_id: str, profile_id: str) -> list[dict]:
|
|
420
|
-
"""Return all transition rows for record_id ordered by seq ASC."""
|
|
421
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
422
|
-
conn.row_factory = sqlite3.Row
|
|
423
|
-
try:
|
|
424
|
-
rows = conn.execute(
|
|
425
|
-
"SELECT seq, record_id, profile_id, from_status, to_status, "
|
|
426
|
-
"transitioned_at, actor_id, reason, prev_hash, transition_hash, "
|
|
427
|
-
"metadata "
|
|
428
|
-
"FROM skill_evolution_transitions "
|
|
429
|
-
"WHERE record_id = ? AND profile_id = ? "
|
|
430
|
-
"ORDER BY seq ASC",
|
|
431
|
-
(record_id, profile_id),
|
|
432
|
-
).fetchall()
|
|
433
|
-
return [dict(r) for r in rows]
|
|
434
|
-
finally:
|
|
435
|
-
conn.close()
|
|
436
|
-
|
|
437
|
-
# ------------------------------------------------------------------
|
|
438
|
-
# CRUD
|
|
439
|
-
# ------------------------------------------------------------------
|
|
440
|
-
|
|
441
|
-
def save_record(self, record: EvolutionRecord, profile_id: str) -> None:
|
|
442
|
-
"""DEPRECATED: use insert_record() for new records and append_transition() for state changes.
|
|
443
|
-
|
|
444
|
-
Retained for backward-compatibility with existing tests and callers.
|
|
445
|
-
Uses INSERT OR REPLACE — mutable semantics, not append-only.
|
|
446
|
-
Will be removed in a future cleanup pass (not Phase 2 scope).
|
|
447
|
-
"""
|
|
448
|
-
warnings.warn(
|
|
449
|
-
"EvolutionStore.save_record() is deprecated; "
|
|
450
|
-
"use insert_record() + append_transition() instead.",
|
|
451
|
-
DeprecationWarning,
|
|
452
|
-
stacklevel=2,
|
|
453
|
-
)
|
|
454
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
455
|
-
try:
|
|
456
|
-
conn.execute(
|
|
457
|
-
"INSERT OR REPLACE INTO skill_evolution_log "
|
|
458
|
-
"(id, profile_id, skill_name, parent_skill_id, evolution_type, "
|
|
459
|
-
" trigger_type, generation, status, mutation_summary, evidence, "
|
|
460
|
-
" original_content, evolved_content, content_diff, "
|
|
461
|
-
" blind_verified, rejection_reason, created_at, completed_at) "
|
|
462
|
-
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
463
|
-
(
|
|
464
|
-
record.id,
|
|
465
|
-
profile_id,
|
|
466
|
-
record.skill_name,
|
|
467
|
-
record.parent_skill_id,
|
|
468
|
-
record.evolution_type.value,
|
|
469
|
-
record.trigger.value,
|
|
470
|
-
record.generation,
|
|
471
|
-
record.status.value,
|
|
472
|
-
record.mutation_summary,
|
|
473
|
-
json.dumps(list(record.evidence)),
|
|
474
|
-
record.original_content,
|
|
475
|
-
record.evolved_content,
|
|
476
|
-
record.content_diff,
|
|
477
|
-
1 if record.blind_verified else 0,
|
|
478
|
-
record.rejection_reason,
|
|
479
|
-
record.created_at,
|
|
480
|
-
record.completed_at,
|
|
481
|
-
),
|
|
482
|
-
)
|
|
483
|
-
conn.commit()
|
|
484
|
-
finally:
|
|
485
|
-
conn.close()
|
|
486
|
-
|
|
487
|
-
def get_record(self, record_id: str, profile_id: str) -> Optional[EvolutionRecord]:
|
|
488
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
489
|
-
conn.row_factory = sqlite3.Row
|
|
490
|
-
try:
|
|
491
|
-
row = conn.execute(
|
|
492
|
-
"SELECT * FROM skill_evolution_log "
|
|
493
|
-
"WHERE id = ? AND profile_id = ?",
|
|
494
|
-
(record_id, profile_id),
|
|
495
|
-
).fetchone()
|
|
496
|
-
if not row:
|
|
497
|
-
return None
|
|
498
|
-
return self._row_to_record(dict(row))
|
|
499
|
-
finally:
|
|
500
|
-
conn.close()
|
|
501
|
-
|
|
502
|
-
def get_skill_history(
|
|
503
|
-
self, skill_name: str, profile_id: str, limit: int = 20,
|
|
504
|
-
) -> list[EvolutionRecord]:
|
|
505
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
506
|
-
conn.row_factory = sqlite3.Row
|
|
507
|
-
try:
|
|
508
|
-
rows = conn.execute(
|
|
509
|
-
"SELECT * FROM skill_evolution_log "
|
|
510
|
-
"WHERE skill_name = ? AND profile_id = ? "
|
|
511
|
-
"ORDER BY created_at DESC LIMIT ?",
|
|
512
|
-
(skill_name, profile_id, limit),
|
|
513
|
-
).fetchall()
|
|
514
|
-
return [self._row_to_record(dict(r)) for r in rows]
|
|
515
|
-
finally:
|
|
516
|
-
conn.close()
|
|
517
|
-
|
|
518
|
-
def get_recent(self, profile_id: str, limit: int = 10) -> list[EvolutionRecord]:
|
|
519
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
520
|
-
conn.row_factory = sqlite3.Row
|
|
521
|
-
try:
|
|
522
|
-
rows = conn.execute(
|
|
523
|
-
"SELECT * FROM skill_evolution_log "
|
|
524
|
-
"WHERE profile_id = ? ORDER BY created_at DESC LIMIT ?",
|
|
525
|
-
(profile_id, limit),
|
|
526
|
-
).fetchall()
|
|
527
|
-
return [self._row_to_record(dict(r)) for r in rows]
|
|
528
|
-
finally:
|
|
529
|
-
conn.close()
|
|
530
|
-
|
|
531
|
-
def count_attempts(self, skill_name: str, profile_id: str) -> int:
|
|
532
|
-
"""Count non-successful evolution attempts for a skill.
|
|
533
|
-
|
|
534
|
-
Audit P0-2: with the Phase-2 append-only model, ``skill_evolution_log``
|
|
535
|
-
rows are frozen at 'candidate' by ``insert_record`` and never updated, so
|
|
536
|
-
the legacy ``status NOT IN ('promoted')`` filter counted successes too —
|
|
537
|
-
permanently disabling a skill after MAX_ATTEMPTS_PER_SKILL improvements.
|
|
538
|
-
The current status is now read from the append-only transitions log
|
|
539
|
-
(latest ``to_status`` per record), and success states are excluded,
|
|
540
|
-
mirroring the pre-Phase-2 exclusion of 'promoted'. Legacy rows with no
|
|
541
|
-
transitions fall back to their frozen log status via COALESCE.
|
|
542
|
-
"""
|
|
543
|
-
success = ("promoted", "verified_quarantined", "approved", "active")
|
|
544
|
-
marks = ",".join("?" for _ in success)
|
|
545
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
546
|
-
try:
|
|
547
|
-
row = conn.execute(
|
|
548
|
-
"SELECT COUNT(*) FROM skill_evolution_log l "
|
|
549
|
-
"WHERE l.skill_name = ? AND l.profile_id = ? "
|
|
550
|
-
"AND COALESCE("
|
|
551
|
-
" (SELECT t.to_status FROM skill_evolution_transitions t "
|
|
552
|
-
" WHERE t.record_id = l.id AND t.profile_id = l.profile_id "
|
|
553
|
-
" ORDER BY t.seq DESC LIMIT 1), l.status"
|
|
554
|
-
f") NOT IN ({marks})",
|
|
555
|
-
(skill_name, profile_id, *success),
|
|
556
|
-
).fetchone()
|
|
557
|
-
return row[0] if row else 0
|
|
558
|
-
finally:
|
|
559
|
-
conn.close()
|
|
560
|
-
|
|
561
|
-
def has_exceeded_attempts(self, skill_name: str, profile_id: str) -> bool:
|
|
562
|
-
return self.count_attempts(skill_name, profile_id) >= MAX_ATTEMPTS_PER_SKILL
|
|
563
|
-
|
|
564
|
-
def get_stats(self, profile_id: str) -> dict:
|
|
565
|
-
conn = sqlite3.connect(self._db_path, timeout=10)
|
|
566
|
-
try:
|
|
567
|
-
total = conn.execute(
|
|
568
|
-
"SELECT COUNT(*) FROM skill_evolution_log WHERE profile_id = ?",
|
|
569
|
-
(profile_id,),
|
|
570
|
-
).fetchone()[0]
|
|
571
|
-
by_status = {}
|
|
572
|
-
for row in conn.execute(
|
|
573
|
-
"SELECT status, COUNT(*) FROM skill_evolution_log "
|
|
574
|
-
"WHERE profile_id = ? GROUP BY status",
|
|
575
|
-
(profile_id,),
|
|
576
|
-
).fetchall():
|
|
577
|
-
by_status[row[0]] = row[1]
|
|
578
|
-
by_type = {}
|
|
579
|
-
for row in conn.execute(
|
|
580
|
-
"SELECT evolution_type, COUNT(*) FROM skill_evolution_log "
|
|
581
|
-
"WHERE profile_id = ? GROUP BY evolution_type",
|
|
582
|
-
(profile_id,),
|
|
583
|
-
).fetchall():
|
|
584
|
-
by_type[row[0]] = row[1]
|
|
585
|
-
return {
|
|
586
|
-
"total": total,
|
|
587
|
-
"by_status": by_status,
|
|
588
|
-
"by_type": by_type,
|
|
589
|
-
"cycle_budget_remaining":
|
|
590
|
-
MAX_EVOLUTIONS_PER_CYCLE - self._get_cycle_count(profile_id),
|
|
591
|
-
}
|
|
592
|
-
finally:
|
|
593
|
-
conn.close()
|
|
594
|
-
|
|
595
|
-
def _row_to_record(self, row: dict) -> EvolutionRecord:
|
|
596
|
-
evidence_raw = row.get("evidence", "[]")
|
|
597
|
-
try:
|
|
598
|
-
evidence = tuple(json.loads(evidence_raw))
|
|
599
|
-
except (json.JSONDecodeError, TypeError):
|
|
600
|
-
evidence = ()
|
|
601
|
-
|
|
602
|
-
return EvolutionRecord(
|
|
603
|
-
id=row["id"],
|
|
604
|
-
skill_name=row["skill_name"],
|
|
605
|
-
parent_skill_id=row.get("parent_skill_id"),
|
|
606
|
-
evolution_type=EvolutionType(row["evolution_type"]),
|
|
607
|
-
trigger=TriggerType(row["trigger_type"]),
|
|
608
|
-
generation=row.get("generation", 0),
|
|
609
|
-
status=EvolutionStatus(row.get("status", "candidate")),
|
|
610
|
-
mutation_summary=row.get("mutation_summary", ""),
|
|
611
|
-
evidence=evidence,
|
|
612
|
-
original_content=row.get("original_content", ""),
|
|
613
|
-
evolved_content=row.get("evolved_content", ""),
|
|
614
|
-
content_diff=row.get("content_diff", ""),
|
|
615
|
-
blind_verified=bool(row.get("blind_verified", 0)),
|
|
616
|
-
rejection_reason=row.get("rejection_reason", ""),
|
|
617
|
-
created_at=row.get("created_at", ""),
|
|
618
|
-
completed_at=row.get("completed_at"),
|
|
619
|
-
)
|