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,667 +0,0 @@
|
|
|
1
|
-
# compress/router.py
|
|
2
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
3
|
-
# Licensed under AGPL-3.0-or-later
|
|
4
|
-
|
|
5
|
-
"""CompressRouter — implements CompressHook, dispatches to sub-compressors.
|
|
6
|
-
|
|
7
|
-
INTERFACE-CONTRACT v2.2 §3 defines: compress(ProxyRequest) → ProxyRequest.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import logging
|
|
14
|
-
import threading
|
|
15
|
-
from dataclasses import dataclass
|
|
16
|
-
from typing import TYPE_CHECKING, Any
|
|
17
|
-
|
|
18
|
-
from superlocalmemory.optimize.proxy.lifecycle import ProxyRequest, CompressHook
|
|
19
|
-
from superlocalmemory.optimize.config.store import ConfigStore
|
|
20
|
-
|
|
21
|
-
if TYPE_CHECKING:
|
|
22
|
-
from superlocalmemory.optimize.compress.align import CacheAligner
|
|
23
|
-
from superlocalmemory.optimize.compress.ccr import CCRStore
|
|
24
|
-
from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger("slm.optimize.compress.router")
|
|
27
|
-
|
|
28
|
-
_MIN_CHARS_FOR_COMPRESSION: int = 500
|
|
29
|
-
# Above this size a JSON-looking payload is passed through untouched rather than
|
|
30
|
-
# parsed — bounds worst-case parse cost on the hot path. Pretty-printed JSON in
|
|
31
|
-
# the 0.5 KB–2 MB range (the common tool-output case) is losslessly minified.
|
|
32
|
-
_MAX_JSON_MINIFY_CHARS: int = 2_000_000
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class CompressRouter:
|
|
36
|
-
"""Implements CompressHook Protocol per INTERFACE-CONTRACT §3.
|
|
37
|
-
|
|
38
|
-
compress(req: ProxyRequest) → ProxyRequest
|
|
39
|
-
on_compress(before_tokens, after_tokens, lossy) — metrics callback
|
|
40
|
-
|
|
41
|
-
Singleton per daemon instance.
|
|
42
|
-
"""
|
|
43
|
-
|
|
44
|
-
_instance: "CompressRouter | None" = None
|
|
45
|
-
_lock: threading.Lock = threading.Lock()
|
|
46
|
-
|
|
47
|
-
@classmethod
|
|
48
|
-
def get_instance(cls) -> "CompressRouter":
|
|
49
|
-
if cls._instance is None:
|
|
50
|
-
with cls._lock:
|
|
51
|
-
if cls._instance is None:
|
|
52
|
-
cls._instance = cls()
|
|
53
|
-
return cls._instance
|
|
54
|
-
|
|
55
|
-
def __init__(self) -> None:
|
|
56
|
-
self._llmlingua_compressor: "LLMLinguaCompressor | None" = None
|
|
57
|
-
self._ccr_store: "CCRStore | None" = None
|
|
58
|
-
self._aligner: "CacheAligner | None" = None
|
|
59
|
-
self._config_store: ConfigStore | None = None
|
|
60
|
-
self._metrics_counters: Any = None
|
|
61
|
-
|
|
62
|
-
# ── CompressHook Protocol (INTERFACE-CONTRACT §3) ──────────────────────
|
|
63
|
-
|
|
64
|
-
def compress(self, req: ProxyRequest) -> ProxyRequest:
|
|
65
|
-
"""Compress request body. Called by proxy after cache miss.
|
|
66
|
-
|
|
67
|
-
CONTRACT §3: compress(req: ProxyRequest) -> ProxyRequest (NOT ctx → CompressResult).
|
|
68
|
-
Returns req unchanged on error / no-op (fail-open).
|
|
69
|
-
"""
|
|
70
|
-
try:
|
|
71
|
-
cfg = self._get_config()
|
|
72
|
-
|
|
73
|
-
if not cfg.compress_enabled:
|
|
74
|
-
return req
|
|
75
|
-
|
|
76
|
-
body = dict(req.body)
|
|
77
|
-
messages = body.get("messages", [])
|
|
78
|
-
if not isinstance(messages, list):
|
|
79
|
-
return req
|
|
80
|
-
|
|
81
|
-
# Step 5: CacheAligner on system prompt (detection only)
|
|
82
|
-
system_text = body.get("system", "")
|
|
83
|
-
if isinstance(system_text, str) and system_text:
|
|
84
|
-
aligner = self._get_aligner()
|
|
85
|
-
align_result = aligner.detect(system_text)
|
|
86
|
-
if align_result.findings:
|
|
87
|
-
logger.warning(
|
|
88
|
-
"[%s] CacheAligner: %d volatile tokens — "
|
|
89
|
-
"provider prefix cache may be unstable: %s",
|
|
90
|
-
req.request_id,
|
|
91
|
-
len(align_result.findings),
|
|
92
|
-
[f.label for f in align_result.findings[:5]],
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
# Step 6: compress each content block
|
|
96
|
-
aggressive = cfg.compress_mode == "aggressive"
|
|
97
|
-
protect_recent = cfg.compress_protect_recent
|
|
98
|
-
new_messages, tokens_before, tokens_after, strategy = self._compress_messages(
|
|
99
|
-
messages=messages,
|
|
100
|
-
aggressive=aggressive,
|
|
101
|
-
protect_recent=protect_recent,
|
|
102
|
-
request_id=req.request_id,
|
|
103
|
-
model=body.get("model", ""),
|
|
104
|
-
tenant_id="default",
|
|
105
|
-
is_proxy=True, # D5-B: proxy path — Layer 2 lossy disabled
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
# S-01/Stage-9 fix: build new_bytes BEFORE the improvement guard.
|
|
109
|
-
# Layer 1 normalization saves characters (not word-count tokens), so
|
|
110
|
-
# tokens_after == tokens_before for "normalize" strategy. Checking byte
|
|
111
|
-
# length of the serialized body correctly detects Layer 1 savings.
|
|
112
|
-
body["messages"] = new_messages
|
|
113
|
-
new_bytes = json.dumps(body, ensure_ascii=False, separators=(",", ":")).encode()
|
|
114
|
-
|
|
115
|
-
bytes_saved = len(req.body_bytes) - len(new_bytes)
|
|
116
|
-
if bytes_saved <= 0 and tokens_after >= tokens_before:
|
|
117
|
-
return req # neither bytes nor tokens improved
|
|
118
|
-
|
|
119
|
-
# CONTRACT §3: fire on_compress metrics callback
|
|
120
|
-
lossy = strategy == "llmlingua2_prose"
|
|
121
|
-
self.on_compress(tokens_before, tokens_after, lossy)
|
|
122
|
-
|
|
123
|
-
return ProxyRequest(
|
|
124
|
-
provider=req.provider,
|
|
125
|
-
method=req.method,
|
|
126
|
-
path=req.path,
|
|
127
|
-
headers=req.headers,
|
|
128
|
-
body=body,
|
|
129
|
-
body_bytes=new_bytes,
|
|
130
|
-
request_id=req.request_id,
|
|
131
|
-
stream=req.stream,
|
|
132
|
-
has_tools=req.has_tools,
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
except Exception as exc:
|
|
136
|
-
logger.warning("[%s] CompressRouter.compress failed (fail-open): %s",
|
|
137
|
-
req.request_id if hasattr(req, 'request_id') else '?', exc)
|
|
138
|
-
return req
|
|
139
|
-
|
|
140
|
-
def on_compress(self, before_tokens: int, after_tokens: int, lossy: bool) -> None:
|
|
141
|
-
"""Metrics callback — CONTRACT §3. MUST NOT raise."""
|
|
142
|
-
try:
|
|
143
|
-
saved = max(0, before_tokens - after_tokens)
|
|
144
|
-
if self._metrics_counters is not None:
|
|
145
|
-
# M-02: pass before/after directly (bytes_original, bytes_after contract).
|
|
146
|
-
# lossy distinguishes Layer-2 (LLMLingua) from lossless runs.
|
|
147
|
-
self._metrics_counters.on_compress(before_tokens, after_tokens, lossy)
|
|
148
|
-
logger.debug("on_compress: saved=%d tokens lossy=%s", saved, lossy)
|
|
149
|
-
except Exception as exc:
|
|
150
|
-
logger.debug("on_compress metrics update failed (non-fatal): %s", exc)
|
|
151
|
-
|
|
152
|
-
def set_metrics(self, counters: Any) -> None:
|
|
153
|
-
self._metrics_counters = counters
|
|
154
|
-
|
|
155
|
-
# ── Internal routing ──────────────────────────────────────────────────
|
|
156
|
-
|
|
157
|
-
def _compress_messages(
|
|
158
|
-
self,
|
|
159
|
-
messages: list[dict[str, Any]],
|
|
160
|
-
aggressive: bool,
|
|
161
|
-
protect_recent: int,
|
|
162
|
-
request_id: str,
|
|
163
|
-
model: str,
|
|
164
|
-
tenant_id: str,
|
|
165
|
-
is_proxy: bool = False,
|
|
166
|
-
) -> tuple[list[dict[str, Any]], int, int, str]:
|
|
167
|
-
total_before = 0
|
|
168
|
-
total_after = 0
|
|
169
|
-
primary_strategy = "none"
|
|
170
|
-
new_messages: list[dict[str, Any]] = []
|
|
171
|
-
|
|
172
|
-
# K-05: protect last N *user* turns, not last N messages of any role
|
|
173
|
-
user_indices = [i for i, m in enumerate(messages) if m.get("role") == "user"]
|
|
174
|
-
protect_indices: set[int] = set(user_indices[-protect_recent:]) if protect_recent > 0 else set()
|
|
175
|
-
# Always protect the very last message (current turn, any role)
|
|
176
|
-
if messages:
|
|
177
|
-
protect_indices.add(len(messages) - 1)
|
|
178
|
-
|
|
179
|
-
for idx, msg in enumerate(messages):
|
|
180
|
-
role = msg.get("role", "")
|
|
181
|
-
is_tool_msg = (
|
|
182
|
-
role == "tool" # OpenAI tool result messages (plain text, skip entirely)
|
|
183
|
-
# Anthropic tool_result blocks are NOT skipped — _compress_content_block
|
|
184
|
-
# handles type=="tool_result" blocks by compressing their text content
|
|
185
|
-
# while preserving the block structure. This is where the bulk of
|
|
186
|
-
# Claude Code output lives (bash results, file contents, JSON data).
|
|
187
|
-
)
|
|
188
|
-
if idx in protect_indices or is_tool_msg:
|
|
189
|
-
new_messages.append(msg)
|
|
190
|
-
continue
|
|
191
|
-
|
|
192
|
-
new_content, before, after, strat = self._compress_content_block(
|
|
193
|
-
content=msg.get("content", ""),
|
|
194
|
-
aggressive=aggressive,
|
|
195
|
-
request_id=request_id,
|
|
196
|
-
model=model,
|
|
197
|
-
tenant_id=tenant_id,
|
|
198
|
-
is_proxy=is_proxy,
|
|
199
|
-
)
|
|
200
|
-
total_before += before
|
|
201
|
-
total_after += after
|
|
202
|
-
if strat != "none":
|
|
203
|
-
primary_strategy = strat
|
|
204
|
-
|
|
205
|
-
new_msg = dict(msg)
|
|
206
|
-
new_msg["content"] = new_content
|
|
207
|
-
new_messages.append(new_msg)
|
|
208
|
-
|
|
209
|
-
return new_messages, total_before, total_after, primary_strategy
|
|
210
|
-
|
|
211
|
-
def _compress_content_block(
|
|
212
|
-
self,
|
|
213
|
-
content: Any,
|
|
214
|
-
aggressive: bool,
|
|
215
|
-
request_id: str,
|
|
216
|
-
model: str,
|
|
217
|
-
tenant_id: str,
|
|
218
|
-
is_proxy: bool = False,
|
|
219
|
-
) -> tuple[Any, int, int, str]:
|
|
220
|
-
if isinstance(content, str):
|
|
221
|
-
return self._compress_text(
|
|
222
|
-
content, aggressive, request_id, model, tenant_id, is_proxy=is_proxy
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
if isinstance(content, list):
|
|
226
|
-
new_blocks: list[Any] = []
|
|
227
|
-
total_before = 0
|
|
228
|
-
total_after = 0
|
|
229
|
-
primary = "none"
|
|
230
|
-
for block in content:
|
|
231
|
-
if not isinstance(block, dict):
|
|
232
|
-
new_blocks.append(block)
|
|
233
|
-
continue
|
|
234
|
-
block_type = block.get("type", "")
|
|
235
|
-
if block_type in ("text", "tool_result"):
|
|
236
|
-
text = block.get("text", "") or _tool_result_text(block)
|
|
237
|
-
if len(text) < _MIN_CHARS_FOR_COMPRESSION:
|
|
238
|
-
new_blocks.append(block)
|
|
239
|
-
continue
|
|
240
|
-
new_text, before, after, strat = self._compress_text(
|
|
241
|
-
text, aggressive, request_id, model, tenant_id,
|
|
242
|
-
is_proxy=is_proxy,
|
|
243
|
-
)
|
|
244
|
-
total_before += before
|
|
245
|
-
total_after += after
|
|
246
|
-
if strat != "none":
|
|
247
|
-
primary = strat
|
|
248
|
-
new_block = dict(block)
|
|
249
|
-
if block_type == "text":
|
|
250
|
-
new_block["text"] = new_text
|
|
251
|
-
else:
|
|
252
|
-
new_block = _set_tool_result_text(new_block, new_text)
|
|
253
|
-
new_blocks.append(new_block)
|
|
254
|
-
else:
|
|
255
|
-
new_blocks.append(block)
|
|
256
|
-
return new_blocks, total_before, total_after, primary
|
|
257
|
-
|
|
258
|
-
return content, 0, 0, "none"
|
|
259
|
-
|
|
260
|
-
def _compress_text(
|
|
261
|
-
self,
|
|
262
|
-
text: str,
|
|
263
|
-
aggressive: bool,
|
|
264
|
-
request_id: str,
|
|
265
|
-
model: str,
|
|
266
|
-
tenant_id: str,
|
|
267
|
-
is_proxy: bool = False,
|
|
268
|
-
) -> tuple[str, int, int, str]:
|
|
269
|
-
tokens_before = _token_estimate(text)
|
|
270
|
-
|
|
271
|
-
if len(text) < _MIN_CHARS_FOR_COMPRESSION:
|
|
272
|
-
return text, tokens_before, tokens_before, "none"
|
|
273
|
-
|
|
274
|
-
# K-01 refined (P4a): structured JSON is never *lossily* compressed, but it
|
|
275
|
-
# IS losslessly minified — parse → reserialize with no insignificant
|
|
276
|
-
# whitespace, which preserves the exact parsed value (see _json_minify for
|
|
277
|
-
# the duplicate-key + round-trip guards that keep it provably lossless).
|
|
278
|
-
# Code is still passed through untouched below.
|
|
279
|
-
stripped = text.strip()
|
|
280
|
-
if stripped.startswith(("{", "[")):
|
|
281
|
-
_last = stripped[-1]
|
|
282
|
-
bracket_matched = (
|
|
283
|
-
(stripped[0] == "{" and _last == "}")
|
|
284
|
-
or (stripped[0] == "[" and _last == "]")
|
|
285
|
-
)
|
|
286
|
-
# PERF-02: over the size cap, a bracket-matched payload is assumed
|
|
287
|
-
# structured and skipped — avoids a pathological parse on the hot path.
|
|
288
|
-
if len(stripped) > _MAX_JSON_MINIFY_CHARS and bracket_matched:
|
|
289
|
-
return text, tokens_before, tokens_before, "none"
|
|
290
|
-
minified = _json_minify(stripped)
|
|
291
|
-
if minified is not None:
|
|
292
|
-
return minified, tokens_before, _token_estimate(minified), "json_minify"
|
|
293
|
-
# Not shrinkable: already-compact valid JSON passes through (K-01);
|
|
294
|
-
# anything that is not valid JSON falls through to prose/code handling.
|
|
295
|
-
try:
|
|
296
|
-
json.loads(stripped)
|
|
297
|
-
return text, tokens_before, tokens_before, "none" # already-compact JSON
|
|
298
|
-
except (json.JSONDecodeError, ValueError):
|
|
299
|
-
pass # not valid JSON — treat as prose
|
|
300
|
-
except RecursionError:
|
|
301
|
-
return text, tokens_before, tokens_before, "none" # pathological nesting
|
|
302
|
-
|
|
303
|
-
if _detect_language(text) is not None:
|
|
304
|
-
return text, tokens_before, tokens_before, "none" # code → passthrough
|
|
305
|
-
|
|
306
|
-
# Layer 1 — lossless whitespace normalization (always-on, safe)
|
|
307
|
-
normalized = self._normalize_whitespace(text)
|
|
308
|
-
tokens_after_l1 = _token_estimate(normalized)
|
|
309
|
-
|
|
310
|
-
# Layer 2 — LLMLingua-2 prose compression (aggressive + opt-in only)
|
|
311
|
-
# D5-B: proxy path SKIPS Layer 2 entirely — only Layer 1 lossless normalize
|
|
312
|
-
# runs on proxy (ProxyRequest has no response/rehydration hook for CCR markers).
|
|
313
|
-
cfg = self._get_config()
|
|
314
|
-
prose_enabled = bool(getattr(cfg, "compress_prose", False))
|
|
315
|
-
if aggressive and prose_enabled and not is_proxy: # pragma: no cover — LLMLingua optional dep
|
|
316
|
-
compressor = self._get_llmlingua_compressor()
|
|
317
|
-
if compressor is not None:
|
|
318
|
-
# D6: compress FIRST, store ONLY inside the reduction branch.
|
|
319
|
-
# Old code stored before compress → orphan row when no reduction occurred.
|
|
320
|
-
compressed = compressor.compress(normalized)
|
|
321
|
-
tokens_after_l2 = _token_estimate(compressed)
|
|
322
|
-
if tokens_after_l2 < tokens_before:
|
|
323
|
-
# Reduction confirmed — now safe to store (no orphan possible)
|
|
324
|
-
ccr_id = self._ccr_store_original(text.encode(), model, tenant_id)
|
|
325
|
-
if ccr_id:
|
|
326
|
-
self._ccr_update_compressed(ccr_id, compressed.encode())
|
|
327
|
-
logger.info(
|
|
328
|
-
"[%s] LLMLingua-2 prose compressed rate=%.2f ccr_id=%s (LOSSY)",
|
|
329
|
-
request_id,
|
|
330
|
-
tokens_after_l2 / tokens_before if tokens_before else 1.0,
|
|
331
|
-
ccr_id,
|
|
332
|
-
)
|
|
333
|
-
return compressed, tokens_before, tokens_after_l2, "llmlingua2_prose"
|
|
334
|
-
# CCR store FAILED → no recoverable id. Returning the lossy form
|
|
335
|
-
# now would destroy the original irreversibly. Refuse it and fall
|
|
336
|
-
# through to lossless Layer 1 (data-safety over compression ratio).
|
|
337
|
-
logger.warning(
|
|
338
|
-
"[%s] CCR store failed — refusing irreversible lossy "
|
|
339
|
-
"compression, falling back to lossless Layer 1", request_id,
|
|
340
|
-
)
|
|
341
|
-
# No reduction (or store-failed) — fall through to lossless Layer 1.
|
|
342
|
-
|
|
343
|
-
# S-01 fix: compare character length, not word count.
|
|
344
|
-
# _token_estimate() is word-count — whitespace normalization saves characters/bytes
|
|
345
|
-
# but never removes words, so token counts are identical before and after Layer 1.
|
|
346
|
-
# Character comparison correctly detects when normalization reduced the body size.
|
|
347
|
-
if len(normalized) < len(text):
|
|
348
|
-
return normalized, tokens_before, tokens_after_l1, "normalize"
|
|
349
|
-
|
|
350
|
-
return text, tokens_before, tokens_before, "none"
|
|
351
|
-
|
|
352
|
-
@staticmethod
|
|
353
|
-
def _normalize_whitespace(text: str) -> str:
|
|
354
|
-
"""Layer 1 safe: collapse runs of 3+ blank lines to a single blank line.
|
|
355
|
-
|
|
356
|
-
v3.6.12 (normalize-1): no longer rstrips trailing spaces per line — that
|
|
357
|
-
is LOSSY for Markdown hard breaks (two trailing spaces) and padded string
|
|
358
|
-
literals, which broke the 'lossless/safe' guarantee that callers (incl.
|
|
359
|
-
slm_compress mode=normalize) rely on. Only collapsing excess blank lines
|
|
360
|
-
remains, which is semantically safe.
|
|
361
|
-
"""
|
|
362
|
-
import re
|
|
363
|
-
return re.sub(r"\n{3,}", "\n\n", text)
|
|
364
|
-
|
|
365
|
-
# ── Lazy loaders ─────────────────────────────────────────────────────
|
|
366
|
-
|
|
367
|
-
def _get_llmlingua_compressor(self) -> "LLMLinguaCompressor | None": # pragma: no cover
|
|
368
|
-
if self._llmlingua_compressor is None:
|
|
369
|
-
try:
|
|
370
|
-
from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor
|
|
371
|
-
self._llmlingua_compressor = LLMLinguaCompressor()
|
|
372
|
-
except ImportError:
|
|
373
|
-
logger.warning("LLMLinguaCompressor not available — prose compression disabled")
|
|
374
|
-
return None
|
|
375
|
-
return self._llmlingua_compressor
|
|
376
|
-
|
|
377
|
-
def _get_ccr_store(self) -> "CCRStore":
|
|
378
|
-
if self._ccr_store is None:
|
|
379
|
-
from superlocalmemory.optimize.compress.ccr import CCRStore
|
|
380
|
-
self._ccr_store = CCRStore()
|
|
381
|
-
return self._ccr_store
|
|
382
|
-
|
|
383
|
-
def _get_aligner(self) -> "CacheAligner":
|
|
384
|
-
if self._aligner is None:
|
|
385
|
-
from superlocalmemory.optimize.compress.align import CacheAligner
|
|
386
|
-
self._aligner = CacheAligner()
|
|
387
|
-
return self._aligner
|
|
388
|
-
|
|
389
|
-
def _get_config(self):
|
|
390
|
-
if self._config_store is None:
|
|
391
|
-
self._config_store = ConfigStore()
|
|
392
|
-
return self._config_store.get()
|
|
393
|
-
|
|
394
|
-
# ── CCR helpers ───────────────────────────────────────────────────────
|
|
395
|
-
|
|
396
|
-
def _ccr_store_original(self, original_bytes: bytes, model: str, tenant_id: str) -> str:
|
|
397
|
-
"""B-03: Store original BEFORE compression. Returns ccr_id or '' on failure."""
|
|
398
|
-
try:
|
|
399
|
-
store = self._get_ccr_store()
|
|
400
|
-
return store.store(original=original_bytes, model=model, tenant_id=tenant_id)
|
|
401
|
-
except Exception as exc:
|
|
402
|
-
logger.warning("CCR store failed (non-fatal): %s", exc)
|
|
403
|
-
return ""
|
|
404
|
-
|
|
405
|
-
def _ccr_update_compressed(self, ccr_id: str, compressed_bytes: bytes) -> None:
|
|
406
|
-
"""B-03: Update CCR row with compressed bytes after compression completes."""
|
|
407
|
-
try:
|
|
408
|
-
store = self._get_ccr_store()
|
|
409
|
-
store.update_compressed(ccr_id, compressed_bytes)
|
|
410
|
-
except Exception as exc:
|
|
411
|
-
logger.debug("CCR update_compressed failed (non-fatal): %s", exc)
|
|
412
|
-
|
|
413
|
-
def _ccr_delete(self, ccr_id: str) -> None:
|
|
414
|
-
"""Defensive delete — idempotent, never raises.
|
|
415
|
-
|
|
416
|
-
Used to clean up a CCR row if post-store processing fails. In the
|
|
417
|
-
store-after-success D6 path this should never be needed (no orphans
|
|
418
|
-
by construction), but kept as defensive infra + sweep parity.
|
|
419
|
-
"""
|
|
420
|
-
try:
|
|
421
|
-
store = self._get_ccr_store()
|
|
422
|
-
store.delete(ccr_id)
|
|
423
|
-
except Exception as exc:
|
|
424
|
-
logger.debug("CCR delete failed (non-fatal): %s", exc)
|
|
425
|
-
|
|
426
|
-
# ── Public convenience method (M-06) ──────────────────────────────────
|
|
427
|
-
|
|
428
|
-
def compress_text(self, text: str, strategy: str = "auto") -> "CompressTextResult":
|
|
429
|
-
"""Compress a single text blob (used by the slm_compress MCP tool). NEVER raises.
|
|
430
|
-
|
|
431
|
-
Honours ``compress_enabled``: when the operator has turned compression off
|
|
432
|
-
(``slm optimize off``) this is a pass-through, so the reported config state
|
|
433
|
-
and the tool's actual behaviour always agree (P4a config-honesty).
|
|
434
|
-
"""
|
|
435
|
-
try:
|
|
436
|
-
cfg = self._get_config()
|
|
437
|
-
if not getattr(cfg, "compress_enabled", False):
|
|
438
|
-
t = _token_estimate(text)
|
|
439
|
-
return CompressTextResult(
|
|
440
|
-
compressed_text=text, strategy="none",
|
|
441
|
-
tokens_before=t, tokens_after=t, lossy=False,
|
|
442
|
-
)
|
|
443
|
-
aggressive = cfg.compress_mode == "aggressive"
|
|
444
|
-
compressed, tb, ta, strat = self._compress_text(
|
|
445
|
-
text, aggressive, request_id="eval", model="", tenant_id="default"
|
|
446
|
-
)
|
|
447
|
-
return CompressTextResult(
|
|
448
|
-
compressed_text=compressed, strategy=strat,
|
|
449
|
-
tokens_before=tb, tokens_after=ta,
|
|
450
|
-
lossy=strat == "llmlingua2_prose",
|
|
451
|
-
)
|
|
452
|
-
except Exception as exc:
|
|
453
|
-
logger.debug("compress_text failed (non-fatal): %s", exc)
|
|
454
|
-
t = _token_estimate(text)
|
|
455
|
-
return CompressTextResult(
|
|
456
|
-
compressed_text=text, strategy="none",
|
|
457
|
-
tokens_before=t, tokens_after=t,
|
|
458
|
-
lossy=False,
|
|
459
|
-
)
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
@dataclass
|
|
463
|
-
class CompressTextResult:
|
|
464
|
-
"""Result of a compress_text() call.
|
|
465
|
-
|
|
466
|
-
UX-02 note: lossy=True only when strategy="llmlingua2_prose" (Layer 2).
|
|
467
|
-
In the default install (LLMLingua optional dep not installed), lossy is
|
|
468
|
-
always False — install `llmlingua>=0.2.0` and set compress_prose=True +
|
|
469
|
-
compress_mode="aggressive" to activate lossy compression.
|
|
470
|
-
|
|
471
|
-
L2 note: this result is produced by the NON-proxy compress_text() path,
|
|
472
|
-
where Layer 2 (lossy) can apply. The LIVE proxy path
|
|
473
|
-
(_compress_messages(is_proxy=True)) DISABLES Layer 2 by design (D5-B) so
|
|
474
|
-
real LLM traffic is never lossily rewritten — so proxy-path compression
|
|
475
|
-
will never report strategy="llmlingua2_prose"/lossy=True regardless of
|
|
476
|
-
compress_prose/compress_mode.
|
|
477
|
-
"""
|
|
478
|
-
compressed_text: str
|
|
479
|
-
strategy: str # "normalize" | "llmlingua2_prose" | "none"
|
|
480
|
-
tokens_before: int
|
|
481
|
-
tokens_after: int
|
|
482
|
-
lossy: bool = False # K-10: True only for llmlingua2_prose (Layer 2)
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
# ── Module-level helpers ──────────────────────────────────────────────────────
|
|
486
|
-
|
|
487
|
-
def _token_estimate(text: str) -> int:
|
|
488
|
-
return len(text.split()) if text else 0
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
def _reject_duplicate_keys(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
|
|
492
|
-
"""object_pairs_hook that refuses JSON objects with duplicate keys.
|
|
493
|
-
|
|
494
|
-
Reserializing ``{"a":1,"a":2}`` keeps only the last value, which is lossy —
|
|
495
|
-
so we bail on such inputs rather than silently drop data. Applied at every
|
|
496
|
-
nesting level by json.loads.
|
|
497
|
-
"""
|
|
498
|
-
seen: set[str] = set()
|
|
499
|
-
for key, _ in pairs:
|
|
500
|
-
if key in seen:
|
|
501
|
-
raise ValueError("duplicate JSON object key")
|
|
502
|
-
seen.add(key)
|
|
503
|
-
return dict(pairs)
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
def _reject_nonfinite(_constant: str) -> None:
|
|
507
|
-
"""parse_constant hook that refuses NaN / Infinity / -Infinity.
|
|
508
|
-
|
|
509
|
-
These are not valid standard JSON and reserializing them would emit a
|
|
510
|
-
non-standard token a strict downstream parser could reject — so we pass the
|
|
511
|
-
original through untouched rather than rewrite it.
|
|
512
|
-
"""
|
|
513
|
-
raise ValueError(f"non-finite JSON constant: {_constant}")
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
def _json_minify(text: str) -> str | None:
|
|
517
|
-
"""Losslessly minify a JSON document by removing insignificant whitespace.
|
|
518
|
-
|
|
519
|
-
Returns the compact form ONLY when it is strictly shorter than ``text`` AND
|
|
520
|
-
provably round-trips to the same parsed value; otherwise ``None`` (the caller
|
|
521
|
-
passes the original through untouched). Pure stdlib, zero-LLM — safe in every
|
|
522
|
-
mode including Mode A.
|
|
523
|
-
|
|
524
|
-
Losslessness guards:
|
|
525
|
-
- duplicate object keys are rejected (reserialization would drop data);
|
|
526
|
-
- NaN / Infinity constants are rejected (non-standard, reserialization risk);
|
|
527
|
-
- the compact form is re-parsed and compared to the original value as a
|
|
528
|
-
final belt-and-suspenders check before any rewrite is accepted.
|
|
529
|
-
"""
|
|
530
|
-
stripped = text.strip()
|
|
531
|
-
if not stripped or stripped[0] not in "{[":
|
|
532
|
-
return None
|
|
533
|
-
try:
|
|
534
|
-
value = json.loads(
|
|
535
|
-
stripped,
|
|
536
|
-
object_pairs_hook=_reject_duplicate_keys,
|
|
537
|
-
parse_constant=_reject_nonfinite,
|
|
538
|
-
)
|
|
539
|
-
compact = json.dumps(value, ensure_ascii=False, separators=(",", ":"))
|
|
540
|
-
if json.loads(compact) != value:
|
|
541
|
-
return None # representation not stable → do not rewrite
|
|
542
|
-
except (ValueError, RecursionError):
|
|
543
|
-
return None
|
|
544
|
-
return compact if len(compact) < len(text) else None
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
def _msg_has_tool_result(msg: dict) -> bool:
|
|
548
|
-
"""B-09: Detect historical tool_result blocks in messages."""
|
|
549
|
-
content = msg.get("content", "")
|
|
550
|
-
if isinstance(content, list):
|
|
551
|
-
for block in content:
|
|
552
|
-
if not isinstance(block, dict):
|
|
553
|
-
continue
|
|
554
|
-
if block.get("type") == "tool_result":
|
|
555
|
-
return True
|
|
556
|
-
if "tool_use_id" in block:
|
|
557
|
-
return True
|
|
558
|
-
return False
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
def _detect_language(text: str) -> str | None:
|
|
562
|
-
"""Detect programming language. Returns None if ambiguous.
|
|
563
|
-
|
|
564
|
-
B-11: Line-start anchored regex. Threshold = 3 signal lines.
|
|
565
|
-
"""
|
|
566
|
-
import re
|
|
567
|
-
|
|
568
|
-
if not text or len(text) < 50:
|
|
569
|
-
return None
|
|
570
|
-
|
|
571
|
-
lines = text.split("\n", 30)
|
|
572
|
-
|
|
573
|
-
if lines and lines[0].startswith("#!"):
|
|
574
|
-
shebang = lines[0].lower()
|
|
575
|
-
if "python" in shebang:
|
|
576
|
-
return "python"
|
|
577
|
-
if "node" in shebang or "javascript" in shebang:
|
|
578
|
-
return "javascript"
|
|
579
|
-
|
|
580
|
-
if lines and lines[0].startswith("```"):
|
|
581
|
-
lang_hint = lines[0][3:].strip().lower()
|
|
582
|
-
_KNOWN = {"python", "javascript", "js", "typescript", "ts", "go", "rust", "java", "cpp", "c++", "c"}
|
|
583
|
-
if lang_hint in _KNOWN:
|
|
584
|
-
if lang_hint in ("cpp", "c++"):
|
|
585
|
-
return "cpp"
|
|
586
|
-
if lang_hint in ("js", "typescript", "ts"):
|
|
587
|
-
return "javascript"
|
|
588
|
-
return lang_hint
|
|
589
|
-
|
|
590
|
-
_LANG_PATTERNS: dict[str, list[str]] = {
|
|
591
|
-
"python": [
|
|
592
|
-
r"^\s*(async\s+)?def\s+\w+\s*\(",
|
|
593
|
-
r"^\s*class\s+\w+[\s:(]",
|
|
594
|
-
r"^\s*import\s+\w+",
|
|
595
|
-
r"^\s*from\s+\w+\s+import\s+",
|
|
596
|
-
],
|
|
597
|
-
"javascript": [
|
|
598
|
-
r"^\s*(async\s+)?function\s+\w+\s*\(",
|
|
599
|
-
r"^\s*class\s+\w+(\s+extends)?",
|
|
600
|
-
r"^\s*const\s+\w+\s*=",
|
|
601
|
-
r"^\s*import\s+.+from\s+['\"]",
|
|
602
|
-
r"^\s*export\s+(default\s+|const\s+|class\s+)",
|
|
603
|
-
],
|
|
604
|
-
"go": [
|
|
605
|
-
r"^\s*func\s+(\(\w[\w\s\*]*\)\s+)?\w+\s*\(",
|
|
606
|
-
r"^\s*package\s+\w+",
|
|
607
|
-
r"^\s*import\s+[\(\"\`]",
|
|
608
|
-
r"^\s*type\s+\w+\s+(struct|interface)\s*\{",
|
|
609
|
-
],
|
|
610
|
-
"rust": [
|
|
611
|
-
r"^\s*(pub\s+)?(async\s+)?fn\s+\w+",
|
|
612
|
-
r"^\s*use\s+\w+",
|
|
613
|
-
r"^\s*(pub\s+)?struct\s+\w+",
|
|
614
|
-
r"^\s*impl(\s+\w+)?\s+",
|
|
615
|
-
],
|
|
616
|
-
"java": [
|
|
617
|
-
r"^\s*(public|private|protected)\s+(static\s+)?\w+\s+\w+\s*\(",
|
|
618
|
-
r"^\s*import\s+[\w\.]+;",
|
|
619
|
-
r"^\s*(public|private|protected)?\s*class\s+\w+",
|
|
620
|
-
],
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
def _count_signals(patterns: list[str]) -> int:
|
|
624
|
-
count = 0
|
|
625
|
-
for line in lines:
|
|
626
|
-
for pat in patterns:
|
|
627
|
-
if re.search(pat, line):
|
|
628
|
-
count += 1
|
|
629
|
-
break
|
|
630
|
-
return count
|
|
631
|
-
|
|
632
|
-
scores: dict[str, int] = {
|
|
633
|
-
lang: _count_signals(patterns)
|
|
634
|
-
for lang, patterns in _LANG_PATTERNS.items()
|
|
635
|
-
}
|
|
636
|
-
best_lang, best_score = max(scores.items(), key=lambda kv: kv[1])
|
|
637
|
-
if best_score >= 3:
|
|
638
|
-
return best_lang
|
|
639
|
-
|
|
640
|
-
return None
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
def _tool_result_text(block: dict) -> str:
|
|
644
|
-
content = block.get("content", "")
|
|
645
|
-
if isinstance(content, str):
|
|
646
|
-
return content
|
|
647
|
-
if isinstance(content, list):
|
|
648
|
-
parts = [b.get("text", "") for b in content if isinstance(b, dict) and b.get("type") == "text"]
|
|
649
|
-
return "\n".join(parts)
|
|
650
|
-
return ""
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
def _set_tool_result_text(block: dict, new_text: str) -> dict:
|
|
654
|
-
content = block.get("content", "")
|
|
655
|
-
if isinstance(content, str):
|
|
656
|
-
return {**block, "content": new_text}
|
|
657
|
-
if isinstance(content, list):
|
|
658
|
-
new_content = []
|
|
659
|
-
replaced = False
|
|
660
|
-
for b in content:
|
|
661
|
-
if not replaced and isinstance(b, dict) and b.get("type") == "text":
|
|
662
|
-
new_content.append({**b, "text": new_text})
|
|
663
|
-
replaced = True
|
|
664
|
-
else:
|
|
665
|
-
new_content.append(b)
|
|
666
|
-
return {**block, "content": new_content}
|
|
667
|
-
return block
|