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,270 +0,0 @@
|
|
|
1
|
-
"""ConfigStore — reads, writes, and hot-reloads optimize.json.
|
|
2
|
-
|
|
3
|
-
SINGLE SOURCE OF TRUTH for the daemon, UI, CLI, and MCP tools.
|
|
4
|
-
UI and CLI write via save(); daemon reads via get() which is always current.
|
|
5
|
-
|
|
6
|
-
Hot-reload: a background watchdog thread polls optimize.json every 2 seconds.
|
|
7
|
-
On mtime change, it parses and validates; if valid, atomically swaps the
|
|
8
|
-
active config. If invalid, keeps the old config (fail-open).
|
|
9
|
-
|
|
10
|
-
Thread safety: self._lock (threading.RLock) protects self._current_config
|
|
11
|
-
and self._version. get() acquires a read-lock; save() acquires a write-lock.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import atexit
|
|
17
|
-
import json
|
|
18
|
-
import logging
|
|
19
|
-
import os
|
|
20
|
-
import threading
|
|
21
|
-
import weakref
|
|
22
|
-
from pathlib import Path
|
|
23
|
-
from typing import Any, Callable
|
|
24
|
-
|
|
25
|
-
from superlocalmemory.infra.data_root import DynamicStatePath
|
|
26
|
-
from superlocalmemory.optimize.config.defaults import DEFAULT_OPTIMIZE_CONFIG
|
|
27
|
-
from superlocalmemory.optimize.config.schema import OptimizeConfig
|
|
28
|
-
|
|
29
|
-
logger = logging.getLogger(__name__)
|
|
30
|
-
|
|
31
|
-
_DEFAULT_CONFIG_PATH = DynamicStatePath("optimize.json")
|
|
32
|
-
_POLL_INTERVAL_SECONDS: float = 2.0
|
|
33
|
-
|
|
34
|
-
# ---- watchdog shutdown safety -------------------------------------------
|
|
35
|
-
# Each started watchdog runs in a daemon thread. At interpreter shutdown CPython
|
|
36
|
-
# kills daemon threads abruptly; on macOS, with the ``watchdog`` fsevents C
|
|
37
|
-
# extension also loaded in-process, a daemon thread still executing while the
|
|
38
|
-
# interpreter finalizes can race the teardown and SIGSEGV. We track every store
|
|
39
|
-
# that has a live watchdog and stop+join them from an ``atexit`` hook — atexit
|
|
40
|
-
# callbacks run BEFORE daemon threads are terminated, so no watchdog thread is
|
|
41
|
-
# still alive when CPython finalizes.
|
|
42
|
-
_active_stores: "weakref.WeakSet[ConfigStore]" = weakref.WeakSet()
|
|
43
|
-
_registry_lock = threading.Lock()
|
|
44
|
-
_atexit_registered = False
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def _register_active_store(store: "ConfigStore") -> None:
|
|
48
|
-
"""Track a store with a running watchdog; install the atexit hook once."""
|
|
49
|
-
global _atexit_registered
|
|
50
|
-
with _registry_lock:
|
|
51
|
-
_active_stores.add(store)
|
|
52
|
-
if not _atexit_registered:
|
|
53
|
-
atexit.register(_stop_all_watchdogs)
|
|
54
|
-
_atexit_registered = True
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def _stop_all_watchdogs() -> None:
|
|
58
|
-
"""Stop+join every registered watchdog. Idempotent; safe at interpreter exit.
|
|
59
|
-
|
|
60
|
-
Also invoked by the test harness at session finish (see tests/conftest.py)
|
|
61
|
-
so no leaked watchdog thread survives into interpreter finalization.
|
|
62
|
-
"""
|
|
63
|
-
with _registry_lock:
|
|
64
|
-
stores = list(_active_stores)
|
|
65
|
-
for store in stores:
|
|
66
|
-
try:
|
|
67
|
-
store.stop_watchdog()
|
|
68
|
-
except Exception:
|
|
69
|
-
pass
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
class ConfigStore:
|
|
73
|
-
"""Manages optimize.json with hot-reload capability."""
|
|
74
|
-
|
|
75
|
-
def __init__(
|
|
76
|
-
self,
|
|
77
|
-
config_path: Path | None = None,
|
|
78
|
-
poll_interval: float = _POLL_INTERVAL_SECONDS,
|
|
79
|
-
) -> None:
|
|
80
|
-
self._config_path = Path(
|
|
81
|
-
config_path if config_path is not None else _DEFAULT_CONFIG_PATH
|
|
82
|
-
)
|
|
83
|
-
self._poll_interval_seconds = float(poll_interval)
|
|
84
|
-
self._lock = threading.RLock()
|
|
85
|
-
self._change_callbacks: list[Callable[[OptimizeConfig], None]] = []
|
|
86
|
-
self._stop_event = threading.Event()
|
|
87
|
-
self._watchdog_thread: threading.Thread | None = None
|
|
88
|
-
|
|
89
|
-
self._saved_by_self: bool = False
|
|
90
|
-
self._current_config: OptimizeConfig = DEFAULT_OPTIMIZE_CONFIG
|
|
91
|
-
self._last_mtime: float = 0.0
|
|
92
|
-
self._version: int = DEFAULT_OPTIMIZE_CONFIG.config_version
|
|
93
|
-
|
|
94
|
-
# Load initial state from disk if available.
|
|
95
|
-
try:
|
|
96
|
-
if self._config_path.exists():
|
|
97
|
-
self._current_config = self._load_from_disk()
|
|
98
|
-
try:
|
|
99
|
-
self._last_mtime = self._config_path.stat().st_mtime
|
|
100
|
-
except OSError:
|
|
101
|
-
self._last_mtime = 0.0
|
|
102
|
-
self._version = self._current_config.config_version
|
|
103
|
-
except (json.JSONDecodeError, ValueError, TypeError, OSError) as exc:
|
|
104
|
-
logger.warning(
|
|
105
|
-
"ConfigStore: failed to parse %s — using defaults: %s",
|
|
106
|
-
self._config_path, exc,
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
def get(self) -> OptimizeConfig:
|
|
110
|
-
"""Return the current active config (thread-safe, no I/O).
|
|
111
|
-
|
|
112
|
-
INTERFACE-CONTRACT v2.2 §2 — canonical accessor.
|
|
113
|
-
"""
|
|
114
|
-
with self._lock:
|
|
115
|
-
return self._current_config
|
|
116
|
-
|
|
117
|
-
def save(self, config: OptimizeConfig) -> None:
|
|
118
|
-
"""Write config to optimize.json with version bump.
|
|
119
|
-
|
|
120
|
-
Fires registered change callbacks immediately after a successful write
|
|
121
|
-
(outside the lock) so a UI/CLI save reaches the live proxy without
|
|
122
|
-
waiting for the 2s watchdog poll. The watchdog skips this write via
|
|
123
|
-
``_saved_by_self`` so callbacks fire exactly once.
|
|
124
|
-
"""
|
|
125
|
-
config.validate()
|
|
126
|
-
with self._lock:
|
|
127
|
-
new_version = self._version + 1
|
|
128
|
-
new_cfg = OptimizeConfig.from_dict(
|
|
129
|
-
{**config.as_dict(), "config_version": new_version}
|
|
130
|
-
)
|
|
131
|
-
new_cfg.validate()
|
|
132
|
-
self._saved_by_self = True
|
|
133
|
-
try:
|
|
134
|
-
self._atomic_write(new_cfg.as_dict())
|
|
135
|
-
try:
|
|
136
|
-
self._last_mtime = self._config_path.stat().st_mtime
|
|
137
|
-
except OSError:
|
|
138
|
-
self._last_mtime = 0.0
|
|
139
|
-
self._current_config = new_cfg
|
|
140
|
-
self._version = new_version
|
|
141
|
-
finally:
|
|
142
|
-
self._saved_by_self = False
|
|
143
|
-
callbacks = list(self._change_callbacks)
|
|
144
|
-
# Fire callbacks OUTSIDE the lock — a callback may rebuild proxy hooks
|
|
145
|
-
# or call back into get(); keeping them off the lock avoids contention.
|
|
146
|
-
for cb in callbacks:
|
|
147
|
-
try:
|
|
148
|
-
cb(new_cfg)
|
|
149
|
-
except Exception as exc:
|
|
150
|
-
logger.warning("ConfigStore save callback error: %s", exc)
|
|
151
|
-
|
|
152
|
-
def start_watchdog(self) -> None:
|
|
153
|
-
"""Start the background hot-reload watchdog thread.
|
|
154
|
-
|
|
155
|
-
Idempotent — safe to call multiple times.
|
|
156
|
-
"""
|
|
157
|
-
with self._lock:
|
|
158
|
-
if self._watchdog_thread is not None and self._watchdog_thread.is_alive():
|
|
159
|
-
return
|
|
160
|
-
self._stop_event.clear()
|
|
161
|
-
self._watchdog_thread = threading.Thread(
|
|
162
|
-
target=self._watchdog_loop,
|
|
163
|
-
name="slm-optimize-config-watchdog",
|
|
164
|
-
daemon=True,
|
|
165
|
-
)
|
|
166
|
-
self._watchdog_thread.start()
|
|
167
|
-
# Register outside self._lock — _register_active_store takes the module
|
|
168
|
-
# registry lock, and the idempotent early-return above already covers a
|
|
169
|
-
# re-start (the store stays registered from the first start).
|
|
170
|
-
_register_active_store(self)
|
|
171
|
-
|
|
172
|
-
def stop_watchdog(self) -> None:
|
|
173
|
-
"""Signal the watchdog thread to stop and join it (timeout=5s)."""
|
|
174
|
-
self._stop_event.set()
|
|
175
|
-
t = self._watchdog_thread
|
|
176
|
-
if t is not None:
|
|
177
|
-
t.join(timeout=5.0)
|
|
178
|
-
with self._lock:
|
|
179
|
-
self._watchdog_thread = None
|
|
180
|
-
with _registry_lock:
|
|
181
|
-
_active_stores.discard(self)
|
|
182
|
-
|
|
183
|
-
def version(self) -> int:
|
|
184
|
-
with self._lock:
|
|
185
|
-
return self._version
|
|
186
|
-
|
|
187
|
-
def register_change_callback(
|
|
188
|
-
self, callback: Callable[[OptimizeConfig], None]
|
|
189
|
-
) -> None:
|
|
190
|
-
with self._lock:
|
|
191
|
-
self._change_callbacks.append(callback)
|
|
192
|
-
|
|
193
|
-
# ---- private ----
|
|
194
|
-
|
|
195
|
-
def _load_from_disk(self) -> OptimizeConfig:
|
|
196
|
-
raw = self._config_path.read_text(encoding="utf-8")
|
|
197
|
-
data = json.loads(raw)
|
|
198
|
-
if not isinstance(data, dict):
|
|
199
|
-
raise ValueError("optimize.json root must be an object")
|
|
200
|
-
return OptimizeConfig.from_dict(data)
|
|
201
|
-
|
|
202
|
-
def _atomic_write(self, data: dict[str, Any]) -> None:
|
|
203
|
-
self._config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
204
|
-
tmp = self._config_path.with_suffix(self._config_path.suffix + ".tmp")
|
|
205
|
-
with open(tmp, "w", encoding="utf-8") as f:
|
|
206
|
-
json.dump(data, f, indent=2, sort_keys=True)
|
|
207
|
-
f.flush()
|
|
208
|
-
os.fsync(f.fileno())
|
|
209
|
-
os.replace(tmp, self._config_path)
|
|
210
|
-
try:
|
|
211
|
-
os.chmod(self._config_path, 0o600)
|
|
212
|
-
except OSError:
|
|
213
|
-
pass
|
|
214
|
-
|
|
215
|
-
def _watchdog_loop(self) -> None:
|
|
216
|
-
while not self._stop_event.is_set():
|
|
217
|
-
# Sleep with cancellation
|
|
218
|
-
if self._stop_event.wait(timeout=self._poll_interval_seconds):
|
|
219
|
-
return
|
|
220
|
-
try:
|
|
221
|
-
try:
|
|
222
|
-
mtime = self._config_path.stat().st_mtime
|
|
223
|
-
except FileNotFoundError:
|
|
224
|
-
continue
|
|
225
|
-
except OSError as exc:
|
|
226
|
-
logger.warning("ConfigStore watchdog stat error: %s", exc)
|
|
227
|
-
continue
|
|
228
|
-
|
|
229
|
-
with self._lock:
|
|
230
|
-
if mtime == self._last_mtime:
|
|
231
|
-
continue
|
|
232
|
-
if self._saved_by_self:
|
|
233
|
-
self._last_mtime = mtime
|
|
234
|
-
self._saved_by_self = False
|
|
235
|
-
continue
|
|
236
|
-
|
|
237
|
-
# Parse + validate OUTSIDE the lock to avoid contention.
|
|
238
|
-
try:
|
|
239
|
-
new_config = self._load_from_disk()
|
|
240
|
-
except (json.JSONDecodeError, ValueError, TypeError, OSError) as exc:
|
|
241
|
-
logger.warning(
|
|
242
|
-
"ConfigStore hot-reload PARSE ERROR — keeping previous config: %s",
|
|
243
|
-
exc,
|
|
244
|
-
)
|
|
245
|
-
continue
|
|
246
|
-
|
|
247
|
-
with self._lock:
|
|
248
|
-
# Re-check after lock: another save may have completed.
|
|
249
|
-
if mtime == self._last_mtime:
|
|
250
|
-
continue
|
|
251
|
-
self._current_config = new_config
|
|
252
|
-
self._last_mtime = mtime
|
|
253
|
-
self._version += 1
|
|
254
|
-
new_version = self._version
|
|
255
|
-
|
|
256
|
-
# Snapshot callbacks under lock, iterate outside.
|
|
257
|
-
with self._lock:
|
|
258
|
-
callbacks = list(self._change_callbacks)
|
|
259
|
-
for cb in callbacks:
|
|
260
|
-
try:
|
|
261
|
-
cb(new_config)
|
|
262
|
-
except Exception as exc:
|
|
263
|
-
logger.warning("ConfigStore callback error: %s", exc)
|
|
264
|
-
|
|
265
|
-
logger.info(
|
|
266
|
-
"ConfigStore hot-reloaded optimize.json (version %d)",
|
|
267
|
-
new_version,
|
|
268
|
-
)
|
|
269
|
-
except Exception as exc:
|
|
270
|
-
logger.critical("ConfigStore watchdog thread crashed: %s", exc, exc_info=True)
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
"""Metrics layer for SLM v3.6 Optimize module."""
|
|
4
|
-
|
|
5
|
-
from superlocalmemory.optimize.metrics.counters import MetricsCollector, get_metrics
|
|
6
|
-
from superlocalmemory.optimize.metrics.estimator import SavingsEstimator
|
|
7
|
-
|
|
8
|
-
__all__ = ["MetricsCollector", "SavingsEstimator", "get_metrics"]
|
|
@@ -1,155 +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
|
-
"""Thread-safe atomic counters for all SLM Optimize operations."""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import threading
|
|
10
|
-
from typing import ClassVar
|
|
11
|
-
|
|
12
|
-
from superlocalmemory.optimize.storage.db import MetricsSnapshot
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class MetricsCollector:
|
|
16
|
-
"""Thread-safe atomic in-memory counters. Daemon-scoped singleton.
|
|
17
|
-
|
|
18
|
-
All increment methods acquire a threading.Lock. Each increment is
|
|
19
|
-
O(1) and must add < 1 µs of latency on the hot path.
|
|
20
|
-
|
|
21
|
-
Hook binding (from INTERFACE-CONTRACT §3):
|
|
22
|
-
on_hit(tokens_saved_input, tokens_saved_output): cache hit
|
|
23
|
-
on_miss(): cache miss
|
|
24
|
-
on_compress(tokens_before, tokens_after): compress ran (word-count proxy)
|
|
25
|
-
on_eviction(): entry expired/evicted
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
_instance: ClassVar[MetricsCollector | None] = None
|
|
29
|
-
_lock: ClassVar[threading.Lock] = threading.Lock()
|
|
30
|
-
|
|
31
|
-
def __init__(self) -> None:
|
|
32
|
-
self._data_lock = threading.Lock()
|
|
33
|
-
self._hits: int = 0
|
|
34
|
-
self._misses: int = 0
|
|
35
|
-
self._calls_skipped: int = 0
|
|
36
|
-
self._tokens_saved_input: int = 0
|
|
37
|
-
self._tokens_saved_output: int = 0
|
|
38
|
-
self._tokens_saved_compress: int = 0
|
|
39
|
-
self._evictions: int = 0
|
|
40
|
-
self._latency_overhead_ms_sum: float = 0.0
|
|
41
|
-
self._latency_samples: int = 0
|
|
42
|
-
self._compress_runs: int = 0
|
|
43
|
-
self._lossy_compress_runs: int = 0
|
|
44
|
-
self._compress_bytes_original: int = 0
|
|
45
|
-
self._compress_bytes_after: int = 0
|
|
46
|
-
self._cache_size_bytes: int = 0
|
|
47
|
-
self._cache_entry_count: int = 0
|
|
48
|
-
|
|
49
|
-
@classmethod
|
|
50
|
-
def get_instance(cls) -> MetricsCollector:
|
|
51
|
-
"""Return the process-global singleton. Thread-safe."""
|
|
52
|
-
if cls._instance is None:
|
|
53
|
-
with cls._lock:
|
|
54
|
-
if cls._instance is None:
|
|
55
|
-
cls._instance = cls()
|
|
56
|
-
return cls._instance
|
|
57
|
-
|
|
58
|
-
def on_hit(self, tokens_saved_input: int = 0, tokens_saved_output: int = 0) -> None:
|
|
59
|
-
"""Record a cache hit with tokens saved."""
|
|
60
|
-
with self._data_lock:
|
|
61
|
-
self._hits += 1
|
|
62
|
-
self._tokens_saved_input += max(0, tokens_saved_input)
|
|
63
|
-
self._tokens_saved_output += max(0, tokens_saved_output)
|
|
64
|
-
|
|
65
|
-
def on_miss(self) -> None:
|
|
66
|
-
"""Record a cache miss."""
|
|
67
|
-
with self._data_lock:
|
|
68
|
-
self._misses += 1
|
|
69
|
-
|
|
70
|
-
def on_compress(self, tokens_before: int, tokens_after: int, lossy: bool = False) -> None:
|
|
71
|
-
"""Record a compression run. Arguments are word-count proxy estimates from _token_estimate().
|
|
72
|
-
|
|
73
|
-
M-03: consistent naming — these are token estimates, not byte counts.
|
|
74
|
-
Stored in compress_bytes_original/after fields for DB schema compat; unit is word-count.
|
|
75
|
-
|
|
76
|
-
``lossy`` distinguishes a Layer-2 lossy (LLMLingua prose) run from a
|
|
77
|
-
lossless Layer-1/JSON-minify run; tracked in memory (not yet persisted).
|
|
78
|
-
"""
|
|
79
|
-
with self._data_lock:
|
|
80
|
-
self._compress_runs += 1
|
|
81
|
-
if lossy:
|
|
82
|
-
self._lossy_compress_runs += 1
|
|
83
|
-
self._compress_bytes_original += max(0, tokens_before)
|
|
84
|
-
self._compress_bytes_after += max(0, tokens_after)
|
|
85
|
-
self._tokens_saved_compress += max(0, tokens_before - tokens_after)
|
|
86
|
-
|
|
87
|
-
def lossy_compress_runs(self) -> int:
|
|
88
|
-
"""Session-scoped count of lossy (Layer-2) compression runs."""
|
|
89
|
-
with self._data_lock:
|
|
90
|
-
return self._lossy_compress_runs
|
|
91
|
-
|
|
92
|
-
def on_eviction(self) -> None:
|
|
93
|
-
"""Record an eviction."""
|
|
94
|
-
with self._data_lock:
|
|
95
|
-
self._evictions += 1
|
|
96
|
-
|
|
97
|
-
def increment_skipped_temperature(self) -> None:
|
|
98
|
-
"""C-04: record a cache skip due to non-zero temperature."""
|
|
99
|
-
with self._data_lock:
|
|
100
|
-
self._calls_skipped += 1
|
|
101
|
-
|
|
102
|
-
def record_latency(self, ms: float) -> None:
|
|
103
|
-
"""Record latency overhead in milliseconds."""
|
|
104
|
-
if ms < 0:
|
|
105
|
-
return
|
|
106
|
-
with self._data_lock:
|
|
107
|
-
self._latency_overhead_ms_sum += ms
|
|
108
|
-
self._latency_samples += 1
|
|
109
|
-
|
|
110
|
-
def snapshot(self, cache_size_bytes: int | None = None, cache_entry_count: int | None = None) -> MetricsSnapshot:
|
|
111
|
-
"""Return a consistent read of all counters as a MetricsSnapshot."""
|
|
112
|
-
with self._data_lock:
|
|
113
|
-
import time
|
|
114
|
-
return MetricsSnapshot(
|
|
115
|
-
id=1,
|
|
116
|
-
hits=self._hits,
|
|
117
|
-
misses=self._misses,
|
|
118
|
-
calls_skipped=self._calls_skipped,
|
|
119
|
-
tokens_saved_input=self._tokens_saved_input,
|
|
120
|
-
tokens_saved_output=self._tokens_saved_output,
|
|
121
|
-
tokens_saved_compress=self._tokens_saved_compress,
|
|
122
|
-
evictions=self._evictions,
|
|
123
|
-
latency_overhead_ms_sum=self._latency_overhead_ms_sum,
|
|
124
|
-
latency_samples=self._latency_samples,
|
|
125
|
-
compress_runs=self._compress_runs,
|
|
126
|
-
compress_bytes_original=self._compress_bytes_original,
|
|
127
|
-
compress_bytes_after=self._compress_bytes_after,
|
|
128
|
-
cache_size_bytes=cache_size_bytes if cache_size_bytes is not None else self._cache_size_bytes,
|
|
129
|
-
cache_entry_count=cache_entry_count if cache_entry_count is not None else self._cache_entry_count,
|
|
130
|
-
updated_at=time.time(),
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
def reset(self) -> None:
|
|
134
|
-
"""Reset all counters. FOR TESTS ONLY."""
|
|
135
|
-
with self._data_lock:
|
|
136
|
-
self._hits = 0
|
|
137
|
-
self._misses = 0
|
|
138
|
-
self._calls_skipped = 0
|
|
139
|
-
self._tokens_saved_input = 0
|
|
140
|
-
self._tokens_saved_output = 0
|
|
141
|
-
self._tokens_saved_compress = 0
|
|
142
|
-
self._evictions = 0
|
|
143
|
-
self._latency_overhead_ms_sum = 0.0
|
|
144
|
-
self._latency_samples = 0
|
|
145
|
-
self._compress_runs = 0
|
|
146
|
-
self._lossy_compress_runs = 0
|
|
147
|
-
self._compress_bytes_original = 0
|
|
148
|
-
self._compress_bytes_after = 0
|
|
149
|
-
self._cache_size_bytes = 0
|
|
150
|
-
self._cache_entry_count = 0
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def get_metrics() -> MetricsCollector:
|
|
154
|
-
"""Return the process-global MetricsCollector singleton."""
|
|
155
|
-
return MetricsCollector.get_instance()
|
|
@@ -1,87 +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
|
-
"""Savings estimator — converts MetricsSnapshot to dollar/rupee savings."""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from datetime import date, timedelta
|
|
11
|
-
from typing import Any
|
|
12
|
-
|
|
13
|
-
from superlocalmemory.optimize.storage.db import MetricsSnapshot
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger("superlocalmemory.optimize.metrics.estimator")
|
|
16
|
-
|
|
17
|
-
# DATED: 2026-06-07 — prices verified from official pages on this date.
|
|
18
|
-
BUILTIN_PRICING_TABLE: dict[str, dict[str, float]] = {
|
|
19
|
-
"anthropic": {"input_per_1m_usd": 3.00, "output_per_1m_usd": 15.00},
|
|
20
|
-
"openai": {"input_per_1m_usd": 2.50, "output_per_1m_usd": 10.00},
|
|
21
|
-
"gemini": {"input_per_1m_usd": 1.25, "output_per_1m_usd": 10.00},
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
_PRICING_STALE_DAYS: int = 90
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class SavingsEstimator:
|
|
28
|
-
"""Converts MetricsSnapshot to dollar/rupee savings. Daemon-scoped singleton.
|
|
29
|
-
|
|
30
|
-
Pricing (June 2026 — dated defaults, user-configurable):
|
|
31
|
-
anthropic: $3.00/M input tokens
|
|
32
|
-
openai: $2.50/M input tokens
|
|
33
|
-
gemini: $1.25/M input tokens
|
|
34
|
-
|
|
35
|
-
CRITICAL pricing rule (INTERFACE-CONTRACT §7):
|
|
36
|
-
Cache SKIP saves BOTH input+output tokens (whole call avoided).
|
|
37
|
-
Compression saves INPUT tokens ONLY (output tokens not compressed).
|
|
38
|
-
NEVER apply output-token pricing to compression savings.
|
|
39
|
-
|
|
40
|
-
INR conversion: 83.5 (hardcoded, configurable).
|
|
41
|
-
Stale detection: if pricing data is > 90 days old → include is_stale=True in output.
|
|
42
|
-
"""
|
|
43
|
-
|
|
44
|
-
INR_RATE: float = 83.5
|
|
45
|
-
_PRICING_DATE: str = "2026-06-07"
|
|
46
|
-
|
|
47
|
-
def estimate(self, snap: MetricsSnapshot, provider: str = "anthropic") -> dict[str, Any]:
|
|
48
|
-
"""Compute savings from a MetricsSnapshot.
|
|
49
|
-
|
|
50
|
-
Returns:
|
|
51
|
-
dict with keys: usd, inr, tokens_saved_total, cache_tokens,
|
|
52
|
-
compress_tokens, is_stale, pricing_date
|
|
53
|
-
"""
|
|
54
|
-
provider_key = provider if provider in BUILTIN_PRICING_TABLE else "anthropic"
|
|
55
|
-
rates = BUILTIN_PRICING_TABLE[provider_key]
|
|
56
|
-
input_rate = rates["input_per_1m_usd"]
|
|
57
|
-
output_rate = rates["output_per_1m_usd"]
|
|
58
|
-
|
|
59
|
-
cache_tokens = snap.tokens_saved_input + snap.tokens_saved_output
|
|
60
|
-
compress_tokens = snap.tokens_saved_compress
|
|
61
|
-
tokens_saved_total = cache_tokens + compress_tokens
|
|
62
|
-
|
|
63
|
-
# Cache skip: input + output tokens saved (whole call avoided)
|
|
64
|
-
savings_cache_usd = (snap.tokens_saved_input / 1_000_000) * input_rate + (snap.tokens_saved_output / 1_000_000) * output_rate
|
|
65
|
-
# Compression: input tokens only
|
|
66
|
-
savings_compress_usd = (compress_tokens / 1_000_000) * input_rate
|
|
67
|
-
total_usd = savings_cache_usd + savings_compress_usd
|
|
68
|
-
|
|
69
|
-
is_stale = self._is_stale()
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
"usd": round(total_usd, 6),
|
|
73
|
-
"inr": round(total_usd * self.INR_RATE, 4),
|
|
74
|
-
"tokens_saved_total": tokens_saved_total,
|
|
75
|
-
"cache_tokens": cache_tokens,
|
|
76
|
-
"compress_tokens": compress_tokens,
|
|
77
|
-
"is_stale": is_stale,
|
|
78
|
-
"pricing_date": self._PRICING_DATE,
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
def _is_stale(self) -> bool:
|
|
82
|
-
"""Return True if pricing data is older than _PRICING_STALE_DAYS."""
|
|
83
|
-
try:
|
|
84
|
-
table_date = date.fromisoformat(self._PRICING_DATE)
|
|
85
|
-
return (date.today() - table_date) > timedelta(days=_PRICING_STALE_DAYS)
|
|
86
|
-
except ValueError:
|
|
87
|
-
return True
|
|
@@ -1,77 +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
|
-
"""Optional Prometheus/OpenTelemetry export. Guarded by try/except — no hard dependency."""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger("superlocalmemory.optimize.metrics.exporters")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def get_prometheus_exporter() -> Any | None:
|
|
16
|
-
"""Return a Prometheus exporter if prometheus_client is installed, else None.
|
|
17
|
-
|
|
18
|
-
Prometheus port: 9091 (NOT 8765, NOT 8766).
|
|
19
|
-
"""
|
|
20
|
-
try:
|
|
21
|
-
from prometheus_client import Counter, Gauge, start_http_server # noqa: F401
|
|
22
|
-
return _PrometheusExporter()
|
|
23
|
-
except ImportError:
|
|
24
|
-
return None
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class _PrometheusExporter:
|
|
28
|
-
"""Thin wrapper around prometheus_client for SLM Optimize metrics."""
|
|
29
|
-
|
|
30
|
-
def __init__(self) -> None:
|
|
31
|
-
from prometheus_client import Counter, Gauge, start_http_server
|
|
32
|
-
|
|
33
|
-
self._cache_hits = Counter(
|
|
34
|
-
"slm_cache_hits_total", "Total cache hits"
|
|
35
|
-
)
|
|
36
|
-
self._cache_misses = Counter(
|
|
37
|
-
"slm_cache_misses_total", "Total cache misses"
|
|
38
|
-
)
|
|
39
|
-
self._tokens_saved = Counter(
|
|
40
|
-
"slm_tokens_saved_total", "Total tokens saved (cache + compress)"
|
|
41
|
-
)
|
|
42
|
-
self._compress_runs = Counter(
|
|
43
|
-
"slm_compress_runs_total", "Total compression runs"
|
|
44
|
-
)
|
|
45
|
-
self._cache_size = Gauge(
|
|
46
|
-
"slm_cache_size_bytes", "Cache size in bytes"
|
|
47
|
-
)
|
|
48
|
-
self._started = False
|
|
49
|
-
|
|
50
|
-
def start(self, port: int = 9091) -> None:
|
|
51
|
-
"""Start Prometheus HTTP server on the given port."""
|
|
52
|
-
if self._started:
|
|
53
|
-
return
|
|
54
|
-
try:
|
|
55
|
-
from prometheus_client import start_http_server
|
|
56
|
-
start_http_server(port)
|
|
57
|
-
self._started = True
|
|
58
|
-
logger.info("Prometheus exporter started on port %d", port)
|
|
59
|
-
except Exception as exc:
|
|
60
|
-
logger.warning("Failed to start Prometheus exporter: %s", exc)
|
|
61
|
-
|
|
62
|
-
def update(self, snapshot: dict[str, Any]) -> None:
|
|
63
|
-
"""Update Prometheus gauges/counters from a metrics snapshot dict."""
|
|
64
|
-
if not self._started:
|
|
65
|
-
return
|
|
66
|
-
try:
|
|
67
|
-
self._cache_hits._value.set(snapshot.get("hits", 0))
|
|
68
|
-
self._cache_misses._value.set(snapshot.get("misses", 0))
|
|
69
|
-
self._tokens_saved._value.set(
|
|
70
|
-
snapshot.get("tokens_saved_input", 0)
|
|
71
|
-
+ snapshot.get("tokens_saved_output", 0)
|
|
72
|
-
+ snapshot.get("tokens_saved_compress", 0)
|
|
73
|
-
)
|
|
74
|
-
self._compress_runs._value.set(snapshot.get("compress_runs", 0))
|
|
75
|
-
self._cache_size.set(snapshot.get("cache_size_bytes", 0))
|
|
76
|
-
except Exception as exc:
|
|
77
|
-
logger.debug("Prometheus update failed: %s", exc)
|