superlocalmemory 4.1.13 → 4.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,122 +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
|
-
"""Blind Verifier — information-isolated skill verification.
|
|
6
|
-
|
|
7
|
-
The key insight from EvoSkills (arXiv:2604.01687): when a generator
|
|
8
|
-
creates a skill and the same model verifies it, confirmation bias is
|
|
9
|
-
nearly guaranteed. The verifier must be BLIND to the generator's reasoning.
|
|
10
|
-
|
|
11
|
-
This verifier:
|
|
12
|
-
- Uses a DIFFERENT model from the generator (Haiku vs Sonnet)
|
|
13
|
-
- CANNOT see: original skill, mutation rationale, generator's reasoning
|
|
14
|
-
- CAN see: task description (what the skill should do), evolved SKILL.md
|
|
15
|
-
- Evaluates independently: "Does this skill correctly address the task?"
|
|
16
|
-
|
|
17
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import json
|
|
23
|
-
import logging
|
|
24
|
-
import re
|
|
25
|
-
from dataclasses import dataclass
|
|
26
|
-
from typing import Optional
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger(__name__)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@dataclass(frozen=True)
|
|
32
|
-
class VerificationResult:
|
|
33
|
-
"""Result of blind verification."""
|
|
34
|
-
passed: bool
|
|
35
|
-
confidence: float # 0.0-1.0
|
|
36
|
-
issues: tuple[str, ...] = ()
|
|
37
|
-
reasoning: str = ""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def build_verification_prompt(
|
|
41
|
-
skill_name: str,
|
|
42
|
-
skill_description: str,
|
|
43
|
-
evolved_content: str,
|
|
44
|
-
) -> str:
|
|
45
|
-
"""Build blind verification prompt.
|
|
46
|
-
|
|
47
|
-
The verifier sees ONLY:
|
|
48
|
-
- What the skill is supposed to do (name + description)
|
|
49
|
-
- The evolved skill content
|
|
50
|
-
|
|
51
|
-
The verifier does NOT see:
|
|
52
|
-
- The original skill
|
|
53
|
-
- Why it was evolved
|
|
54
|
-
- What evidence triggered evolution
|
|
55
|
-
- The generator's reasoning
|
|
56
|
-
"""
|
|
57
|
-
return f"""You are an independent skill quality reviewer. You have NOT seen the original
|
|
58
|
-
version of this skill or why it was modified. Evaluate it purely on its merits.
|
|
59
|
-
|
|
60
|
-
SKILL PURPOSE: {skill_name}
|
|
61
|
-
EXPECTED BEHAVIOR: {skill_description}
|
|
62
|
-
|
|
63
|
-
SKILL CONTENT TO REVIEW:
|
|
64
|
-
{evolved_content[:8000]}
|
|
65
|
-
|
|
66
|
-
EVALUATE:
|
|
67
|
-
1. Does the skill clearly explain what to do? (clarity)
|
|
68
|
-
2. Are the instructions specific and actionable? (specificity)
|
|
69
|
-
3. Are there any obvious errors, contradictions, or missing steps? (correctness)
|
|
70
|
-
4. Would an AI agent be able to follow these instructions? (executability)
|
|
71
|
-
|
|
72
|
-
RESPOND IN JSON FORMAT:
|
|
73
|
-
{{
|
|
74
|
-
"passed": true/false,
|
|
75
|
-
"confidence": 0.0-1.0,
|
|
76
|
-
"issues": ["issue1", "issue2"],
|
|
77
|
-
"reasoning": "brief explanation"
|
|
78
|
-
}}
|
|
79
|
-
|
|
80
|
-
Be strict. Only pass skills that are genuinely clear, correct, and actionable.
|
|
81
|
-
A mediocre skill that might work sometimes should FAIL — evolution should produce
|
|
82
|
-
clear improvements, not marginal changes."""
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def parse_verification_response(response: str) -> VerificationResult:
|
|
86
|
-
"""Parse the verifier's JSON response."""
|
|
87
|
-
# Try parsing JSON from response
|
|
88
|
-
json_match = re.search(r"\{[^{}]*\"passed\"[^{}]*\}", response, re.DOTALL)
|
|
89
|
-
if json_match:
|
|
90
|
-
try:
|
|
91
|
-
data = json.loads(json_match.group(0))
|
|
92
|
-
return VerificationResult(
|
|
93
|
-
passed=bool(data.get("passed", False)),
|
|
94
|
-
confidence=float(data.get("confidence", 0.5)),
|
|
95
|
-
issues=tuple(data.get("issues", [])),
|
|
96
|
-
reasoning=str(data.get("reasoning", "")),
|
|
97
|
-
)
|
|
98
|
-
except (json.JSONDecodeError, TypeError, ValueError):
|
|
99
|
-
pass
|
|
100
|
-
|
|
101
|
-
# Fallback: keyword detection.
|
|
102
|
-
# Negative keywords are checked first so that negating phrases such as
|
|
103
|
-
# "cannot approve" or "not approved" are never mistakenly matched by the
|
|
104
|
-
# positive keyword "approve".
|
|
105
|
-
lower = response.lower()
|
|
106
|
-
if any(kw in lower for kw in (
|
|
107
|
-
"\"passed\": false", "passed: false",
|
|
108
|
-
"reject", "fail",
|
|
109
|
-
"cannot approve", "not approve",
|
|
110
|
-
)):
|
|
111
|
-
return VerificationResult(passed=False, confidence=0.6, reasoning="keyword match")
|
|
112
|
-
|
|
113
|
-
if any(kw in lower for kw in ("\"passed\": true", "passed: true", "approve", "looks good")):
|
|
114
|
-
return VerificationResult(passed=True, confidence=0.6, reasoning="keyword match")
|
|
115
|
-
|
|
116
|
-
# Default: reject if can't parse (conservative)
|
|
117
|
-
return VerificationResult(
|
|
118
|
-
passed=False,
|
|
119
|
-
confidence=0.3,
|
|
120
|
-
reasoning="Could not parse verification response",
|
|
121
|
-
issues=("Unparseable response",),
|
|
122
|
-
)
|
|
@@ -1,356 +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.4.22 — LLD-11 §Budget
|
|
4
|
-
|
|
5
|
-
"""Evolution budget enforcement.
|
|
6
|
-
|
|
7
|
-
Hard caps per MASTER-PLAN §4.4 + LLD-11:
|
|
8
|
-
- Wall-time per cycle: 30 minutes (1800 seconds)
|
|
9
|
-
- LLM calls per cycle: 10
|
|
10
|
-
- Cycles per day per profile: 3
|
|
11
|
-
- Single-flight via per-profile lock file resolved with
|
|
12
|
-
``safe_resolve_identifier`` (LLD-00 §4)
|
|
13
|
-
|
|
14
|
-
All four constraints are non-negotiable — crossing any of them raises
|
|
15
|
-
``BudgetExhausted`` so the caller can abort the cycle safely without
|
|
16
|
-
poisoning ``action_outcomes`` or the recall pipeline.
|
|
17
|
-
|
|
18
|
-
Author: Varun Pratap Bhardwaj / Qualixar
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
from __future__ import annotations
|
|
22
|
-
|
|
23
|
-
import logging
|
|
24
|
-
import os
|
|
25
|
-
import sqlite3
|
|
26
|
-
import time
|
|
27
|
-
import uuid
|
|
28
|
-
from contextlib import contextmanager
|
|
29
|
-
from datetime import datetime, timezone
|
|
30
|
-
from pathlib import Path
|
|
31
|
-
from typing import Iterator
|
|
32
|
-
|
|
33
|
-
from superlocalmemory.core.security_primitives import safe_resolve_identifier
|
|
34
|
-
|
|
35
|
-
logger = logging.getLogger(__name__)
|
|
36
|
-
|
|
37
|
-
try: # POSIX advisory locks (macOS/Linux)
|
|
38
|
-
import fcntl as _fcntl
|
|
39
|
-
except ImportError: # Windows has no fcntl; use its stdlib byte-range lock.
|
|
40
|
-
_fcntl = None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def _acquire_profile_lock(fd: int) -> None:
|
|
44
|
-
"""Acquire a non-blocking cross-process lock on every supported OS."""
|
|
45
|
-
if _fcntl is not None:
|
|
46
|
-
_fcntl.flock(fd, _fcntl.LOCK_EX | _fcntl.LOCK_NB)
|
|
47
|
-
return
|
|
48
|
-
|
|
49
|
-
import msvcrt
|
|
50
|
-
|
|
51
|
-
# ``msvcrt.locking`` cannot lock an empty file. Reserve one marker byte;
|
|
52
|
-
# the file content is diagnostic only and never a correctness signal.
|
|
53
|
-
if os.fstat(fd).st_size == 0:
|
|
54
|
-
os.write(fd, b"\0")
|
|
55
|
-
os.lseek(fd, 0, os.SEEK_SET)
|
|
56
|
-
try:
|
|
57
|
-
msvcrt.locking(fd, msvcrt.LK_NBLCK, 1)
|
|
58
|
-
except OSError as exc:
|
|
59
|
-
raise BlockingIOError("evolution profile lock is held") from exc
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def _release_profile_lock(fd: int) -> None:
|
|
63
|
-
"""Release the lock acquired by :func:`_acquire_profile_lock`."""
|
|
64
|
-
if _fcntl is not None:
|
|
65
|
-
_fcntl.flock(fd, _fcntl.LOCK_UN)
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
import msvcrt
|
|
69
|
-
|
|
70
|
-
os.lseek(fd, 0, os.SEEK_SET)
|
|
71
|
-
msvcrt.locking(fd, msvcrt.LK_UNLCK, 1)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
# M-P-07: path-component hints for filesystems where advisory locking is
|
|
75
|
-
# known to degrade to a no-op. We do NOT abort — some users accept the
|
|
76
|
-
# risk — but we emit a one-shot warning so a double-cycle is at least
|
|
77
|
-
# attributable to a known root cause. If/when we ship a threading-only
|
|
78
|
-
# fallback, this list becomes the trigger for switching modes.
|
|
79
|
-
_SYNC_ROOT_HINTS: tuple[str, ...] = (
|
|
80
|
-
"iCloud Drive",
|
|
81
|
-
"Library/Mobile Documents", # macOS iCloud backing store
|
|
82
|
-
"OneDrive",
|
|
83
|
-
"Dropbox",
|
|
84
|
-
"Google Drive",
|
|
85
|
-
"pCloudDrive",
|
|
86
|
-
)
|
|
87
|
-
_WARNED_SYNC_PATHS: set[str] = set()
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def _detect_sync_root(path: Path) -> str | None:
|
|
91
|
-
"""Return the matching sync-root hint if ``path`` lives under one."""
|
|
92
|
-
try:
|
|
93
|
-
parts = tuple(path.resolve().parts)
|
|
94
|
-
except Exception: # pragma: no cover — path resolution failures
|
|
95
|
-
parts = path.parts
|
|
96
|
-
joined = "/".join(parts)
|
|
97
|
-
for hint in _SYNC_ROOT_HINTS:
|
|
98
|
-
if hint in joined:
|
|
99
|
-
return hint
|
|
100
|
-
return None
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
# ---------------------------------------------------------------------------
|
|
104
|
-
# Contract constants (non-negotiable per MASTER-PLAN §4.4)
|
|
105
|
-
# ---------------------------------------------------------------------------
|
|
106
|
-
|
|
107
|
-
MAX_WALL_TIME_SEC: int = 1800 # 30 minutes per cycle
|
|
108
|
-
MAX_LLM_CALLS_PER_CYCLE: int = 10 # 10 LLM calls per cycle
|
|
109
|
-
MAX_CYCLES_PER_DAY: int = 3 # 3 cycles per profile per UTC day
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
class BudgetExhausted(RuntimeError):
|
|
113
|
-
"""Raised when a budget dimension is crossed.
|
|
114
|
-
|
|
115
|
-
The ``dimension`` attribute records which cap was hit so callers can
|
|
116
|
-
log structured metrics without string-parsing the message.
|
|
117
|
-
"""
|
|
118
|
-
|
|
119
|
-
def __init__(self, dimension: str, detail: str = "") -> None:
|
|
120
|
-
self.dimension = dimension
|
|
121
|
-
suffix = f": {detail}" if detail else ""
|
|
122
|
-
super().__init__(f"budget exhausted [{dimension}]{suffix}")
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
class EvolutionBudget:
|
|
126
|
-
"""Per-profile, per-cycle budget gate.
|
|
127
|
-
|
|
128
|
-
Usage::
|
|
129
|
-
|
|
130
|
-
budget = EvolutionBudget(profile_id="default",
|
|
131
|
-
learning_db=Path("~/.slm/learning.db"),
|
|
132
|
-
lock_dir=Path("~/.superlocalmemory"))
|
|
133
|
-
with budget.cycle():
|
|
134
|
-
budget.check_time()
|
|
135
|
-
budget.charge_llm_call()
|
|
136
|
-
...
|
|
137
|
-
|
|
138
|
-
The ``cycle()`` context manager acquires a single-flight lock (via
|
|
139
|
-
``safe_resolve_identifier`` on the profile name) and enforces the
|
|
140
|
-
3-cycles-per-day cap. Inside the cycle, callers must call
|
|
141
|
-
``check_time()`` before each expensive step and ``charge_llm_call()``
|
|
142
|
-
before each LLM dispatch.
|
|
143
|
-
"""
|
|
144
|
-
|
|
145
|
-
def __init__(
|
|
146
|
-
self,
|
|
147
|
-
*,
|
|
148
|
-
profile_id: str,
|
|
149
|
-
learning_db: Path | str,
|
|
150
|
-
lock_dir: Path | str,
|
|
151
|
-
) -> None:
|
|
152
|
-
self._profile_id = profile_id
|
|
153
|
-
self._learning_db = Path(learning_db)
|
|
154
|
-
self._lock_dir = Path(lock_dir)
|
|
155
|
-
self._lock_dir.mkdir(parents=True, exist_ok=True)
|
|
156
|
-
# Resolve lock path through the LLD-00 §4 safe helper so a malicious
|
|
157
|
-
# profile_id cannot escape the lock directory. The helper regex
|
|
158
|
-
# rejects '.' so we hand it the identifier portion only, then
|
|
159
|
-
# append the fixed ``.lock`` suffix to the validated path.
|
|
160
|
-
safe_stem = safe_resolve_identifier(
|
|
161
|
-
self._lock_dir, f"evolution-{profile_id}",
|
|
162
|
-
)
|
|
163
|
-
self._lock_path = safe_stem.with_suffix(".lock")
|
|
164
|
-
# M-P-07: warn once per lock-path when we detect the lock sits on
|
|
165
|
-
# a known sync-backed filesystem. Advisory locking silently
|
|
166
|
-
# degrades on iCloud/OneDrive/Dropbox — two concurrent cycles
|
|
167
|
-
# would each acquire and burn LLM budget. Documentation-only for
|
|
168
|
-
# now; a future release may refuse to run until the lock_dir is
|
|
169
|
-
# moved off the sync root.
|
|
170
|
-
try:
|
|
171
|
-
root_hint = _detect_sync_root(self._lock_path)
|
|
172
|
-
except Exception: # pragma: no cover — defensive
|
|
173
|
-
root_hint = None
|
|
174
|
-
if root_hint is not None:
|
|
175
|
-
key = str(self._lock_path)
|
|
176
|
-
if key not in _WARNED_SYNC_PATHS:
|
|
177
|
-
_WARNED_SYNC_PATHS.add(key)
|
|
178
|
-
logger.warning(
|
|
179
|
-
"evolution lock at %s lives under %r — advisory locking "
|
|
180
|
-
"may silently no-op on sync-backed filesystems. "
|
|
181
|
-
"Concurrent cycles could double-bill LLM cost. Move "
|
|
182
|
-
"the lock_dir off the sync root to make single-flight "
|
|
183
|
-
"enforceable.",
|
|
184
|
-
key, root_hint,
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
self._cycle_start_mono: float | None = None
|
|
188
|
-
self._llm_calls_this_cycle: int = 0
|
|
189
|
-
self._lock_fd: int | None = None
|
|
190
|
-
|
|
191
|
-
# ------------------------------------------------------------------
|
|
192
|
-
# Per-day cycle accounting (sqlite-backed via evolution_config.last_cycle_at
|
|
193
|
-
# + cycles_this_week; today-count is derived from last_cycle_at day)
|
|
194
|
-
# ------------------------------------------------------------------
|
|
195
|
-
|
|
196
|
-
def _count_cycles_today(self) -> int:
|
|
197
|
-
"""Count cycles recorded for ``profile_id`` on the current UTC day.
|
|
198
|
-
|
|
199
|
-
Reads from ``evolution_llm_cost_log`` — ``cycle_id`` distinct values
|
|
200
|
-
scoped to today. Evolution cycles stamp a ``cycle_id`` on every
|
|
201
|
-
cost-log row they emit, so distinct cycle_ids == distinct cycles.
|
|
202
|
-
|
|
203
|
-
A cycle with zero LLM calls still needs to count; the budget stamps
|
|
204
|
-
a zero-row sentinel via ``_record_cycle_start`` on acquire.
|
|
205
|
-
"""
|
|
206
|
-
today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
|
207
|
-
conn = sqlite3.connect(self._learning_db)
|
|
208
|
-
try:
|
|
209
|
-
row = conn.execute(
|
|
210
|
-
"SELECT COUNT(DISTINCT cycle_id) "
|
|
211
|
-
"FROM evolution_llm_cost_log "
|
|
212
|
-
"WHERE profile_id=? AND substr(ts,1,10)=? "
|
|
213
|
-
" AND cycle_id IS NOT NULL",
|
|
214
|
-
(self._profile_id, today),
|
|
215
|
-
).fetchone()
|
|
216
|
-
return int(row[0]) if row and row[0] is not None else 0
|
|
217
|
-
finally:
|
|
218
|
-
conn.close()
|
|
219
|
-
|
|
220
|
-
def _record_cycle_start(self, cycle_id: str) -> None:
|
|
221
|
-
"""Write a sentinel row so this cycle is counted toward the daily cap.
|
|
222
|
-
|
|
223
|
-
Tokens/cost are zero — the real LLM cost rows land as
|
|
224
|
-
``charge_llm_call`` is invoked by the dispatcher.
|
|
225
|
-
|
|
226
|
-
H-16 (Stage 8): profile_id must be a non-empty string. Enforced
|
|
227
|
-
here so a mis-constructed EvolutionBudget fails at the first
|
|
228
|
-
write instead of silently attributing cost to an empty bucket.
|
|
229
|
-
"""
|
|
230
|
-
if not isinstance(self._profile_id, str) or not self._profile_id.strip():
|
|
231
|
-
raise ValueError(
|
|
232
|
-
"EvolutionBudget.profile_id must be a non-empty string "
|
|
233
|
-
f"(got {self._profile_id!r})"
|
|
234
|
-
)
|
|
235
|
-
now = datetime.now(timezone.utc).isoformat(timespec="seconds")
|
|
236
|
-
conn = sqlite3.connect(self._learning_db)
|
|
237
|
-
try:
|
|
238
|
-
conn.execute(
|
|
239
|
-
"INSERT INTO evolution_llm_cost_log "
|
|
240
|
-
"(profile_id, ts, model, tokens_in, tokens_out, cost_usd, cycle_id) "
|
|
241
|
-
"VALUES (?,?,?,?,?,?,?)",
|
|
242
|
-
(self._profile_id, now, "cycle-start", 0, 0, 0.0, cycle_id),
|
|
243
|
-
)
|
|
244
|
-
conn.commit()
|
|
245
|
-
finally:
|
|
246
|
-
conn.close()
|
|
247
|
-
|
|
248
|
-
# ------------------------------------------------------------------
|
|
249
|
-
# Public runtime checks
|
|
250
|
-
# ------------------------------------------------------------------
|
|
251
|
-
|
|
252
|
-
def check_time(self) -> None:
|
|
253
|
-
"""Raise ``BudgetExhausted`` if wall-time cap exceeded."""
|
|
254
|
-
if self._cycle_start_mono is None:
|
|
255
|
-
raise RuntimeError("check_time() called outside cycle()")
|
|
256
|
-
elapsed = time.monotonic() - self._cycle_start_mono
|
|
257
|
-
if elapsed > MAX_WALL_TIME_SEC:
|
|
258
|
-
raise BudgetExhausted(
|
|
259
|
-
"wall_time",
|
|
260
|
-
f"elapsed {elapsed:.1f}s > {MAX_WALL_TIME_SEC}s",
|
|
261
|
-
)
|
|
262
|
-
|
|
263
|
-
def charge_llm_call(self) -> None:
|
|
264
|
-
"""Charge one LLM call toward the per-cycle cap.
|
|
265
|
-
|
|
266
|
-
Raises ``BudgetExhausted`` AFTER the cap is already exhausted.
|
|
267
|
-
Call this BEFORE dispatching the LLM so the cap is protective.
|
|
268
|
-
"""
|
|
269
|
-
if self._cycle_start_mono is None:
|
|
270
|
-
raise RuntimeError("charge_llm_call() called outside cycle()")
|
|
271
|
-
if self._llm_calls_this_cycle >= MAX_LLM_CALLS_PER_CYCLE:
|
|
272
|
-
raise BudgetExhausted(
|
|
273
|
-
"llm_calls",
|
|
274
|
-
f"charged {self._llm_calls_this_cycle} "
|
|
275
|
-
f"(cap {MAX_LLM_CALLS_PER_CYCLE})",
|
|
276
|
-
)
|
|
277
|
-
self._llm_calls_this_cycle += 1
|
|
278
|
-
|
|
279
|
-
# ------------------------------------------------------------------
|
|
280
|
-
# Context manager — single-flight + daily cap + wall-time init
|
|
281
|
-
# ------------------------------------------------------------------
|
|
282
|
-
|
|
283
|
-
@contextmanager
|
|
284
|
-
def cycle(self, cycle_id: str | None = None) -> Iterator["EvolutionBudget"]:
|
|
285
|
-
"""Acquire single-flight lock + enforce daily cap + start wall timer."""
|
|
286
|
-
# Daily cap check BEFORE taking the lock — a blocked cycle must
|
|
287
|
-
# not hold the file lock while other cycles wait.
|
|
288
|
-
today_count = self._count_cycles_today()
|
|
289
|
-
if today_count >= MAX_CYCLES_PER_DAY:
|
|
290
|
-
raise BudgetExhausted(
|
|
291
|
-
"cycles_per_day",
|
|
292
|
-
f"profile={self._profile_id} today={today_count} "
|
|
293
|
-
f"cap={MAX_CYCLES_PER_DAY}",
|
|
294
|
-
)
|
|
295
|
-
|
|
296
|
-
# Single-flight lock (non-blocking advisory lock). A second concurrent
|
|
297
|
-
# acquire raises BlockingIOError — surface as BudgetExhausted.
|
|
298
|
-
fd = os.open(str(self._lock_path), os.O_CREAT | os.O_RDWR, 0o600)
|
|
299
|
-
try:
|
|
300
|
-
try:
|
|
301
|
-
_acquire_profile_lock(fd)
|
|
302
|
-
except BlockingIOError as e:
|
|
303
|
-
os.close(fd)
|
|
304
|
-
raise BudgetExhausted(
|
|
305
|
-
"single_flight",
|
|
306
|
-
f"another cycle holds {self._lock_path}",
|
|
307
|
-
) from e
|
|
308
|
-
self._lock_fd = fd
|
|
309
|
-
except BudgetExhausted:
|
|
310
|
-
raise
|
|
311
|
-
except Exception:
|
|
312
|
-
try:
|
|
313
|
-
os.close(fd)
|
|
314
|
-
except OSError:
|
|
315
|
-
pass
|
|
316
|
-
raise
|
|
317
|
-
|
|
318
|
-
# Write pid marker (best-effort, never fails the acquire).
|
|
319
|
-
try:
|
|
320
|
-
os.write(fd, f"{os.getpid()}:{self._profile_id}\n".encode())
|
|
321
|
-
except OSError:
|
|
322
|
-
pass
|
|
323
|
-
|
|
324
|
-
cid = cycle_id or (
|
|
325
|
-
datetime.now(timezone.utc).strftime("cyc-%Y%m%d-%H%M%S-")
|
|
326
|
-
+ uuid.uuid4().hex[:8]
|
|
327
|
-
)
|
|
328
|
-
try:
|
|
329
|
-
self._record_cycle_start(cid)
|
|
330
|
-
except sqlite3.Error as e:
|
|
331
|
-
# Release lock before propagating — a failed cycle-record should
|
|
332
|
-
# not leave the lock dangling.
|
|
333
|
-
try:
|
|
334
|
-
_release_profile_lock(fd)
|
|
335
|
-
finally:
|
|
336
|
-
os.close(fd)
|
|
337
|
-
self._lock_fd = None
|
|
338
|
-
raise RuntimeError(
|
|
339
|
-
f"failed to record cycle start: {e}",
|
|
340
|
-
) from e
|
|
341
|
-
|
|
342
|
-
self._cycle_start_mono = time.monotonic()
|
|
343
|
-
self._llm_calls_this_cycle = 0
|
|
344
|
-
|
|
345
|
-
try:
|
|
346
|
-
yield self
|
|
347
|
-
finally:
|
|
348
|
-
self._cycle_start_mono = None
|
|
349
|
-
try:
|
|
350
|
-
_release_profile_lock(fd)
|
|
351
|
-
finally:
|
|
352
|
-
try:
|
|
353
|
-
os.close(fd)
|
|
354
|
-
except OSError:
|
|
355
|
-
pass
|
|
356
|
-
self._lock_fd = None
|