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,175 +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.7.9 — evolution model selection
|
|
4
|
-
|
|
5
|
-
"""Per-step LLM model selection for the skill-evolution pipeline.
|
|
6
|
-
|
|
7
|
-
v3.7.9: skill evolution defaults to the *lowest-cost* capable model for
|
|
8
|
-
whatever backend is active, and lets users override each step
|
|
9
|
-
(``evolution.mutation_model`` / ``verify_model`` / ``confirm_model``).
|
|
10
|
-
|
|
11
|
-
Two invariants this module enforces:
|
|
12
|
-
|
|
13
|
-
1. **Lowest cost by default.** Claude backend → Haiku; Ollama → a local
|
|
14
|
-
(free) model. No step silently defaults to a premium model.
|
|
15
|
-
2. **Generator != verifier.** Blind verification must run on a *different*
|
|
16
|
-
model from the generator, otherwise the generator effectively grades
|
|
17
|
-
its own homework. When an independent verifier isn't available for
|
|
18
|
-
free (Claude backend, no local Ollama), we reuse the cheapest model
|
|
19
|
-
and set ``independent=False`` so the caller can log the reduced-safety
|
|
20
|
-
condition — we never escalate the verifier to a premium model just to
|
|
21
|
-
force independence (that would defeat the cost goal).
|
|
22
|
-
|
|
23
|
-
This module is pure: it takes ``ollama_available`` as an argument instead
|
|
24
|
-
of probing, so it is fully unit-testable without network access.
|
|
25
|
-
|
|
26
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
from __future__ import annotations
|
|
30
|
-
|
|
31
|
-
import logging
|
|
32
|
-
from dataclasses import dataclass
|
|
33
|
-
|
|
34
|
-
logger = logging.getLogger(__name__)
|
|
35
|
-
|
|
36
|
-
# Allow-listed model ids (must stay a subset of
|
|
37
|
-
# ``llm_dispatch.ALLOWED_LLM_MODELS``).
|
|
38
|
-
CHEAPEST_CLAUDE = "claude-haiku-4-5"
|
|
39
|
-
QUALITY_CLAUDE = "claude-sonnet-4-6"
|
|
40
|
-
CHEAPEST_OLLAMA = "ollama:llama3"
|
|
41
|
-
ALT_OLLAMA = "ollama:qwen2.5"
|
|
42
|
-
CHEAPEST_OPENAI = "openai:gpt-4o-mini"
|
|
43
|
-
|
|
44
|
-
# Short-name → allow-listed model id. Single source of truth for aliasing;
|
|
45
|
-
# ``skill_evolver`` re-exports these for backward compatibility.
|
|
46
|
-
_MODEL_ALIASES: dict[str, str] = {
|
|
47
|
-
"haiku": CHEAPEST_CLAUDE,
|
|
48
|
-
"sonnet": QUALITY_CLAUDE,
|
|
49
|
-
"ollama": CHEAPEST_OLLAMA,
|
|
50
|
-
"ollama:llama3": CHEAPEST_OLLAMA,
|
|
51
|
-
"ollama:qwen2.5": ALT_OLLAMA,
|
|
52
|
-
"openai": CHEAPEST_OPENAI,
|
|
53
|
-
"openai:gpt-4o-mini": CHEAPEST_OPENAI,
|
|
54
|
-
CHEAPEST_CLAUDE: CHEAPEST_CLAUDE,
|
|
55
|
-
QUALITY_CLAUDE: QUALITY_CLAUDE,
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
# Models this subsystem is allowed to dispatch. Anything resolving outside
|
|
59
|
-
# this set falls back to the cheapest safe default rather than dispatching
|
|
60
|
-
# an unvetted (or forbidden) model.
|
|
61
|
-
_ALLOWED: frozenset[str] = frozenset(_MODEL_ALIASES.values())
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def _resolve_model_alias(alias: str) -> str:
|
|
65
|
-
"""Translate a short alias (``haiku``/``sonnet``) to an allow-listed id.
|
|
66
|
-
|
|
67
|
-
Unknown aliases fall back to the cheapest Claude model — the same
|
|
68
|
-
fail-safe the evolver has always used.
|
|
69
|
-
"""
|
|
70
|
-
return _MODEL_ALIASES.get(alias, CHEAPEST_CLAUDE)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
@dataclass(frozen=True)
|
|
74
|
-
class ResolvedModels:
|
|
75
|
-
"""Concrete allow-listed model id for each pipeline step."""
|
|
76
|
-
|
|
77
|
-
mutation: str
|
|
78
|
-
verify: str
|
|
79
|
-
confirm: str
|
|
80
|
-
independent: bool # True when verify != mutation (blind-verify is sound)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def _cheapest_for_backend(backend: str) -> str:
|
|
84
|
-
"""Lowest-cost allow-listed model for a detected backend.
|
|
85
|
-
|
|
86
|
-
The configured backend is authoritative: when the caller explicitly
|
|
87
|
-
names a provider, models are drawn from that provider only —
|
|
88
|
-
never silently downgraded to a different vendor's offering.
|
|
89
|
-
"""
|
|
90
|
-
if backend == "ollama":
|
|
91
|
-
return CHEAPEST_OLLAMA
|
|
92
|
-
if backend == "openai":
|
|
93
|
-
return CHEAPEST_OPENAI
|
|
94
|
-
# claude CLI, anthropic API, and any non-Ollama/non-OpenAI backend
|
|
95
|
-
# route through the cheapest Claude model.
|
|
96
|
-
return CHEAPEST_CLAUDE
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def _resolve_field(value: str, default: str) -> str:
|
|
100
|
-
"""Resolve a config field: empty → default; else alias→id, validated."""
|
|
101
|
-
if not value:
|
|
102
|
-
return default
|
|
103
|
-
resolved = _resolve_model_alias(value)
|
|
104
|
-
if resolved not in _ALLOWED: # pragma: no cover — defensive
|
|
105
|
-
logger.warning(
|
|
106
|
-
"evolution: configured model %r is not allow-listed; "
|
|
107
|
-
"falling back to %s", value, default,
|
|
108
|
-
)
|
|
109
|
-
return default
|
|
110
|
-
return resolved
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _independent_verifier(
|
|
114
|
-
mutation: str, *, ollama_available: bool,
|
|
115
|
-
) -> str:
|
|
116
|
-
"""Pick a cheap verifier that differs from the generator when possible.
|
|
117
|
-
|
|
118
|
-
- Ollama generator → the *other* local model (both free, distinct).
|
|
119
|
-
- OpenAI generator → same OpenAI model (single-provider constraint;
|
|
120
|
-
independence flag will be False — caller logs the condition).
|
|
121
|
-
- Claude generator + local Ollama up → free local verifier.
|
|
122
|
-
- Claude generator, no Ollama → the cheapest *different* Claude tier if
|
|
123
|
-
the generator was a premium model; otherwise reuse the cheapest model
|
|
124
|
-
(caller flags reduced independence — we don't pay for a premium
|
|
125
|
-
verifier just to force distinctness).
|
|
126
|
-
"""
|
|
127
|
-
if mutation.startswith("ollama:"):
|
|
128
|
-
return ALT_OLLAMA if mutation != ALT_OLLAMA else CHEAPEST_OLLAMA
|
|
129
|
-
if mutation.startswith("openai:"):
|
|
130
|
-
# Honor the configured provider: stay within OpenAI models.
|
|
131
|
-
return CHEAPEST_OPENAI
|
|
132
|
-
if ollama_available:
|
|
133
|
-
return CHEAPEST_OLLAMA
|
|
134
|
-
if mutation != CHEAPEST_CLAUDE:
|
|
135
|
-
return CHEAPEST_CLAUDE
|
|
136
|
-
return CHEAPEST_CLAUDE
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def resolve_evolution_models(
|
|
140
|
-
config: object, backend: str, *, ollama_available: bool,
|
|
141
|
-
) -> ResolvedModels:
|
|
142
|
-
"""Resolve mutation/verify/confirm models for a backend.
|
|
143
|
-
|
|
144
|
-
``config`` is an ``EvolutionConfig`` (duck-typed: reads
|
|
145
|
-
``mutation_model`` / ``verify_model`` / ``confirm_model`` attributes,
|
|
146
|
-
each an alias, allow-listed id, or "" for auto).
|
|
147
|
-
"""
|
|
148
|
-
cheapest = _cheapest_for_backend(backend)
|
|
149
|
-
|
|
150
|
-
mutation = _resolve_field(getattr(config, "mutation_model", ""), cheapest)
|
|
151
|
-
confirm = _resolve_field(getattr(config, "confirm_model", ""), cheapest)
|
|
152
|
-
|
|
153
|
-
verify_cfg = getattr(config, "verify_model", "")
|
|
154
|
-
if verify_cfg:
|
|
155
|
-
verify = _resolve_field(verify_cfg, cheapest)
|
|
156
|
-
else:
|
|
157
|
-
verify = _independent_verifier(
|
|
158
|
-
mutation, ollama_available=ollama_available,
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
independent = verify != mutation
|
|
162
|
-
if not independent:
|
|
163
|
-
logger.warning(
|
|
164
|
-
"evolution: blind-verify model == generator model (%s) — "
|
|
165
|
-
"blind-verification independence is reduced. Set "
|
|
166
|
-
"evolution.verify_model to a different model, or run Ollama "
|
|
167
|
-
"locally, for an independent verifier.",
|
|
168
|
-
mutation,
|
|
169
|
-
)
|
|
170
|
-
return ResolvedModels(
|
|
171
|
-
mutation=mutation,
|
|
172
|
-
verify=verify,
|
|
173
|
-
confirm=confirm,
|
|
174
|
-
independent=independent,
|
|
175
|
-
)
|
|
@@ -1,226 +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
|
-
"""Mutation Generator — LLM-driven skill improvement.
|
|
6
|
-
|
|
7
|
-
Reads the original SKILL.md + failure evidence + performance data,
|
|
8
|
-
generates an improved version. Apply-retry cycle (3 attempts) for
|
|
9
|
-
malformed output.
|
|
10
|
-
|
|
11
|
-
Token-driven termination: <EVOLUTION_COMPLETE> or <EVOLUTION_FAILED>.
|
|
12
|
-
Adopted from OpenSpace evolver.py patterns.
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import logging
|
|
20
|
-
import re
|
|
21
|
-
from typing import Optional
|
|
22
|
-
|
|
23
|
-
from superlocalmemory.evolution.types import (
|
|
24
|
-
EvolutionCandidate,
|
|
25
|
-
EvolutionType,
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger(__name__)
|
|
29
|
-
|
|
30
|
-
MAX_APPLY_RETRIES = 3
|
|
31
|
-
MAX_CONTENT_CHARS = 12_000 # Truncate skill content in prompt
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def build_mutation_prompt(
|
|
35
|
-
candidate: EvolutionCandidate,
|
|
36
|
-
original_content: str,
|
|
37
|
-
) -> str:
|
|
38
|
-
"""Build the LLM prompt for skill mutation."""
|
|
39
|
-
truncated = original_content[:MAX_CONTENT_CHARS]
|
|
40
|
-
evidence_text = "\n".join(f"- {e}" for e in candidate.evidence)
|
|
41
|
-
|
|
42
|
-
if candidate.evolution_type == EvolutionType.FIX:
|
|
43
|
-
return _fix_prompt(candidate.skill_name, truncated, evidence_text, candidate.effective_score)
|
|
44
|
-
elif candidate.evolution_type == EvolutionType.DERIVED:
|
|
45
|
-
return _derived_prompt(candidate.skill_name, truncated, evidence_text, candidate.effective_score)
|
|
46
|
-
else:
|
|
47
|
-
return _captured_prompt(candidate.skill_name, evidence_text)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def parse_mutation_output(output: str) -> Optional[str]:
|
|
51
|
-
"""Extract evolved SKILL.md content from LLM output.
|
|
52
|
-
|
|
53
|
-
Looks for content between markdown code fences or after
|
|
54
|
-
<EVOLUTION_COMPLETE> token. Returns None if <EVOLUTION_FAILED>
|
|
55
|
-
or no valid content found.
|
|
56
|
-
"""
|
|
57
|
-
if "<EVOLUTION_FAILED>" in output:
|
|
58
|
-
return None
|
|
59
|
-
|
|
60
|
-
# Try extracting from code fence
|
|
61
|
-
fence_match = re.search(
|
|
62
|
-
r"```(?:markdown|md)?\s*\n(---\s*\n.*?)```",
|
|
63
|
-
output,
|
|
64
|
-
re.DOTALL,
|
|
65
|
-
)
|
|
66
|
-
if fence_match:
|
|
67
|
-
return fence_match.group(1).strip()
|
|
68
|
-
|
|
69
|
-
# Try extracting after EVOLUTION_COMPLETE token
|
|
70
|
-
complete_match = re.search(
|
|
71
|
-
r"<EVOLUTION_COMPLETE>\s*(---\s*\n.*)",
|
|
72
|
-
output,
|
|
73
|
-
re.DOTALL,
|
|
74
|
-
)
|
|
75
|
-
if complete_match:
|
|
76
|
-
return complete_match.group(1).strip()
|
|
77
|
-
|
|
78
|
-
# Try finding YAML frontmatter directly
|
|
79
|
-
frontmatter_match = re.search(
|
|
80
|
-
r"(---\s*\nname:.*?)(?:\n---|\Z)",
|
|
81
|
-
output,
|
|
82
|
-
re.DOTALL,
|
|
83
|
-
)
|
|
84
|
-
if frontmatter_match:
|
|
85
|
-
# Return everything from the frontmatter start
|
|
86
|
-
idx = output.index(frontmatter_match.group(0))
|
|
87
|
-
return output[idx:].strip()
|
|
88
|
-
|
|
89
|
-
return None
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
# An evolved SKILL.md is auto-loaded into future sessions, so a mutation that
|
|
93
|
-
# hallucinated (or was prompt-injected into producing) code-execution or
|
|
94
|
-
# secret-exfiltration instructions must never be persisted. Structure checks
|
|
95
|
-
# alone are insufficient — reject dangerous content outright.
|
|
96
|
-
_SKILL_DENY_PATTERNS: tuple[str, ...] = (
|
|
97
|
-
# Reading the environment. "os.environ" was listed and "os.getenv" was not,
|
|
98
|
-
# which is the same act spelled the other way.
|
|
99
|
-
"os.environ", "os.getenv", "getenv(", "environ[",
|
|
100
|
-
# Running things.
|
|
101
|
-
"subprocess", "import subprocess", "import os", "__import__",
|
|
102
|
-
"exec(", "eval(", "compile(", "os.system", "os.popen", "os.spawn",
|
|
103
|
-
"popen(", "pty.spawn", "runpy",
|
|
104
|
-
# PowerShell and Windows shells, which were absent entirely.
|
|
105
|
-
"invoke-webrequest", "invoke-expression", "iex ", "start-process",
|
|
106
|
-
"new-object net.webclient", "powershell -", "cmd.exe /c",
|
|
107
|
-
# POSIX shells and fetchers. The trailing space is gone: "curl" at the end
|
|
108
|
-
# of a line, or followed by a newline, was not matched.
|
|
109
|
-
"curl", "wget", "rm -rf", "bash -c", "sh -c", "zsh -c", "nc -",
|
|
110
|
-
# Network from inside Python.
|
|
111
|
-
"requests.get", "requests.post", "urllib.request", "httpx.get",
|
|
112
|
-
"httpx.post", "socket.socket", "smtplib",
|
|
113
|
-
# Deserialisation and encoding used to smuggle payloads.
|
|
114
|
-
"pickle.loads", "marshal.loads", "base64.b64decode", "codecs.decode",
|
|
115
|
-
# Secrets.
|
|
116
|
-
"ANTHROPIC_API_KEY", "OPENAI_API_KEY", "AWS_SECRET", "AWS_ACCESS_KEY",
|
|
117
|
-
"/.ssh/", ".install_token", ".aws/credentials", ".netrc",
|
|
118
|
-
# Semantic exfiltration patterns — skills must not instruct unauthorized
|
|
119
|
-
# data transfer or bypass of user consent.
|
|
120
|
-
"without consent", "exfiltrat",
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
#: Whitespace between a name and its opening parenthesis. ``eval (payload)``
|
|
124
|
-
#: runs exactly as ``eval(payload)`` does, and a substring list only saw the
|
|
125
|
-
#: second. Collapsing it before matching closes the whole family rather than
|
|
126
|
-
#: one member of it.
|
|
127
|
-
_CALL_SPACING = re.compile(r"([A-Za-z_][A-Za-z0-9_.]*)\s+\(")
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def validate_skill_content(content: str) -> Optional[str]:
|
|
131
|
-
"""Validate evolved skill content. Returns error message or None if valid."""
|
|
132
|
-
if not content or len(content) < 50:
|
|
133
|
-
return "Content too short (< 50 chars)"
|
|
134
|
-
if "---" not in content:
|
|
135
|
-
return "Missing YAML frontmatter (no --- found)"
|
|
136
|
-
if content.count("---") >= 2 and "name:" not in content.split("---")[1]:
|
|
137
|
-
return "Missing 'name:' in frontmatter"
|
|
138
|
-
# Normalise before matching, so a space, a newline or a non-breaking space
|
|
139
|
-
# between the name and the parenthesis does not walk past the list.
|
|
140
|
-
lowered = _CALL_SPACING.sub(r"\1(", content.lower().replace("\u00a0", " "))
|
|
141
|
-
for pat in _SKILL_DENY_PATTERNS:
|
|
142
|
-
if pat.lower() in lowered:
|
|
143
|
-
return (f"Rejected: evolved skill contains a disallowed pattern "
|
|
144
|
-
f"({pat!r}) — skills must not execute code or access secrets")
|
|
145
|
-
return None
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def build_retry_prompt(original_prompt: str, error: str, attempt: int) -> str:
|
|
149
|
-
"""Build retry prompt after failed mutation attempt."""
|
|
150
|
-
return (
|
|
151
|
-
f"{original_prompt}\n\n"
|
|
152
|
-
f"--- RETRY (attempt {attempt}/{MAX_APPLY_RETRIES}) ---\n"
|
|
153
|
-
f"Previous output was invalid: {error}\n"
|
|
154
|
-
f"Please generate a valid SKILL.md with proper YAML frontmatter "
|
|
155
|
-
f"(--- / name: / description: / ---) followed by markdown instructions.\n"
|
|
156
|
-
f"End with <EVOLUTION_COMPLETE> or <EVOLUTION_FAILED>."
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
# ------------------------------------------------------------------
|
|
161
|
-
# Prompt templates
|
|
162
|
-
# ------------------------------------------------------------------
|
|
163
|
-
|
|
164
|
-
def _fix_prompt(skill_name: str, content: str, evidence: str, score: float) -> str:
|
|
165
|
-
return f"""You are a skill evolution engine. A skill is underperforming and needs repair.
|
|
166
|
-
|
|
167
|
-
SKILL NAME: {skill_name}
|
|
168
|
-
EFFECTIVE SCORE: {score:.0%} (approximate)
|
|
169
|
-
|
|
170
|
-
CURRENT SKILL CONTENT:
|
|
171
|
-
{content}
|
|
172
|
-
|
|
173
|
-
EVIDENCE OF PROBLEMS:
|
|
174
|
-
{evidence}
|
|
175
|
-
|
|
176
|
-
YOUR TASK:
|
|
177
|
-
Generate an improved version of this SKILL.md that addresses the identified problems.
|
|
178
|
-
Keep the same overall structure and purpose. Fix what's broken, don't rewrite from scratch.
|
|
179
|
-
|
|
180
|
-
OUTPUT FORMAT:
|
|
181
|
-
Return the complete improved SKILL.md content inside a markdown code fence.
|
|
182
|
-
The file must start with YAML frontmatter (--- / name: / description: / ---).
|
|
183
|
-
End your response with <EVOLUTION_COMPLETE> if you generated a valid improvement,
|
|
184
|
-
or <EVOLUTION_FAILED> if you cannot improve this skill."""
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def _derived_prompt(skill_name: str, content: str, evidence: str, score: float) -> str:
|
|
188
|
-
return f"""You are a skill evolution engine. A skill works for some tasks but not others.
|
|
189
|
-
Create a specialized variant for the failing task type.
|
|
190
|
-
|
|
191
|
-
PARENT SKILL: {skill_name}
|
|
192
|
-
EFFECTIVE SCORE: {score:.0%} (moderate — works sometimes, fails sometimes)
|
|
193
|
-
|
|
194
|
-
PARENT SKILL CONTENT:
|
|
195
|
-
{content}
|
|
196
|
-
|
|
197
|
-
EVIDENCE:
|
|
198
|
-
{evidence}
|
|
199
|
-
|
|
200
|
-
YOUR TASK:
|
|
201
|
-
Create a specialized DERIVED variant that handles the failing cases better.
|
|
202
|
-
Give it a new name (e.g., "{skill_name}-specialized" or a descriptive name).
|
|
203
|
-
Keep the parent's strengths. Add specific handling for the failure patterns.
|
|
204
|
-
|
|
205
|
-
OUTPUT FORMAT:
|
|
206
|
-
Return the complete new SKILL.md inside a markdown code fence.
|
|
207
|
-
Must start with YAML frontmatter (--- / name: / description: / ---).
|
|
208
|
-
End with <EVOLUTION_COMPLETE> or <EVOLUTION_FAILED>."""
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def _captured_prompt(skill_name: str, evidence: str) -> str:
|
|
212
|
-
return f"""You are a skill evolution engine. A repeated workflow pattern was detected
|
|
213
|
-
that no existing skill covers. Create a new skill to codify this pattern.
|
|
214
|
-
|
|
215
|
-
PATTERN NAME: {skill_name}
|
|
216
|
-
EVIDENCE:
|
|
217
|
-
{evidence}
|
|
218
|
-
|
|
219
|
-
YOUR TASK:
|
|
220
|
-
Create a new SKILL.md that codifies this workflow pattern into a reusable skill.
|
|
221
|
-
Make it specific and actionable — not generic advice.
|
|
222
|
-
|
|
223
|
-
OUTPUT FORMAT:
|
|
224
|
-
Return the complete SKILL.md inside a markdown code fence.
|
|
225
|
-
Must start with YAML frontmatter (--- / name: / description: / ---).
|
|
226
|
-
End with <EVOLUTION_COMPLETE> or <EVOLUTION_FAILED>."""
|
|
@@ -1,270 +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 V4 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""SkillActivator — atomic activation of quarantined evolved skills.
|
|
6
|
-
|
|
7
|
-
Copies a VERIFIED_QUARANTINED skill artifact into the live skill directory
|
|
8
|
-
(~/.claude/skills/{skill_name}/SKILL.md), retains the prior artifact as a
|
|
9
|
-
.bak file, and provides a tested rollback path.
|
|
10
|
-
|
|
11
|
-
Invariants:
|
|
12
|
-
1. The destination directory is a child of live_root — path traversal raises ValueError.
|
|
13
|
-
2. The backup is written BEFORE the live copy is overwritten.
|
|
14
|
-
3. Activation is atomic via a .tmp file → os.replace (POSIX atomic on same fs).
|
|
15
|
-
4. Rollback restores from the .bak file and leaves the live copy unchanged.
|
|
16
|
-
5. Only the quarantined artifact identified by quarantine_dir_name is copied;
|
|
17
|
-
no arbitrary file can be activated.
|
|
18
|
-
|
|
19
|
-
CRIT-2 note: skill_name and quarantine_dir_name are ALWAYS different strings:
|
|
20
|
-
- skill_name: the original skill identifier (e.g. "brainstorming")
|
|
21
|
-
- quarantine_dir_name: the sanitized quarantine subdir (e.g. "brainstorming-vabc12")
|
|
22
|
-
Both are required; neither defaults from the other.
|
|
23
|
-
|
|
24
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
from __future__ import annotations
|
|
28
|
-
|
|
29
|
-
import hashlib
|
|
30
|
-
import logging
|
|
31
|
-
import os
|
|
32
|
-
import re
|
|
33
|
-
import shutil
|
|
34
|
-
from datetime import datetime, timezone
|
|
35
|
-
from pathlib import Path
|
|
36
|
-
|
|
37
|
-
from superlocalmemory.infra.data_root import canonical_data_root
|
|
38
|
-
|
|
39
|
-
logger = logging.getLogger(__name__)
|
|
40
|
-
|
|
41
|
-
LIVE_SKILLS_ROOT: Path = Path.home() / ".claude" / "skills"
|
|
42
|
-
BACKUP_ROOT: Path = canonical_data_root() / "skill_backups"
|
|
43
|
-
QUARANTINE_ROOT: Path = canonical_data_root() / "quarantine" / "skills"
|
|
44
|
-
|
|
45
|
-
_SAFE_NAME_RE = re.compile(r"[^a-zA-Z0-9_-]")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class SkillActivationError(Exception):
|
|
49
|
-
"""Raised when activation fails after writing the backup.
|
|
50
|
-
|
|
51
|
-
The caller must invoke rollback() after receiving this error to restore
|
|
52
|
-
the previous live artifact.
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
class SkillActivator:
|
|
57
|
-
"""Activates a quarantined evolved skill into the live skill directory."""
|
|
58
|
-
|
|
59
|
-
def __init__(
|
|
60
|
-
self,
|
|
61
|
-
*,
|
|
62
|
-
live_root: Path | None = None,
|
|
63
|
-
backup_root: Path | None = None,
|
|
64
|
-
quarantine_root: Path | None = None,
|
|
65
|
-
) -> None:
|
|
66
|
-
self._live_root = live_root or LIVE_SKILLS_ROOT
|
|
67
|
-
self._backup_root = backup_root or BACKUP_ROOT
|
|
68
|
-
self._quarantine_root = quarantine_root or QUARANTINE_ROOT
|
|
69
|
-
|
|
70
|
-
# ------------------------------------------------------------------
|
|
71
|
-
# Path helpers
|
|
72
|
-
# ------------------------------------------------------------------
|
|
73
|
-
|
|
74
|
-
def _safe_skill_dir(self, skill_name: str, base: Path) -> Path:
|
|
75
|
-
"""Return base / sanitized_name, raising ValueError on traversal.
|
|
76
|
-
|
|
77
|
-
Two-layer check (fail-fast + belt-and-suspenders):
|
|
78
|
-
1. Reject the raw skill_name if it contains '..' or is absolute.
|
|
79
|
-
2. After sanitization, resolve the target path and verify it remains
|
|
80
|
-
inside base. This catches any edge case the regex misses.
|
|
81
|
-
"""
|
|
82
|
-
# Fail-fast: detect traversal in raw name before sanitization.
|
|
83
|
-
raw = Path(skill_name)
|
|
84
|
-
if raw.is_absolute() or ".." in raw.parts:
|
|
85
|
-
raise ValueError(
|
|
86
|
-
f"skill_name {skill_name!r} contains path traversal sequences"
|
|
87
|
-
)
|
|
88
|
-
safe = _SAFE_NAME_RE.sub("-", skill_name).lower()[:50] or "skill"
|
|
89
|
-
target = (base / safe).resolve()
|
|
90
|
-
base_resolved = base.resolve()
|
|
91
|
-
# Audit P2-5: is_relative_to is not prefix-fragile (a sibling like
|
|
92
|
-
# ".../skills-evil" cannot masquerade as being under ".../skills").
|
|
93
|
-
if not target.is_relative_to(base_resolved):
|
|
94
|
-
raise ValueError(
|
|
95
|
-
f"skill_name {skill_name!r} escapes sandbox: {target}"
|
|
96
|
-
)
|
|
97
|
-
return target
|
|
98
|
-
|
|
99
|
-
def _quarantine_path(self, quarantine_dir_name: str) -> Path:
|
|
100
|
-
"""Return the SKILL.md path inside quarantine for a given dir name.
|
|
101
|
-
|
|
102
|
-
quarantine_dir_name is the sanitized directory name (CRIT-2), e.g.
|
|
103
|
-
'brainstorming-vabc12'. It is NOT the skill_name.
|
|
104
|
-
|
|
105
|
-
Hardened (audit P0-1 / P1-4): reject absolute paths and '..' traversal,
|
|
106
|
-
then resolve() and require containment inside the quarantine root. The
|
|
107
|
-
resolve() step also defeats a symlinked quarantine dir that would
|
|
108
|
-
otherwise redirect the read outside the sandbox and inject arbitrary
|
|
109
|
-
content into a live skill.
|
|
110
|
-
"""
|
|
111
|
-
raw = Path(quarantine_dir_name)
|
|
112
|
-
if raw.is_absolute() or ".." in raw.parts:
|
|
113
|
-
raise ValueError(
|
|
114
|
-
f"quarantine_dir_name {quarantine_dir_name!r} contains path traversal"
|
|
115
|
-
)
|
|
116
|
-
root = self._quarantine_root.resolve()
|
|
117
|
-
q_dir = (self._quarantine_root / quarantine_dir_name).resolve()
|
|
118
|
-
if not q_dir.is_relative_to(root):
|
|
119
|
-
raise ValueError(
|
|
120
|
-
f"quarantine_dir_name {quarantine_dir_name!r} escapes sandbox: {q_dir}"
|
|
121
|
-
)
|
|
122
|
-
q_path = (q_dir / "SKILL.md").resolve()
|
|
123
|
-
if not q_path.is_relative_to(root):
|
|
124
|
-
raise ValueError(
|
|
125
|
-
f"quarantine artifact escapes sandbox: {q_path}"
|
|
126
|
-
)
|
|
127
|
-
return q_path
|
|
128
|
-
|
|
129
|
-
def _live_path(self, skill_name: str) -> Path:
|
|
130
|
-
return self._safe_skill_dir(skill_name, self._live_root) / "SKILL.md"
|
|
131
|
-
|
|
132
|
-
def _backup_path(self, skill_name: str) -> Path:
|
|
133
|
-
return self._safe_skill_dir(skill_name, self._backup_root) / "SKILL.md.bak"
|
|
134
|
-
|
|
135
|
-
# ------------------------------------------------------------------
|
|
136
|
-
# Public API
|
|
137
|
-
# ------------------------------------------------------------------
|
|
138
|
-
|
|
139
|
-
def activate(
|
|
140
|
-
self,
|
|
141
|
-
skill_name: str,
|
|
142
|
-
quarantine_dir_name: str,
|
|
143
|
-
*,
|
|
144
|
-
actor_id: str = "",
|
|
145
|
-
) -> dict:
|
|
146
|
-
"""Atomically activate a quarantined skill.
|
|
147
|
-
|
|
148
|
-
Steps:
|
|
149
|
-
1. Resolve quarantine_path using quarantine_dir_name and verify it exists.
|
|
150
|
-
2. Read quarantine content and compute SHA-256.
|
|
151
|
-
3. Write backup of existing live SKILL.md (if any) to backup_root.
|
|
152
|
-
4. Write quarantine content to live path via .tmp → os.replace.
|
|
153
|
-
5. Return activation metadata.
|
|
154
|
-
|
|
155
|
-
Args:
|
|
156
|
-
skill_name: The original skill identifier (CRIT-2), e.g. "brainstorming".
|
|
157
|
-
quarantine_dir_name: The sanitized quarantine subdir, e.g. "brainstorming-vabc12".
|
|
158
|
-
actor_id: Who triggered activation (e.g. "auto" or a user id).
|
|
159
|
-
|
|
160
|
-
Raises:
|
|
161
|
-
FileNotFoundError: Quarantine artifact does not exist.
|
|
162
|
-
ValueError: Path traversal detected in skill_name.
|
|
163
|
-
SkillActivationError: Any OS error after the backup was already written.
|
|
164
|
-
"""
|
|
165
|
-
q_path = self._quarantine_path(quarantine_dir_name)
|
|
166
|
-
live_path = self._live_path(skill_name) # raises ValueError on traversal
|
|
167
|
-
backup_path = self._backup_path(skill_name)
|
|
168
|
-
|
|
169
|
-
if not q_path.exists():
|
|
170
|
-
raise FileNotFoundError(
|
|
171
|
-
f"Quarantine artifact not found: {q_path}"
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
content = q_path.read_bytes()
|
|
175
|
-
content_hash = hashlib.sha256(content).hexdigest()
|
|
176
|
-
ts = datetime.now(timezone.utc).isoformat()
|
|
177
|
-
|
|
178
|
-
# Step 3: backup existing live artifact BEFORE any overwrite
|
|
179
|
-
backup_path.parent.mkdir(parents=True, exist_ok=True)
|
|
180
|
-
backup_written = False
|
|
181
|
-
if live_path.exists():
|
|
182
|
-
shutil.copy2(live_path, backup_path)
|
|
183
|
-
backup_written = True
|
|
184
|
-
logger.info(
|
|
185
|
-
"skill_activator: backed up %s → %s",
|
|
186
|
-
live_path, backup_path,
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
# Step 4: atomic write via .tmp → rename (same directory = same fs)
|
|
190
|
-
live_path.parent.mkdir(parents=True, exist_ok=True)
|
|
191
|
-
tmp_path = live_path.with_suffix(".tmp")
|
|
192
|
-
try:
|
|
193
|
-
tmp_path.write_bytes(content)
|
|
194
|
-
os.replace(tmp_path, live_path)
|
|
195
|
-
except OSError as exc:
|
|
196
|
-
try:
|
|
197
|
-
tmp_path.unlink(missing_ok=True)
|
|
198
|
-
except OSError:
|
|
199
|
-
pass
|
|
200
|
-
raise SkillActivationError(
|
|
201
|
-
f"atomic write failed for {live_path}: {exc}"
|
|
202
|
-
) from exc
|
|
203
|
-
|
|
204
|
-
logger.info(
|
|
205
|
-
"skill_activator: activated %s @ %s (sha256=%s, actor=%s)",
|
|
206
|
-
skill_name, live_path, content_hash[:12], actor_id,
|
|
207
|
-
)
|
|
208
|
-
return {
|
|
209
|
-
"skill_name": skill_name,
|
|
210
|
-
"live_path": str(live_path),
|
|
211
|
-
"backup_path": str(backup_path) if backup_written else None,
|
|
212
|
-
"content_hash": content_hash,
|
|
213
|
-
"activated_at": ts,
|
|
214
|
-
"actor_id": actor_id,
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
def rollback(self, skill_name: str) -> dict:
|
|
218
|
-
"""Restore the live SKILL.md from the backup written by activate().
|
|
219
|
-
|
|
220
|
-
If no backup exists, removes the live file (the skill was new).
|
|
221
|
-
Never raises on missing backup — logs a warning instead.
|
|
222
|
-
|
|
223
|
-
Args:
|
|
224
|
-
skill_name: The original skill identifier, same value used in activate().
|
|
225
|
-
"""
|
|
226
|
-
live_path = self._live_path(skill_name)
|
|
227
|
-
backup_path = self._backup_path(skill_name)
|
|
228
|
-
ts = datetime.now(timezone.utc).isoformat()
|
|
229
|
-
|
|
230
|
-
if backup_path.exists():
|
|
231
|
-
# Audit P2-4: restore atomically (tmp → os.replace) so a crash
|
|
232
|
-
# mid-rollback cannot leave a torn live SKILL.md.
|
|
233
|
-
live_path.parent.mkdir(parents=True, exist_ok=True)
|
|
234
|
-
tmp_path = live_path.with_suffix(".tmp")
|
|
235
|
-
tmp_path.write_bytes(backup_path.read_bytes())
|
|
236
|
-
os.replace(tmp_path, live_path)
|
|
237
|
-
logger.info(
|
|
238
|
-
"skill_activator: rolled back %s ← %s",
|
|
239
|
-
live_path, backup_path,
|
|
240
|
-
)
|
|
241
|
-
return {
|
|
242
|
-
"skill_name": skill_name,
|
|
243
|
-
"rolled_back": True,
|
|
244
|
-
"restored_from": str(backup_path),
|
|
245
|
-
"rolled_back_at": ts,
|
|
246
|
-
}
|
|
247
|
-
elif live_path.exists():
|
|
248
|
-
live_path.unlink()
|
|
249
|
-
logger.warning(
|
|
250
|
-
"skill_activator: no backup for %s; removed live file",
|
|
251
|
-
skill_name,
|
|
252
|
-
)
|
|
253
|
-
return {
|
|
254
|
-
"skill_name": skill_name,
|
|
255
|
-
"rolled_back": True,
|
|
256
|
-
"restored_from": None,
|
|
257
|
-
"note": "no backup; live file removed",
|
|
258
|
-
"rolled_back_at": ts,
|
|
259
|
-
}
|
|
260
|
-
else:
|
|
261
|
-
logger.warning(
|
|
262
|
-
"skill_activator: rollback called but no live file for %s",
|
|
263
|
-
skill_name,
|
|
264
|
-
)
|
|
265
|
-
return {
|
|
266
|
-
"skill_name": skill_name,
|
|
267
|
-
"rolled_back": False,
|
|
268
|
-
"note": "nothing to rollback",
|
|
269
|
-
"rolled_back_at": ts,
|
|
270
|
-
}
|