superlocalmemory 4.1.13 → 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +103 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory v3.4.22 — LLD-05 §2, §4.4, §9.3
|
|
4
|
-
|
|
5
|
-
"""Cross-platform adapter base — shared Protocol and atomic write primitive.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Every adapter (Cursor, Antigravity, Copilot) implements the ``Adapter``
|
|
9
|
-
Protocol. The shared ``_atomic_write`` primitive enforces the hard-rule
|
|
10
|
-
matrix (A1–A3, A7): ``safe_resolve`` + ``O_NOFOLLOW`` + tempfile +
|
|
11
|
-
``os.replace`` + durable content-hash skip via ``cross_platform_sync_log``.
|
|
12
|
-
|
|
13
|
-
Hard rules enforced here:
|
|
14
|
-
- A1: every write goes through ``safe_resolve``; POSIX uses ``O_NOFOLLOW``.
|
|
15
|
-
- A2: atomic replace via tempfile → ``os.replace``.
|
|
16
|
-
- A3: durable content-hash skip — previous ``content_sha256`` comes from
|
|
17
|
-
the DB, so this survives daemon restarts.
|
|
18
|
-
- A7: sync log records ``target_path_sha256`` (full 64-hex, no truncation)
|
|
19
|
-
+ ``target_basename``; never the raw absolute path string.
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
from __future__ import annotations
|
|
23
|
-
|
|
24
|
-
import hashlib
|
|
25
|
-
import os
|
|
26
|
-
import sqlite3
|
|
27
|
-
from dataclasses import dataclass
|
|
28
|
-
from datetime import datetime, timezone
|
|
29
|
-
from pathlib import Path
|
|
30
|
-
from typing import Protocol, runtime_checkable
|
|
31
|
-
|
|
32
|
-
from superlocalmemory.storage.write_lock import get_write_lock
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# ---------------------------------------------------------------------------
|
|
36
|
-
# Constants
|
|
37
|
-
# ---------------------------------------------------------------------------
|
|
38
|
-
|
|
39
|
-
HARD_BYTES_CAP = 4096
|
|
40
|
-
# Soft budget for the managed instruction block. Raised 2048 -> 2560 -> 2816 as
|
|
41
|
-
# the block grew to carry the memory, token-optimization, and (compact)
|
|
42
|
-
# bounded-loop protocols; the 4 KB hard cap still bounds total size (recall
|
|
43
|
-
# content is truncated to stay under it).
|
|
44
|
-
COPILOT_SOFT_BYTES = 2816
|
|
45
|
-
TRUNCATION_MARKER = b"\n<!-- truncated -->"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# ---------------------------------------------------------------------------
|
|
49
|
-
# Protocol
|
|
50
|
-
# ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
@runtime_checkable
|
|
54
|
-
class Adapter(Protocol):
|
|
55
|
-
"""Contract every cross-platform adapter implements."""
|
|
56
|
-
|
|
57
|
-
name: str
|
|
58
|
-
|
|
59
|
-
@property
|
|
60
|
-
def target_path(self) -> Path: ...
|
|
61
|
-
|
|
62
|
-
def is_active(self) -> bool: ...
|
|
63
|
-
|
|
64
|
-
def sync(self) -> bool: ...
|
|
65
|
-
|
|
66
|
-
def disable(self) -> None: ...
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
# ---------------------------------------------------------------------------
|
|
70
|
-
# Sync-log helpers (LLD-07 M004 canonical columns)
|
|
71
|
-
# ---------------------------------------------------------------------------
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def path_sha256(path: Path) -> str:
|
|
75
|
-
"""SHA-256 of the absolute path string, full 64-hex (never truncated)."""
|
|
76
|
-
# The identity must not depend on whether the target exists. On Windows,
|
|
77
|
-
# Path.resolve() can normalize an existing path differently from the same
|
|
78
|
-
# not-yet-created path, changing the sync-log key after the first write.
|
|
79
|
-
canonical = os.path.normcase(os.path.abspath(os.fspath(path)))
|
|
80
|
-
return hashlib.sha256(canonical.encode("utf-8")).hexdigest()
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def _now_iso() -> str:
|
|
84
|
-
return datetime.now(timezone.utc).isoformat()
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def _ensure_memory_log(db_path: Path) -> None:
|
|
88
|
-
"""Lazily create ``cross_platform_sync_log`` if a test-mode memory.db is
|
|
89
|
-
fresh. Production code goes through the migration runner, but tests can
|
|
90
|
-
hand us an empty DB; this keeps adapters usable without pre-running
|
|
91
|
-
migrations.
|
|
92
|
-
|
|
93
|
-
Acquires the process-level write lock for *db_path* before opening
|
|
94
|
-
a sqlite3 connection so that this DDL write is serialised with all
|
|
95
|
-
other in-process writers (DatabaseManager, VectorStore, etc.).
|
|
96
|
-
"""
|
|
97
|
-
with get_write_lock(db_path):
|
|
98
|
-
conn = sqlite3.connect(str(db_path))
|
|
99
|
-
try:
|
|
100
|
-
conn.executescript(
|
|
101
|
-
"CREATE TABLE IF NOT EXISTS cross_platform_sync_log ("
|
|
102
|
-
" adapter_name TEXT NOT NULL,"
|
|
103
|
-
" profile_id TEXT NOT NULL,"
|
|
104
|
-
" target_path_sha256 TEXT NOT NULL,"
|
|
105
|
-
" target_basename TEXT NOT NULL,"
|
|
106
|
-
" last_sync_at TEXT NOT NULL,"
|
|
107
|
-
" bytes_written INTEGER NOT NULL,"
|
|
108
|
-
" content_sha256 TEXT NOT NULL,"
|
|
109
|
-
" success INTEGER NOT NULL,"
|
|
110
|
-
" error_msg TEXT,"
|
|
111
|
-
" PRIMARY KEY (adapter_name, target_path_sha256));"
|
|
112
|
-
)
|
|
113
|
-
conn.commit()
|
|
114
|
-
finally:
|
|
115
|
-
conn.close()
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def sync_log_last_content_sha256(
|
|
119
|
-
db_path: Path, adapter_name: str, target_path_sha256: str,
|
|
120
|
-
) -> str | None:
|
|
121
|
-
"""Read last successful ``content_sha256`` for this (adapter, path)."""
|
|
122
|
-
if not db_path.exists():
|
|
123
|
-
return None
|
|
124
|
-
_ensure_memory_log(db_path)
|
|
125
|
-
conn = sqlite3.connect(str(db_path))
|
|
126
|
-
try:
|
|
127
|
-
row = conn.execute(
|
|
128
|
-
"SELECT content_sha256, success FROM cross_platform_sync_log "
|
|
129
|
-
"WHERE adapter_name = ? AND target_path_sha256 = ?",
|
|
130
|
-
(adapter_name, target_path_sha256),
|
|
131
|
-
).fetchone()
|
|
132
|
-
except sqlite3.Error:
|
|
133
|
-
return None
|
|
134
|
-
finally:
|
|
135
|
-
conn.close()
|
|
136
|
-
if row is None:
|
|
137
|
-
return None
|
|
138
|
-
content_hash, success = row
|
|
139
|
-
if not success:
|
|
140
|
-
return None
|
|
141
|
-
return content_hash
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def sync_log_record(
|
|
145
|
-
db_path: Path,
|
|
146
|
-
*,
|
|
147
|
-
adapter_name: str,
|
|
148
|
-
profile_id: str,
|
|
149
|
-
target_path_sha256: str,
|
|
150
|
-
target_basename: str,
|
|
151
|
-
bytes_written: int,
|
|
152
|
-
content_sha256: str,
|
|
153
|
-
success: bool,
|
|
154
|
-
error_msg: str | None = None,
|
|
155
|
-
) -> None:
|
|
156
|
-
"""Upsert the canonical M004 row. Rule A7: hash is full 64 hex, no raw path.
|
|
157
|
-
|
|
158
|
-
Raises ``ValueError`` if caller attempts to sneak a raw absolute path into
|
|
159
|
-
``target_path_sha256`` (defence in depth for the CI grep guard).
|
|
160
|
-
"""
|
|
161
|
-
if len(target_path_sha256) != 64:
|
|
162
|
-
raise ValueError(
|
|
163
|
-
f"target_path_sha256 must be 64 hex chars, got {len(target_path_sha256)}"
|
|
164
|
-
)
|
|
165
|
-
if os.sep in target_path_sha256 or "/" in target_path_sha256:
|
|
166
|
-
raise ValueError("target_path_sha256 must be a hash, not a raw path")
|
|
167
|
-
# Acquire the process-level write lock BEFORE opening the sqlite3 connection.
|
|
168
|
-
# This ensures the INSERT/UPDATE below is serialised with all other in-process
|
|
169
|
-
# writers (DatabaseManager, VectorStore, consolidation) via the single shared
|
|
170
|
-
# RLock for memory.db, eliminating SQLITE_BUSY races at the WAL layer.
|
|
171
|
-
# _ensure_memory_log also acquires the same RLock (re-entrant — safe).
|
|
172
|
-
with get_write_lock(db_path):
|
|
173
|
-
_ensure_memory_log(db_path)
|
|
174
|
-
conn = sqlite3.connect(str(db_path))
|
|
175
|
-
try:
|
|
176
|
-
conn.execute(
|
|
177
|
-
"INSERT INTO cross_platform_sync_log ("
|
|
178
|
-
"adapter_name, profile_id, target_path_sha256, target_basename, "
|
|
179
|
-
"last_sync_at, bytes_written, content_sha256, success, error_msg"
|
|
180
|
-
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) "
|
|
181
|
-
"ON CONFLICT(adapter_name, target_path_sha256) DO UPDATE SET "
|
|
182
|
-
" profile_id = excluded.profile_id,"
|
|
183
|
-
" target_basename = excluded.target_basename,"
|
|
184
|
-
" last_sync_at = excluded.last_sync_at,"
|
|
185
|
-
" bytes_written = excluded.bytes_written,"
|
|
186
|
-
" content_sha256 = excluded.content_sha256,"
|
|
187
|
-
" success = excluded.success,"
|
|
188
|
-
" error_msg = excluded.error_msg",
|
|
189
|
-
(
|
|
190
|
-
adapter_name, profile_id, target_path_sha256, target_basename,
|
|
191
|
-
_now_iso(), bytes_written, content_sha256,
|
|
192
|
-
1 if success else 0, error_msg,
|
|
193
|
-
),
|
|
194
|
-
)
|
|
195
|
-
conn.commit()
|
|
196
|
-
finally:
|
|
197
|
-
conn.close()
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
# ---------------------------------------------------------------------------
|
|
201
|
-
# Atomic write with durable content-hash skip (A1, A2, A3, A7)
|
|
202
|
-
# ---------------------------------------------------------------------------
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
def _is_posix() -> bool:
|
|
206
|
-
return os.name == "posix"
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
@dataclass(frozen=True, slots=True)
|
|
210
|
-
class WriteResult:
|
|
211
|
-
"""Outcome of ``atomic_write``."""
|
|
212
|
-
wrote: bool
|
|
213
|
-
bytes_written: int
|
|
214
|
-
content_sha256: str
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
def atomic_write(
|
|
218
|
-
resolved_path: Path,
|
|
219
|
-
content: bytes,
|
|
220
|
-
*,
|
|
221
|
-
adapter_name: str,
|
|
222
|
-
profile_id: str,
|
|
223
|
-
sync_log_db: Path,
|
|
224
|
-
posix_mode: int = 0o600,
|
|
225
|
-
windows_mode: int = 0o644,
|
|
226
|
-
) -> WriteResult:
|
|
227
|
-
"""Atomic write with durable content-hash skip.
|
|
228
|
-
|
|
229
|
-
``resolved_path`` MUST already be a ``safe_resolve`` output. Passing a
|
|
230
|
-
raw user-controlled path bypasses the hard-rule A1 guarantee — adapters
|
|
231
|
-
are responsible for calling ``safe_resolve`` first (enforced by tests).
|
|
232
|
-
"""
|
|
233
|
-
new_hash = hashlib.sha256(content).hexdigest()
|
|
234
|
-
target_sha = path_sha256(resolved_path)
|
|
235
|
-
prev = sync_log_last_content_sha256(sync_log_db, adapter_name, target_sha)
|
|
236
|
-
|
|
237
|
-
if prev == new_hash and resolved_path.exists():
|
|
238
|
-
# Durable skip only if the on-disk content also matches the new hash.
|
|
239
|
-
# The sync-log row alone is not authoritative: the file may have been
|
|
240
|
-
# mutated out-of-band (e.g. ``git restore``, manual edit) since the
|
|
241
|
-
# last sync. Re-hash the file and re-write if it diverges.
|
|
242
|
-
try:
|
|
243
|
-
disk_hash = hashlib.sha256(resolved_path.read_bytes()).hexdigest()
|
|
244
|
-
except OSError:
|
|
245
|
-
disk_hash = None
|
|
246
|
-
if disk_hash == new_hash:
|
|
247
|
-
return WriteResult(wrote=False, bytes_written=0, content_sha256=new_hash)
|
|
248
|
-
|
|
249
|
-
resolved_path.parent.mkdir(parents=True, exist_ok=True)
|
|
250
|
-
tmp = resolved_path.with_suffix(resolved_path.suffix + ".slm-tmp")
|
|
251
|
-
|
|
252
|
-
flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
|
|
253
|
-
if hasattr(os, "O_NOFOLLOW") and _is_posix():
|
|
254
|
-
flags |= os.O_NOFOLLOW # SEC — POSIX refuses symlinks
|
|
255
|
-
if hasattr(os, "O_BINARY") and not _is_posix():
|
|
256
|
-
# Windows file descriptors default to text mode, which rewrites LF
|
|
257
|
-
# bytes as CRLF. The sync log hashes the caller's original bytes, so
|
|
258
|
-
# text-mode conversion makes an unchanged file look modified forever.
|
|
259
|
-
flags |= os.O_BINARY
|
|
260
|
-
|
|
261
|
-
mode = posix_mode if _is_posix() else windows_mode
|
|
262
|
-
fd = os.open(str(tmp), flags, mode)
|
|
263
|
-
try:
|
|
264
|
-
os.write(fd, content)
|
|
265
|
-
try:
|
|
266
|
-
os.fsync(fd)
|
|
267
|
-
except OSError: # pragma: no cover — exotic FS
|
|
268
|
-
pass
|
|
269
|
-
finally:
|
|
270
|
-
os.close(fd)
|
|
271
|
-
os.replace(tmp, resolved_path)
|
|
272
|
-
|
|
273
|
-
if _is_posix():
|
|
274
|
-
try:
|
|
275
|
-
os.chmod(resolved_path, posix_mode)
|
|
276
|
-
except OSError: # pragma: no cover
|
|
277
|
-
pass
|
|
278
|
-
|
|
279
|
-
sync_log_record(
|
|
280
|
-
sync_log_db,
|
|
281
|
-
adapter_name=adapter_name,
|
|
282
|
-
profile_id=profile_id,
|
|
283
|
-
target_path_sha256=target_sha,
|
|
284
|
-
target_basename=resolved_path.name,
|
|
285
|
-
bytes_written=len(content),
|
|
286
|
-
content_sha256=new_hash,
|
|
287
|
-
success=True,
|
|
288
|
-
error_msg=None,
|
|
289
|
-
)
|
|
290
|
-
return WriteResult(wrote=True, bytes_written=len(content),
|
|
291
|
-
content_sha256=new_hash)
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
def record_disable(
|
|
295
|
-
resolved_path: Path,
|
|
296
|
-
*,
|
|
297
|
-
adapter_name: str,
|
|
298
|
-
profile_id: str,
|
|
299
|
-
sync_log_db: Path,
|
|
300
|
-
) -> None:
|
|
301
|
-
"""Log a disable row (LLD-05 §9.4). File deletion is the caller's job."""
|
|
302
|
-
target_sha = path_sha256(resolved_path)
|
|
303
|
-
sync_log_record(
|
|
304
|
-
sync_log_db,
|
|
305
|
-
adapter_name=adapter_name,
|
|
306
|
-
profile_id=profile_id,
|
|
307
|
-
target_path_sha256=target_sha,
|
|
308
|
-
target_basename=resolved_path.name,
|
|
309
|
-
bytes_written=0,
|
|
310
|
-
content_sha256="0" * 64,
|
|
311
|
-
success=True,
|
|
312
|
-
error_msg="disabled_by_user",
|
|
313
|
-
)
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
def truncate_to_cap(content: bytes, *, cap: int = HARD_BYTES_CAP) -> bytes:
|
|
317
|
-
"""Truncate ``content`` to ``cap`` bytes, appending the marker.
|
|
318
|
-
|
|
319
|
-
Adapters call this AFTER domain-level truncation (trim sections) and
|
|
320
|
-
treat the marker as a last-resort safety net — not the primary cap
|
|
321
|
-
mechanism. Kept in the base module because all three adapters need it.
|
|
322
|
-
"""
|
|
323
|
-
if len(content) <= cap:
|
|
324
|
-
return content
|
|
325
|
-
marker = TRUNCATION_MARKER
|
|
326
|
-
# Leave room for the marker in the cap.
|
|
327
|
-
head = content[: max(0, cap - len(marker))]
|
|
328
|
-
return head + marker
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
__all__ = (
|
|
332
|
-
"Adapter",
|
|
333
|
-
"HARD_BYTES_CAP",
|
|
334
|
-
"COPILOT_SOFT_BYTES",
|
|
335
|
-
"TRUNCATION_MARKER",
|
|
336
|
-
"WriteResult",
|
|
337
|
-
"atomic_write",
|
|
338
|
-
"path_sha256",
|
|
339
|
-
"record_disable",
|
|
340
|
-
"sync_log_last_content_sha256",
|
|
341
|
-
"sync_log_record",
|
|
342
|
-
"truncate_to_cap",
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
# Internal platform flag used by adapters to choose permissions.
|
|
347
|
-
IS_POSIX = _is_posix()
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
# Part of SuperLocalMemory v3.4.22 — LLD-05 §5
|
|
4
|
-
|
|
5
|
-
"""Antigravity adapter — writes SKILL.md under singular ``.agent/skills/``.
|
|
6
|
-
|
|
7
|
-
LLD-05 §5. Verified path (verification-2026-04-17.md claim 4, Google
|
|
8
|
-
Codelabs): workspace = ``.agent/skills/slm-memory-adapter/SKILL.md``,
|
|
9
|
-
global = ``~/.gemini/antigravity/skills/slm-memory/SKILL.md``.
|
|
10
|
-
|
|
11
|
-
Hard rules covered here:
|
|
12
|
-
- A1 / A3 / A4 / A7: via ``adapter_base.atomic_write``.
|
|
13
|
-
- A6: singular ``.agent`` and canonical global path enforced by constants.
|
|
14
|
-
|
|
15
|
-
CI grep guards (banned substrings in this file and in ``hooks/``) are
|
|
16
|
-
documented in LLD-05 §13 — do not reproduce the literal banned tokens here
|
|
17
|
-
(otherwise a docstring trips the very grep guard that protects the module).
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
import logging
|
|
23
|
-
import os
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
|
|
26
|
-
from superlocalmemory.core.security_primitives import (
|
|
27
|
-
PathTraversalError,
|
|
28
|
-
safe_resolve,
|
|
29
|
-
)
|
|
30
|
-
from superlocalmemory.hooks.adapter_base import (
|
|
31
|
-
HARD_BYTES_CAP,
|
|
32
|
-
WriteResult,
|
|
33
|
-
atomic_write,
|
|
34
|
-
record_disable,
|
|
35
|
-
truncate_to_cap,
|
|
36
|
-
)
|
|
37
|
-
from superlocalmemory.hooks.context_payload import (
|
|
38
|
-
VERSION,
|
|
39
|
-
ContextPayload,
|
|
40
|
-
RecallFn,
|
|
41
|
-
)
|
|
42
|
-
from superlocalmemory.hooks.memory_protocol import memory_protocol_markdown
|
|
43
|
-
|
|
44
|
-
logger = logging.getLogger(__name__)
|
|
45
|
-
|
|
46
|
-
NAME_WORKSPACE = "antigravity_workspace"
|
|
47
|
-
NAME_GLOBAL = "antigravity_global"
|
|
48
|
-
|
|
49
|
-
# Canonical singular paths (Google Codelabs). Do NOT change to plural.
|
|
50
|
-
# Built from pieces so the CI grep for banned plural forms stays clean.
|
|
51
|
-
_AGENT = ".agent"
|
|
52
|
-
_SKILLS = "skills"
|
|
53
|
-
_WORKSPACE_SKILL_NAME = "slm-memory-adapter"
|
|
54
|
-
_GLOBAL_SKILL_NAME = "slm-memory"
|
|
55
|
-
|
|
56
|
-
WORKSPACE_REL = f"{_AGENT}/{_SKILLS}/{_WORKSPACE_SKILL_NAME}/SKILL.md"
|
|
57
|
-
GLOBAL_REL = f".gemini/antigravity/{_SKILLS}/{_GLOBAL_SKILL_NAME}/SKILL.md"
|
|
58
|
-
|
|
59
|
-
_FRONTMATTER = (
|
|
60
|
-
"---\n"
|
|
61
|
-
"name: slm-memory-adapter\n"
|
|
62
|
-
"description: \"SuperLocalMemory runtime MCP memory protocol.\"\n"
|
|
63
|
-
"---\n"
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
_BODY_TEMPLATE = (
|
|
67
|
-
"\n# SLM Runtime Memory Protocol\n\n"
|
|
68
|
-
"_Managed by SuperLocalMemory v{version}. This skill contains no recalled memory._\n\n"
|
|
69
|
-
"{protocol}"
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def render_antigravity(payload: ContextPayload | None = None) -> bytes:
|
|
74
|
-
body = _BODY_TEMPLATE.format(
|
|
75
|
-
version=payload.version if payload is not None else VERSION,
|
|
76
|
-
protocol=memory_protocol_markdown(),
|
|
77
|
-
)
|
|
78
|
-
return (_FRONTMATTER + body).encode("utf-8")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class AntigravityAdapter:
|
|
82
|
-
"""Workspace OR global Antigravity adapter."""
|
|
83
|
-
|
|
84
|
-
def __init__(
|
|
85
|
-
self,
|
|
86
|
-
*,
|
|
87
|
-
scope: str,
|
|
88
|
-
base_dir: Path,
|
|
89
|
-
sync_log_db: Path,
|
|
90
|
-
recall_fn: RecallFn,
|
|
91
|
-
profile_id: str = "default",
|
|
92
|
-
) -> None:
|
|
93
|
-
if scope not in ("workspace", "global"):
|
|
94
|
-
raise ValueError(
|
|
95
|
-
f"scope must be 'workspace'|'global', got {scope!r}"
|
|
96
|
-
)
|
|
97
|
-
self._scope = scope
|
|
98
|
-
self._base_dir = Path(base_dir)
|
|
99
|
-
self._sync_log_db = Path(sync_log_db)
|
|
100
|
-
self._recall_fn = recall_fn
|
|
101
|
-
self._profile_id = profile_id
|
|
102
|
-
self.name = NAME_WORKSPACE if scope == "workspace" else NAME_GLOBAL
|
|
103
|
-
self._inactive_until_retry = False
|
|
104
|
-
|
|
105
|
-
@property
|
|
106
|
-
def target_path(self) -> Path:
|
|
107
|
-
rel = WORKSPACE_REL if self._scope == "workspace" else GLOBAL_REL
|
|
108
|
-
return safe_resolve(self._base_dir, rel)
|
|
109
|
-
|
|
110
|
-
def is_active(self) -> bool:
|
|
111
|
-
if os.environ.get("SLM_ANTIGRAVITY_DISABLED") == "1":
|
|
112
|
-
return False
|
|
113
|
-
if self._inactive_until_retry:
|
|
114
|
-
return False
|
|
115
|
-
if os.environ.get("SLM_ANTIGRAVITY_FORCE") == "1":
|
|
116
|
-
return True
|
|
117
|
-
if os.environ.get("SLM_ADAPTER_FORCE_ANTIGRAVITY") == "1":
|
|
118
|
-
return True
|
|
119
|
-
home = Path.home()
|
|
120
|
-
candidates = (
|
|
121
|
-
home / ".gemini" / "antigravity",
|
|
122
|
-
home / "Library" / "Application Support" / "Google" / "Antigravity",
|
|
123
|
-
)
|
|
124
|
-
return any(p.is_dir() for p in candidates)
|
|
125
|
-
|
|
126
|
-
def sync(self) -> bool:
|
|
127
|
-
try:
|
|
128
|
-
resolved = self.target_path
|
|
129
|
-
except PathTraversalError:
|
|
130
|
-
logger.warning("antigravity: path-traversal refused")
|
|
131
|
-
self._inactive_until_retry = True
|
|
132
|
-
return False
|
|
133
|
-
|
|
134
|
-
rendered = render_antigravity()
|
|
135
|
-
rendered = truncate_to_cap(rendered, cap=HARD_BYTES_CAP)
|
|
136
|
-
|
|
137
|
-
result: WriteResult = atomic_write(
|
|
138
|
-
resolved, rendered,
|
|
139
|
-
adapter_name=self.name,
|
|
140
|
-
profile_id=self._profile_id,
|
|
141
|
-
sync_log_db=self._sync_log_db,
|
|
142
|
-
)
|
|
143
|
-
return result.wrote
|
|
144
|
-
|
|
145
|
-
def disable(self) -> None:
|
|
146
|
-
try:
|
|
147
|
-
resolved = self.target_path
|
|
148
|
-
except PathTraversalError:
|
|
149
|
-
return
|
|
150
|
-
if resolved.exists():
|
|
151
|
-
try:
|
|
152
|
-
resolved.unlink()
|
|
153
|
-
except OSError: # pragma: no cover
|
|
154
|
-
pass
|
|
155
|
-
record_disable(
|
|
156
|
-
resolved,
|
|
157
|
-
adapter_name=self.name,
|
|
158
|
-
profile_id=self._profile_id,
|
|
159
|
-
sync_log_db=self._sync_log_db,
|
|
160
|
-
)
|
|
161
|
-
self._inactive_until_retry = True
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
__all__ = (
|
|
165
|
-
"AntigravityAdapter",
|
|
166
|
-
"GLOBAL_REL",
|
|
167
|
-
"NAME_GLOBAL",
|
|
168
|
-
"NAME_WORKSPACE",
|
|
169
|
-
"WORKSPACE_REL",
|
|
170
|
-
"render_antigravity",
|
|
171
|
-
)
|
|
@@ -1,133 +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
|
-
"""Auto-capture — detect and store important information automatically."""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
import re
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
from typing import Any, Callable
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
# Patterns that indicate capture-worthy content
|
|
17
|
-
_DECISION_PATTERNS = [
|
|
18
|
-
r"(?i)\b(decided|chose|picked|selected|went with|using|switched to)\b",
|
|
19
|
-
r"(?i)\b(because|reason|rationale|due to|since)\b.*\b(chose|use|prefer)\b",
|
|
20
|
-
]
|
|
21
|
-
|
|
22
|
-
_BUG_PATTERNS = [
|
|
23
|
-
r"(?i)\b(fixed|resolved|solved|root cause|bug|issue|error)\b",
|
|
24
|
-
r"(?i)\b(the (?:fix|solution|problem) (?:was|is))\b",
|
|
25
|
-
]
|
|
26
|
-
|
|
27
|
-
_PREFERENCE_PATTERNS = [
|
|
28
|
-
r"(?i)\b(prefer|always use|never use|I like|I hate|don't like)\b",
|
|
29
|
-
r"(?i)\b(convention|standard|style|pattern)\b.*\b(is|should be|must be)\b",
|
|
30
|
-
]
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@dataclass(frozen=True)
|
|
34
|
-
class CaptureDecision:
|
|
35
|
-
"""Result of evaluating content for auto-capture."""
|
|
36
|
-
|
|
37
|
-
capture: bool
|
|
38
|
-
confidence: float
|
|
39
|
-
category: str # "decision", "bug", "preference", "session_summary", "none"
|
|
40
|
-
reason: str
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class AutoCapture:
|
|
44
|
-
"""Detect and classify content for automatic storage.
|
|
45
|
-
|
|
46
|
-
Two ways to wire the store side:
|
|
47
|
-
|
|
48
|
-
- Pass ``engine=<MemoryEngine>`` (CLI/daemon path — historical shape).
|
|
49
|
-
- Pass ``store_fn=<callable>`` (MCP/LIGHT path — the callable should
|
|
50
|
-
match ``MemoryEngine.store(content, metadata=...)`` and return a
|
|
51
|
-
list of fact ids). When both are supplied, ``store_fn`` wins.
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
def __init__(
|
|
55
|
-
self,
|
|
56
|
-
engine=None,
|
|
57
|
-
config: dict | None = None,
|
|
58
|
-
*,
|
|
59
|
-
store_fn: Callable[..., Any] | None = None,
|
|
60
|
-
):
|
|
61
|
-
self._engine = engine
|
|
62
|
-
self._store_fn = store_fn
|
|
63
|
-
self._config = config or {}
|
|
64
|
-
self._enabled = self._config.get("enabled", True)
|
|
65
|
-
self._min_confidence = self._config.get("min_confidence", 0.5)
|
|
66
|
-
self._capture_decisions = self._config.get("capture_decisions", True)
|
|
67
|
-
self._capture_bugs = self._config.get("capture_bugs", True)
|
|
68
|
-
self._capture_preferences = self._config.get("capture_preferences", True)
|
|
69
|
-
|
|
70
|
-
def evaluate(self, content: str) -> CaptureDecision:
|
|
71
|
-
"""Evaluate whether content should be auto-captured.
|
|
72
|
-
|
|
73
|
-
Returns a CaptureDecision with capture=True/False,
|
|
74
|
-
confidence score, and category.
|
|
75
|
-
"""
|
|
76
|
-
if not self._enabled:
|
|
77
|
-
return CaptureDecision(False, 0.0, "none", "auto-capture disabled")
|
|
78
|
-
|
|
79
|
-
if len(content.strip()) < 20:
|
|
80
|
-
return CaptureDecision(False, 0.0, "none", "content too short")
|
|
81
|
-
|
|
82
|
-
# Check for decisions
|
|
83
|
-
if self._capture_decisions:
|
|
84
|
-
score = self._match_patterns(content, _DECISION_PATTERNS)
|
|
85
|
-
if score >= self._min_confidence:
|
|
86
|
-
return CaptureDecision(True, score, "decision", "decision pattern detected")
|
|
87
|
-
|
|
88
|
-
# Check for bug fixes
|
|
89
|
-
if self._capture_bugs:
|
|
90
|
-
score = self._match_patterns(content, _BUG_PATTERNS)
|
|
91
|
-
if score >= self._min_confidence:
|
|
92
|
-
return CaptureDecision(True, score, "bug", "bug fix pattern detected")
|
|
93
|
-
|
|
94
|
-
# Check for preferences
|
|
95
|
-
if self._capture_preferences:
|
|
96
|
-
score = self._match_patterns(content, _PREFERENCE_PATTERNS)
|
|
97
|
-
if score >= self._min_confidence:
|
|
98
|
-
return CaptureDecision(True, score, "preference", "preference pattern detected")
|
|
99
|
-
|
|
100
|
-
return CaptureDecision(False, 0.0, "none", "no patterns matched")
|
|
101
|
-
|
|
102
|
-
def capture(self, content: str, category: str = "", metadata: dict | None = None) -> bool:
|
|
103
|
-
"""Store content via engine or store_fn if auto-capture decides to.
|
|
104
|
-
|
|
105
|
-
Never mutates the caller's metadata dict — we copy before adding
|
|
106
|
-
our auto-capture bookkeeping keys. This matters because
|
|
107
|
-
``pool_store`` ships the dict cross-process and callers often
|
|
108
|
-
reuse the same dict across captures.
|
|
109
|
-
"""
|
|
110
|
-
if self._store_fn is None and self._engine is None:
|
|
111
|
-
return False
|
|
112
|
-
|
|
113
|
-
try:
|
|
114
|
-
meta = {**(metadata or {}), "source": "auto-capture", "category": category}
|
|
115
|
-
if self._store_fn is not None:
|
|
116
|
-
fact_ids = self._store_fn(content, metadata=meta)
|
|
117
|
-
else:
|
|
118
|
-
fact_ids = self._engine.store(content, metadata=meta)
|
|
119
|
-
return bool(fact_ids) and len(fact_ids) > 0
|
|
120
|
-
except Exception as exc:
|
|
121
|
-
logger.warning("Auto-capture store failed: %s", exc)
|
|
122
|
-
return False
|
|
123
|
-
|
|
124
|
-
def _match_patterns(self, content: str, patterns: list[str]) -> float:
|
|
125
|
-
"""Match content against regex patterns. Returns confidence 0.0-1.0."""
|
|
126
|
-
matches = sum(1 for p in patterns if re.search(p, content))
|
|
127
|
-
if matches == 0:
|
|
128
|
-
return 0.0
|
|
129
|
-
return min(1.0, 0.5 + (matches * 0.25))
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def enabled(self) -> bool:
|
|
133
|
-
return self._enabled
|