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,755 +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
|
|
4
|
-
|
|
5
|
-
"""Portable kit — ``slm connect <ide>`` MCP-wiring.
|
|
6
|
-
|
|
7
|
-
Writes SLM's MCP block into the target IDE config via MERGE-NOT-CLOBBER:
|
|
8
|
-
- Only touches the ``superlocalmemory`` server key.
|
|
9
|
-
- All other servers + top-level keys are preserved byte-for-byte.
|
|
10
|
-
- Atomic write (.tmp + os.replace); aborts on parse error (file untouched).
|
|
11
|
-
- claude-code is OUT: short-circuits to a plugin pointer, no config written.
|
|
12
|
-
- AGENTS.md is appended with <!-- SLM-START/END --> markers (never overwrite).
|
|
13
|
-
|
|
14
|
-
IDE_MATRIX verified against ide/configs/* templates (read-only; configs are the authoritative source).
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import copy
|
|
20
|
-
import json
|
|
21
|
-
import logging
|
|
22
|
-
import os
|
|
23
|
-
import sys
|
|
24
|
-
import warnings
|
|
25
|
-
from dataclasses import dataclass, field
|
|
26
|
-
from pathlib import Path
|
|
27
|
-
from typing import Any, Callable
|
|
28
|
-
|
|
29
|
-
logger = logging.getLogger(__name__)
|
|
30
|
-
|
|
31
|
-
# Marker convention copied from ide_connector.py (do not edit that class)
|
|
32
|
-
SLM_MARKER_START = "<!-- SLM-START -->"
|
|
33
|
-
SLM_MARKER_END = "<!-- SLM-END -->"
|
|
34
|
-
|
|
35
|
-
# Valid transport values for connect_ide() and slm connect --transport.
|
|
36
|
-
# "stdio" — default, zero regression; uses desc.server_block as-is.
|
|
37
|
-
# "http" — native MCP Streamable-HTTP; requires daemon at :daemon_port.
|
|
38
|
-
# "http-mcp-remote" — mcp-remote stdio bridge for stdio-only clients.
|
|
39
|
-
VALID_TRANSPORTS: frozenset[str] = frozenset({"stdio", "http", "http-mcp-remote"})
|
|
40
|
-
|
|
41
|
-
#: The commands below are Claude Code's own, not ours -- ``slm`` has no
|
|
42
|
-
#: ``plugin`` subcommand and never has, so the instruction this used to print
|
|
43
|
-
#: ended at ``invalid choice: 'plugin'`` with nothing else offered. The working
|
|
44
|
-
#: path already existed in ``cli/setup_wizard.py``; it just was not the one
|
|
45
|
-
#: anybody was told about.
|
|
46
|
-
CLAUDE_CODE_PLUGIN_POINTER = (
|
|
47
|
-
"slm connect claude-code: Claude Code is configured via the SLM plugin, "
|
|
48
|
-
"which Claude Code installs itself.\n"
|
|
49
|
-
"Run: claude plugin marketplace add qualixar/superlocalmemory\n"
|
|
50
|
-
"then: claude plugin install superlocalmemory@qualixar\n"
|
|
51
|
-
"Or run `slm setup` to do both, or see plugin-src/ to install by hand.\n"
|
|
52
|
-
"No MCP config file is written by this command."
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
# ---------------------------------------------------------------------------
|
|
57
|
-
# IDEDescriptor
|
|
58
|
-
# ---------------------------------------------------------------------------
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@dataclass(frozen=True)
|
|
62
|
-
class IDEDescriptor:
|
|
63
|
-
"""Immutable descriptor for one IDE in the support matrix."""
|
|
64
|
-
|
|
65
|
-
ide_id: str
|
|
66
|
-
display: str
|
|
67
|
-
mcp_path_global: str # relative to home (empty string = OUT)
|
|
68
|
-
mcp_path_project: str | None # relative to project root; None = no project scope
|
|
69
|
-
server_key: str # top-level key that holds the servers dict
|
|
70
|
-
fmt: str # "json" | "toml" | "yaml" | "" (OUT)
|
|
71
|
-
agents_md_path: str | None # relative to scope root; None = unsupported
|
|
72
|
-
server_block: dict[str, Any] = field(default_factory=dict)
|
|
73
|
-
caveats: str = ""
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
# ---------------------------------------------------------------------------
|
|
77
|
-
# IDE_MATRIX — server_key + fmt VERIFIED vs ide/configs/* templates
|
|
78
|
-
# Paths are [CN-ONLINE] best-effort; confirmed from public docs where possible.
|
|
79
|
-
# ---------------------------------------------------------------------------
|
|
80
|
-
|
|
81
|
-
IDE_MATRIX: dict[str, IDEDescriptor] = {
|
|
82
|
-
# --- JSON IDEs ---
|
|
83
|
-
"cursor": IDEDescriptor(
|
|
84
|
-
ide_id="cursor",
|
|
85
|
-
display="Cursor",
|
|
86
|
-
mcp_path_global=".cursor/mcp.json",
|
|
87
|
-
mcp_path_project=".cursor/mcp.json",
|
|
88
|
-
server_key="mcpServers",
|
|
89
|
-
fmt="json",
|
|
90
|
-
agents_md_path=".cursorrules",
|
|
91
|
-
server_block={"command": "slm", "args": ["mcp"], "type": "stdio"},
|
|
92
|
-
caveats="project .cursor/mcp.json",
|
|
93
|
-
),
|
|
94
|
-
"antigravity": IDEDescriptor(
|
|
95
|
-
ide_id="antigravity",
|
|
96
|
-
display="Antigravity (agy)",
|
|
97
|
-
mcp_path_global=".antigravity/mcp.json",
|
|
98
|
-
mcp_path_project=None,
|
|
99
|
-
server_key="mcpServers",
|
|
100
|
-
fmt="json",
|
|
101
|
-
agents_md_path=None,
|
|
102
|
-
server_block={"command": "slm", "args": ["mcp"], "type": "stdio"},
|
|
103
|
-
caveats="Vertex auth (R1); path [CN-ONLINE]",
|
|
104
|
-
),
|
|
105
|
-
"windsurf": IDEDescriptor(
|
|
106
|
-
ide_id="windsurf",
|
|
107
|
-
display="Windsurf",
|
|
108
|
-
mcp_path_global=".codeium/windsurf/mcp_config.json",
|
|
109
|
-
mcp_path_project=None,
|
|
110
|
-
server_key="mcpServers",
|
|
111
|
-
fmt="json",
|
|
112
|
-
agents_md_path=".windsurfrules",
|
|
113
|
-
server_block={"command": "slm", "args": ["mcp"], "type": "stdio"},
|
|
114
|
-
caveats="path [CN-ONLINE]",
|
|
115
|
-
),
|
|
116
|
-
"gemini-cli": IDEDescriptor(
|
|
117
|
-
ide_id="gemini-cli",
|
|
118
|
-
display="Gemini CLI",
|
|
119
|
-
mcp_path_global=".gemini/settings.json",
|
|
120
|
-
mcp_path_project=None,
|
|
121
|
-
server_key="mcpServers",
|
|
122
|
-
fmt="json",
|
|
123
|
-
agents_md_path="GEMINI.md",
|
|
124
|
-
server_block={"command": "slm", "args": ["mcp"], "type": "stdio"},
|
|
125
|
-
caveats="Google deprecating; path [CN-ONLINE]",
|
|
126
|
-
),
|
|
127
|
-
"vscode-copilot": IDEDescriptor(
|
|
128
|
-
ide_id="vscode-copilot",
|
|
129
|
-
display="VS Code / Copilot",
|
|
130
|
-
mcp_path_global=".vscode/mcp.json",
|
|
131
|
-
mcp_path_project=".vscode/mcp.json",
|
|
132
|
-
server_key="servers",
|
|
133
|
-
fmt="json",
|
|
134
|
-
agents_md_path=".github/copilot-instructions.md",
|
|
135
|
-
server_block={"type": "stdio", "command": "slm", "args": ["mcp"]},
|
|
136
|
-
caveats="key NOT mcpServers; uses 'servers'",
|
|
137
|
-
),
|
|
138
|
-
"zed": IDEDescriptor(
|
|
139
|
-
ide_id="zed",
|
|
140
|
-
display="Zed Editor",
|
|
141
|
-
mcp_path_global=".config/zed/settings.json",
|
|
142
|
-
mcp_path_project=None,
|
|
143
|
-
server_key="context_servers",
|
|
144
|
-
fmt="json",
|
|
145
|
-
agents_md_path=None, # no rules surface
|
|
146
|
-
server_block={"source": "custom", "command": "slm", "args": ["mcp"]},
|
|
147
|
-
caveats="no rules surface → AGENTS.md skip",
|
|
148
|
-
),
|
|
149
|
-
"jetbrains": IDEDescriptor(
|
|
150
|
-
ide_id="jetbrains",
|
|
151
|
-
display="JetBrains IDEs",
|
|
152
|
-
mcp_path_global=".config/JetBrains/mcp.json",
|
|
153
|
-
mcp_path_project=".mcp.json",
|
|
154
|
-
server_key="mcpServers",
|
|
155
|
-
fmt="json",
|
|
156
|
-
agents_md_path=".junie/AGENTS.md", # Junie guidelines file (GA) — carries memory + optimize protocol
|
|
157
|
-
server_block={"command": "slm", "args": ["mcp"], "type": "stdio"},
|
|
158
|
-
caveats="path per product [CN-ONLINE]",
|
|
159
|
-
),
|
|
160
|
-
"opencode": IDEDescriptor(
|
|
161
|
-
ide_id="opencode",
|
|
162
|
-
display="OpenCode",
|
|
163
|
-
mcp_path_global=".config/opencode/config.json",
|
|
164
|
-
mcp_path_project=None,
|
|
165
|
-
server_key="mcp",
|
|
166
|
-
fmt="json",
|
|
167
|
-
agents_md_path=None,
|
|
168
|
-
server_block={"command": "slm", "args": ["mcp"]},
|
|
169
|
-
caveats="top-level key is 'mcp'",
|
|
170
|
-
),
|
|
171
|
-
"claude-desktop": IDEDescriptor(
|
|
172
|
-
ide_id="claude-desktop",
|
|
173
|
-
display="Claude Desktop",
|
|
174
|
-
mcp_path_global=(
|
|
175
|
-
"Library/Application Support/Claude/claude_desktop_config.json"
|
|
176
|
-
if sys.platform == "darwin"
|
|
177
|
-
else ".config/Claude/claude_desktop_config.json"
|
|
178
|
-
),
|
|
179
|
-
mcp_path_project=None,
|
|
180
|
-
server_key="mcpServers",
|
|
181
|
-
fmt="json",
|
|
182
|
-
agents_md_path=None,
|
|
183
|
-
server_block={"command": "slm", "args": ["mcp"], "type": "stdio"},
|
|
184
|
-
caveats="desktop app (not Claude Code)",
|
|
185
|
-
),
|
|
186
|
-
# --- TOML IDEs ---
|
|
187
|
-
"codex": IDEDescriptor(
|
|
188
|
-
ide_id="codex",
|
|
189
|
-
display="Codex CLI",
|
|
190
|
-
mcp_path_global=".codex/config.toml",
|
|
191
|
-
mcp_path_project=None,
|
|
192
|
-
server_key="mcp_servers",
|
|
193
|
-
fmt="toml",
|
|
194
|
-
agents_md_path="AGENTS.md",
|
|
195
|
-
server_block={"command": "slm", "args": ["mcp"]},
|
|
196
|
-
caveats="tomllib read / tomli_w write",
|
|
197
|
-
),
|
|
198
|
-
# --- YAML IDEs ---
|
|
199
|
-
"continue": IDEDescriptor(
|
|
200
|
-
ide_id="continue",
|
|
201
|
-
display="Continue.dev",
|
|
202
|
-
mcp_path_global=".continue/config.yaml",
|
|
203
|
-
mcp_path_project=".continue/config.yaml",
|
|
204
|
-
server_key="contextProviders",
|
|
205
|
-
fmt="yaml",
|
|
206
|
-
agents_md_path=None,
|
|
207
|
-
server_block={
|
|
208
|
-
"name": "mcp",
|
|
209
|
-
"params": {
|
|
210
|
-
"serverName": "superlocalmemory",
|
|
211
|
-
"command": "slm",
|
|
212
|
-
"args": ["mcp"],
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
caveats="contextProviders is a LIST; append+dedupe by serverName",
|
|
216
|
-
),
|
|
217
|
-
# --- OUT: claude-code defers to the plugin installer ---
|
|
218
|
-
"claude-code": IDEDescriptor(
|
|
219
|
-
ide_id="claude-code",
|
|
220
|
-
display="Claude Code (plugin)",
|
|
221
|
-
mcp_path_global="",
|
|
222
|
-
mcp_path_project=None,
|
|
223
|
-
server_key="",
|
|
224
|
-
fmt="",
|
|
225
|
-
agents_md_path=None,
|
|
226
|
-
server_block={},
|
|
227
|
-
caveats="OUT — plugin pointer only; no MCP config written",
|
|
228
|
-
),
|
|
229
|
-
# --- EXPERIMENTAL (gated, not wired by default) ---
|
|
230
|
-
# chatgpt-desktop, perplexity, cody: gated behind --experimental
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
# ---------------------------------------------------------------------------
|
|
235
|
-
# Public API
|
|
236
|
-
# ---------------------------------------------------------------------------
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
def supported_ides() -> list[str]:
|
|
240
|
-
"""Return all ide_ids in the matrix (including claude-code and experimental)."""
|
|
241
|
-
return list(IDE_MATRIX.keys())
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def resolve_descriptor(ide_id: str) -> IDEDescriptor | None:
|
|
245
|
-
"""Return the IDEDescriptor for ide_id, or None if unknown."""
|
|
246
|
-
return IDE_MATRIX.get(ide_id)
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
def connect_ide(
|
|
250
|
-
ide_id: str,
|
|
251
|
-
*,
|
|
252
|
-
home: Path | None = None,
|
|
253
|
-
project: Path | None = None,
|
|
254
|
-
here: bool = False,
|
|
255
|
-
profile: str | None = None,
|
|
256
|
-
agents_md_source: Callable[[], str] | None = None,
|
|
257
|
-
dry_run: bool = False,
|
|
258
|
-
transport: str = "stdio",
|
|
259
|
-
daemon_port: int = 8765,
|
|
260
|
-
) -> dict[str, Any]:
|
|
261
|
-
"""Wire SLM into the target IDE config via merge-not-clobber.
|
|
262
|
-
|
|
263
|
-
Args:
|
|
264
|
-
transport: MCP transport to write into the config.
|
|
265
|
-
"stdio" (default, zero regression) — uses the IDE's canonical server_block.
|
|
266
|
-
"http" — native MCP Streamable-HTTP block; requires SLM daemon at daemon_port.
|
|
267
|
-
"http-mcp-remote" — stdio bridge via mcp-remote for stdio-only clients.
|
|
268
|
-
daemon_port: Daemon listen port for http / http-mcp-remote (default 8765).
|
|
269
|
-
|
|
270
|
-
Returns a result dict:
|
|
271
|
-
{ide, transport, mcp_config: wrote|merged|unchanged|would_write|skipped|error,
|
|
272
|
-
mcp_path, agents_md: wrote|skipped(...)|unchanged|error,
|
|
273
|
-
servers_preserved: int, error: str|None}
|
|
274
|
-
"""
|
|
275
|
-
result: dict[str, Any] = {
|
|
276
|
-
"ide": ide_id,
|
|
277
|
-
"transport": transport,
|
|
278
|
-
"mcp_config": "error",
|
|
279
|
-
"mcp_path": "",
|
|
280
|
-
"agents_md": "skipped(not-run)",
|
|
281
|
-
"servers_preserved": 0,
|
|
282
|
-
"error": None,
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
# Step 0 — validate transport
|
|
286
|
-
if transport not in VALID_TRANSPORTS:
|
|
287
|
-
result["error"] = (
|
|
288
|
-
f"Invalid transport '{transport}'. "
|
|
289
|
-
f"Valid choices: {', '.join(sorted(VALID_TRANSPORTS))}"
|
|
290
|
-
)
|
|
291
|
-
return result
|
|
292
|
-
|
|
293
|
-
# Step 1 — resolve
|
|
294
|
-
desc = resolve_descriptor(ide_id)
|
|
295
|
-
if desc is None:
|
|
296
|
-
result["error"] = (
|
|
297
|
-
f"Unknown IDE '{ide_id}'. Supported: {', '.join(supported_ides())}"
|
|
298
|
-
)
|
|
299
|
-
return result
|
|
300
|
-
|
|
301
|
-
if ide_id == "vscode-copilot" and not here:
|
|
302
|
-
result["error"] = (
|
|
303
|
-
"VS Code / Copilot integration is project-scoped. "
|
|
304
|
-
"Run `slm connect vscode-copilot --here` from the project root."
|
|
305
|
-
)
|
|
306
|
-
return result
|
|
307
|
-
|
|
308
|
-
# Step 1a — claude-code short-circuit (AC6)
|
|
309
|
-
if desc.fmt == "":
|
|
310
|
-
print(CLAUDE_CODE_PLUGIN_POINTER)
|
|
311
|
-
result["mcp_config"] = "skipped"
|
|
312
|
-
result["agents_md"] = "skipped(claude-code-out)"
|
|
313
|
-
return result
|
|
314
|
-
|
|
315
|
-
# Step 2 — scope resolution
|
|
316
|
-
effective_home = home or Path.home()
|
|
317
|
-
if here:
|
|
318
|
-
if project is None:
|
|
319
|
-
result["error"] = "--here requires --project (project root path)"
|
|
320
|
-
return result
|
|
321
|
-
scope_root = project
|
|
322
|
-
rel_path = desc.mcp_path_project or desc.mcp_path_global
|
|
323
|
-
else:
|
|
324
|
-
scope_root = effective_home
|
|
325
|
-
rel_path = desc.mcp_path_global
|
|
326
|
-
|
|
327
|
-
config_path = scope_root / rel_path
|
|
328
|
-
result["mcp_path"] = str(config_path)
|
|
329
|
-
|
|
330
|
-
# Step 3 — load existing config
|
|
331
|
-
try:
|
|
332
|
-
data = _load_config(config_path, desc.fmt)
|
|
333
|
-
except _ParseError as exc:
|
|
334
|
-
result["error"] = str(exc)
|
|
335
|
-
# File is untouched (we never wrote; abort)
|
|
336
|
-
return result
|
|
337
|
-
|
|
338
|
-
# Step 4 — daemon health-check for HTTP transports (advisory, never blocks write)
|
|
339
|
-
if transport in ("http", "http-mcp-remote") and desc.fmt != "":
|
|
340
|
-
if not _check_daemon_health(daemon_port):
|
|
341
|
-
print(
|
|
342
|
-
f"[SLM] Warning: daemon not reachable at http://127.0.0.1:{daemon_port}/api/v3/health. "
|
|
343
|
-
f"Run `slm serve start` to start it, or `slm serve install` to register as an OS service.",
|
|
344
|
-
file=sys.stderr,
|
|
345
|
-
)
|
|
346
|
-
|
|
347
|
-
# Step 5 — extract server container and build block
|
|
348
|
-
# For YAML-format IDEs (continue.dev), transport is ignored — their block
|
|
349
|
-
# structure is list-based and incompatible with the JSON http/mcp-remote block.
|
|
350
|
-
if desc.fmt == "yaml":
|
|
351
|
-
if transport != "stdio":
|
|
352
|
-
logger.warning(
|
|
353
|
-
"transport=%r is not supported for YAML-format IDE %r; using stdio fallback.",
|
|
354
|
-
transport,
|
|
355
|
-
ide_id,
|
|
356
|
-
)
|
|
357
|
-
mcp_status, servers_preserved = _merge_yaml_list(
|
|
358
|
-
data, desc, profile
|
|
359
|
-
)
|
|
360
|
-
result["mcp_config"] = mcp_status
|
|
361
|
-
result["servers_preserved"] = servers_preserved
|
|
362
|
-
else:
|
|
363
|
-
servers = data.setdefault(desc.server_key, {})
|
|
364
|
-
pre_count = len(servers)
|
|
365
|
-
pre_slm = copy.deepcopy(servers.get("superlocalmemory"))
|
|
366
|
-
|
|
367
|
-
# Build the server block for the requested transport
|
|
368
|
-
block = _build_server_block(desc, transport, daemon_port, profile)
|
|
369
|
-
|
|
370
|
-
servers["superlocalmemory"] = block
|
|
371
|
-
|
|
372
|
-
if servers.get("superlocalmemory") == pre_slm and pre_slm is not None:
|
|
373
|
-
mcp_status = "unchanged"
|
|
374
|
-
elif pre_slm is None:
|
|
375
|
-
mcp_status = "wrote"
|
|
376
|
-
else:
|
|
377
|
-
mcp_status = "merged"
|
|
378
|
-
|
|
379
|
-
result["servers_preserved"] = max(0, pre_count - (0 if pre_slm is None else 1))
|
|
380
|
-
result["mcp_config"] = mcp_status
|
|
381
|
-
|
|
382
|
-
# Step 6 — atomic write. A dry run deliberately exercises the merge and
|
|
383
|
-
# packaged-asset lookup path without touching a user-owned IDE config.
|
|
384
|
-
if dry_run:
|
|
385
|
-
result["mcp_config"] = "would_write"
|
|
386
|
-
if desc.agents_md_path is None:
|
|
387
|
-
result["agents_md"] = "skipped(unsupported)"
|
|
388
|
-
elif agents_md_source is None:
|
|
389
|
-
result["agents_md"] = "skipped(no-source)"
|
|
390
|
-
else:
|
|
391
|
-
try:
|
|
392
|
-
source_content = agents_md_source()
|
|
393
|
-
except Exception as exc:
|
|
394
|
-
result["agents_md"] = "error(source-unavailable)"
|
|
395
|
-
result["error"] = f"AGENTS.md asset lookup failed: {exc}"
|
|
396
|
-
return result
|
|
397
|
-
if not isinstance(source_content, str) or not source_content.strip():
|
|
398
|
-
result["agents_md"] = "error(empty-source)"
|
|
399
|
-
result["error"] = "AGENTS.md asset is empty"
|
|
400
|
-
return result
|
|
401
|
-
result["agents_md"] = "would_write"
|
|
402
|
-
return result
|
|
403
|
-
|
|
404
|
-
try:
|
|
405
|
-
_atomic_write(config_path, data, desc.fmt)
|
|
406
|
-
except Exception as exc:
|
|
407
|
-
result["error"] = f"Write failed: {exc}"
|
|
408
|
-
result["mcp_config"] = "error"
|
|
409
|
-
return result
|
|
410
|
-
|
|
411
|
-
# Verify idempotent: if nothing changed, re-read and confirm
|
|
412
|
-
if result["mcp_config"] != "unchanged":
|
|
413
|
-
pass # already wrote
|
|
414
|
-
else:
|
|
415
|
-
pass # already unchanged; atomic write still ran (idempotent)
|
|
416
|
-
|
|
417
|
-
# Step 7 — AGENTS.md
|
|
418
|
-
result["agents_md"] = _handle_agents_md(
|
|
419
|
-
desc, scope_root, agents_md_source, here
|
|
420
|
-
)
|
|
421
|
-
|
|
422
|
-
return result
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
def connect_many(
|
|
426
|
-
ide_ids: list[str],
|
|
427
|
-
*,
|
|
428
|
-
home: Path | None = None,
|
|
429
|
-
project: Path | None = None,
|
|
430
|
-
here: bool = False,
|
|
431
|
-
profile: str | None = None,
|
|
432
|
-
agents_md_source: Callable[[], str] | None = None,
|
|
433
|
-
transport: str = "stdio",
|
|
434
|
-
daemon_port: int = 8765,
|
|
435
|
-
) -> list[dict[str, Any]]:
|
|
436
|
-
"""Wire SLM into multiple IDE configs via non-destructive merge.
|
|
437
|
-
|
|
438
|
-
Iterates over ``ide_ids`` and calls :func:`connect_ide` for each entry.
|
|
439
|
-
Each IDE is processed independently — a failure on one IDE does NOT abort
|
|
440
|
-
the remaining targets.
|
|
441
|
-
|
|
442
|
-
The underlying :func:`connect_ide` is MERGE-NOT-CLOBBER:
|
|
443
|
-
- Only the ``superlocalmemory`` server key is touched.
|
|
444
|
-
- All other MCP servers + top-level keys are preserved byte-for-byte.
|
|
445
|
-
- Writes are atomic (.tmp + os.replace).
|
|
446
|
-
|
|
447
|
-
Args:
|
|
448
|
-
ide_ids: IDE ids to wire (from :data:`IDE_MATRIX`). Pass an empty
|
|
449
|
-
list to no-op. Unknown ids produce error entries in the output.
|
|
450
|
-
home: Override ``$HOME`` (test hook).
|
|
451
|
-
project: Project root for ``here=True`` installs.
|
|
452
|
-
here: When True, write to project-relative path instead of global.
|
|
453
|
-
profile: Inject ``SLM_MCP_PROFILE`` env-var (stdio) or URL param (http).
|
|
454
|
-
agents_md_source: Callable returning AGENTS.md content to append.
|
|
455
|
-
transport: MCP transport to use for all IDEs ("stdio", "http",
|
|
456
|
-
"http-mcp-remote"). Default "stdio" preserves existing behavior.
|
|
457
|
-
daemon_port: Daemon listen port for http/http-mcp-remote (default 8765).
|
|
458
|
-
|
|
459
|
-
Returns:
|
|
460
|
-
List of per-IDE result dicts, one per input id. Each dict has the
|
|
461
|
-
same shape as :func:`connect_ide`'s return value::
|
|
462
|
-
|
|
463
|
-
{ide, transport, mcp_config, mcp_path, agents_md, servers_preserved, error}
|
|
464
|
-
"""
|
|
465
|
-
return [
|
|
466
|
-
connect_ide(
|
|
467
|
-
ide_id,
|
|
468
|
-
home=home,
|
|
469
|
-
project=project,
|
|
470
|
-
here=here,
|
|
471
|
-
profile=profile,
|
|
472
|
-
agents_md_source=agents_md_source,
|
|
473
|
-
transport=transport,
|
|
474
|
-
daemon_port=daemon_port,
|
|
475
|
-
)
|
|
476
|
-
for ide_id in ide_ids
|
|
477
|
-
]
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
# ---------------------------------------------------------------------------
|
|
481
|
-
# Internal helpers
|
|
482
|
-
# ---------------------------------------------------------------------------
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
class _ParseError(Exception):
|
|
486
|
-
"""Raised when an existing config file cannot be parsed."""
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
def _load_config(path: Path, fmt: str) -> dict[str, Any]:
|
|
490
|
-
"""Load and parse existing config; return {} if file absent.
|
|
491
|
-
|
|
492
|
-
Raises _ParseError if file exists but is malformed.
|
|
493
|
-
"""
|
|
494
|
-
if not path.exists():
|
|
495
|
-
return {}
|
|
496
|
-
|
|
497
|
-
raw = path.read_text(encoding="utf-8")
|
|
498
|
-
|
|
499
|
-
try:
|
|
500
|
-
if fmt == "json":
|
|
501
|
-
return json.loads(raw)
|
|
502
|
-
elif fmt == "toml":
|
|
503
|
-
import tomllib
|
|
504
|
-
return tomllib.loads(raw)
|
|
505
|
-
elif fmt == "yaml":
|
|
506
|
-
import yaml
|
|
507
|
-
parsed = yaml.safe_load(raw)
|
|
508
|
-
# Non-dict result (e.g. bare string) is treated as empty config
|
|
509
|
-
if parsed is None:
|
|
510
|
-
return {}
|
|
511
|
-
if not isinstance(parsed, dict):
|
|
512
|
-
return {}
|
|
513
|
-
return parsed
|
|
514
|
-
else:
|
|
515
|
-
# Unknown format — return empty; caller will fail gracefully
|
|
516
|
-
return {}
|
|
517
|
-
except Exception as exc:
|
|
518
|
-
raise _ParseError(
|
|
519
|
-
f"Config parse error ({fmt}) at {path}: {exc}"
|
|
520
|
-
) from exc
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
def _merge_yaml_list(
|
|
524
|
-
data: dict[str, Any],
|
|
525
|
-
desc: IDEDescriptor,
|
|
526
|
-
profile: str | None,
|
|
527
|
-
) -> tuple[str, int]:
|
|
528
|
-
"""Merge SLM entry into a list-style YAML contextProviders (continue.dev).
|
|
529
|
-
|
|
530
|
-
Returns (status, servers_preserved).
|
|
531
|
-
"""
|
|
532
|
-
providers: list[dict] = data.setdefault(desc.server_key, [])
|
|
533
|
-
if not isinstance(providers, list):
|
|
534
|
-
providers = []
|
|
535
|
-
data[desc.server_key] = providers
|
|
536
|
-
|
|
537
|
-
pre_count = sum(
|
|
538
|
-
1 for p in providers
|
|
539
|
-
if p.get("params", {}).get("serverName") != "superlocalmemory"
|
|
540
|
-
)
|
|
541
|
-
|
|
542
|
-
# Check if SLM already present
|
|
543
|
-
existing_idx = None
|
|
544
|
-
for i, p in enumerate(providers):
|
|
545
|
-
if p.get("params", {}).get("serverName") == "superlocalmemory":
|
|
546
|
-
existing_idx = i
|
|
547
|
-
break
|
|
548
|
-
|
|
549
|
-
block = copy.deepcopy(desc.server_block)
|
|
550
|
-
if profile:
|
|
551
|
-
block.setdefault("params", {})["env"] = {"SLM_MCP_PROFILE": profile}
|
|
552
|
-
|
|
553
|
-
if existing_idx is not None:
|
|
554
|
-
if providers[existing_idx] == block:
|
|
555
|
-
return "unchanged", pre_count
|
|
556
|
-
providers[existing_idx] = block
|
|
557
|
-
return "merged", pre_count
|
|
558
|
-
else:
|
|
559
|
-
providers.append(block)
|
|
560
|
-
return "wrote", pre_count
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
def _build_server_block(
|
|
564
|
-
desc: IDEDescriptor,
|
|
565
|
-
transport: str,
|
|
566
|
-
daemon_port: int,
|
|
567
|
-
profile: str | None,
|
|
568
|
-
) -> dict[str, Any]:
|
|
569
|
-
"""Return the server block for the requested transport.
|
|
570
|
-
|
|
571
|
-
YAML and TOML IDEs use a format-specific block structure that is
|
|
572
|
-
incompatible with the JSON http/mcp-remote block — caller should never
|
|
573
|
-
reach here for those (they take the yaml branch in connect_ide).
|
|
574
|
-
For JSON-format IDEs:
|
|
575
|
-
"stdio" → copy of desc.server_block with optional SLM_MCP_PROFILE env
|
|
576
|
-
"http" → native MCP HTTP block; profile goes as URL query param
|
|
577
|
-
"http-mcp-remote" → mcp-remote stdio bridge; profile appended to proxied URL
|
|
578
|
-
"""
|
|
579
|
-
base_url = f"http://127.0.0.1:{daemon_port}/mcp/"
|
|
580
|
-
|
|
581
|
-
if transport == "http":
|
|
582
|
-
url = base_url + (f"?profile={profile}" if profile else "")
|
|
583
|
-
return {"type": "http", "url": url}
|
|
584
|
-
|
|
585
|
-
if transport == "http-mcp-remote":
|
|
586
|
-
url = base_url + (f"?profile={profile}" if profile else "")
|
|
587
|
-
return {"type": "stdio", "command": "mcp-remote", "args": [url]}
|
|
588
|
-
|
|
589
|
-
# Default: stdio — preserve existing behavior exactly
|
|
590
|
-
block = copy.deepcopy(desc.server_block)
|
|
591
|
-
if profile:
|
|
592
|
-
block.setdefault("env", {})["SLM_MCP_PROFILE"] = profile
|
|
593
|
-
return block
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
def _check_daemon_health(daemon_port: int, timeout: float = 2.0) -> bool:
|
|
597
|
-
"""Non-blocking probe of the SLM daemon health endpoint.
|
|
598
|
-
|
|
599
|
-
Returns True if the daemon responds with HTTP 200, False otherwise.
|
|
600
|
-
Never raises — all exceptions are caught and treated as "unreachable".
|
|
601
|
-
"""
|
|
602
|
-
try:
|
|
603
|
-
import urllib.request
|
|
604
|
-
import urllib.error
|
|
605
|
-
|
|
606
|
-
url = f"http://127.0.0.1:{daemon_port}/api/v3/health"
|
|
607
|
-
req = urllib.request.Request(url, method="GET")
|
|
608
|
-
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
|
609
|
-
return resp.status == 200
|
|
610
|
-
except Exception:
|
|
611
|
-
return False
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
def _atomic_write(path: Path, data: dict[str, Any], fmt: str) -> None:
|
|
615
|
-
"""Serialize data and atomically write to path (.tmp + os.replace)."""
|
|
616
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
617
|
-
tmp_path = path.with_suffix(path.suffix + ".tmp")
|
|
618
|
-
|
|
619
|
-
try:
|
|
620
|
-
if fmt == "json":
|
|
621
|
-
content = json.dumps(data, indent=2) + "\n"
|
|
622
|
-
tmp_path.write_text(content, encoding="utf-8")
|
|
623
|
-
elif fmt == "toml":
|
|
624
|
-
import tomli_w
|
|
625
|
-
tmp_path.write_text(tomli_w.dumps(data), encoding="utf-8")
|
|
626
|
-
elif fmt == "yaml":
|
|
627
|
-
import yaml
|
|
628
|
-
tmp_path.write_text(yaml.safe_dump(data, default_flow_style=False))
|
|
629
|
-
else:
|
|
630
|
-
raise ValueError(f"Unknown format: {fmt}")
|
|
631
|
-
|
|
632
|
-
os.replace(tmp_path, path)
|
|
633
|
-
except Exception:
|
|
634
|
-
# Clean up tmp on failure
|
|
635
|
-
if tmp_path.exists():
|
|
636
|
-
tmp_path.unlink()
|
|
637
|
-
raise
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
def _handle_agents_md(
|
|
641
|
-
desc: IDEDescriptor,
|
|
642
|
-
scope_root: Path,
|
|
643
|
-
agents_md_source: Callable[[], str] | None,
|
|
644
|
-
here: bool,
|
|
645
|
-
) -> str:
|
|
646
|
-
"""Append SLM section to AGENTS.md with <!-- SLM-START/END --> markers.
|
|
647
|
-
|
|
648
|
-
D-1 resolution: only write AGENTS.md in --here (project) scope;
|
|
649
|
-
skip in global scope (don't litter $HOME).
|
|
650
|
-
"""
|
|
651
|
-
if desc.agents_md_path is None:
|
|
652
|
-
return "skipped(unsupported)"
|
|
653
|
-
|
|
654
|
-
if agents_md_source is None:
|
|
655
|
-
return "skipped(no-source)"
|
|
656
|
-
|
|
657
|
-
agents_path = scope_root / desc.agents_md_path
|
|
658
|
-
|
|
659
|
-
try:
|
|
660
|
-
source_content = agents_md_source()
|
|
661
|
-
except Exception as exc:
|
|
662
|
-
logger.warning("agents_md_source() failed: %s — skipping AGENTS.md write", exc)
|
|
663
|
-
return "skipped(source-error)"
|
|
664
|
-
if not isinstance(source_content, str) or not source_content.strip():
|
|
665
|
-
logger.warning("agents_md_source() returned no content — skipping AGENTS.md write")
|
|
666
|
-
return "skipped(no-source-content)"
|
|
667
|
-
|
|
668
|
-
# Read existing content
|
|
669
|
-
existing = ""
|
|
670
|
-
if agents_path.exists():
|
|
671
|
-
existing = agents_path.read_text(encoding="utf-8")
|
|
672
|
-
|
|
673
|
-
# Idempotency check
|
|
674
|
-
if SLM_MARKER_START in existing:
|
|
675
|
-
return "unchanged"
|
|
676
|
-
|
|
677
|
-
# Append SLM section
|
|
678
|
-
section = (
|
|
679
|
-
f"\n{SLM_MARKER_START}\n"
|
|
680
|
-
f"{source_content.strip()}\n"
|
|
681
|
-
f"{SLM_MARKER_END}\n"
|
|
682
|
-
)
|
|
683
|
-
agents_path.parent.mkdir(parents=True, exist_ok=True)
|
|
684
|
-
# Atomic write: agents_path is the user's hand-written rules file
|
|
685
|
-
# (.cursorrules, AGENTS.md, copilot-instructions.md, ...). A crash mid-write
|
|
686
|
-
# must NOT truncate it. tmp in the same dir → os.replace is atomic.
|
|
687
|
-
_tmp = agents_path.with_suffix(agents_path.suffix + ".tmp")
|
|
688
|
-
_tmp.write_text(existing + section, encoding="utf-8")
|
|
689
|
-
os.replace(_tmp, agents_path)
|
|
690
|
-
return "wrote"
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
# ---------------------------------------------------------------------------
|
|
694
|
-
# __main__ — `python -m superlocalmemory.hooks.portable_kit [ids...]`
|
|
695
|
-
#
|
|
696
|
-
# Used by the npm installer to execute non-destructive IDE connects when
|
|
697
|
-
# Python is available at postinstall time. If Python / the package is not
|
|
698
|
-
# importable the installer records a pending_ide_connections.json instead.
|
|
699
|
-
# ---------------------------------------------------------------------------
|
|
700
|
-
|
|
701
|
-
if __name__ == "__main__": # pragma: no cover
|
|
702
|
-
import argparse as _argparse
|
|
703
|
-
|
|
704
|
-
_parser = _argparse.ArgumentParser(
|
|
705
|
-
description="SLM IDE connector — non-destructive merge-not-clobber."
|
|
706
|
-
)
|
|
707
|
-
_parser.add_argument(
|
|
708
|
-
"ide_ids",
|
|
709
|
-
nargs="*",
|
|
710
|
-
metavar="IDE",
|
|
711
|
-
help=(
|
|
712
|
-
"IDE ids to connect. Pass 'all' to connect every supported IDE "
|
|
713
|
-
"(excluding claude-code which uses the plugin installer)."
|
|
714
|
-
),
|
|
715
|
-
)
|
|
716
|
-
_parser.add_argument("--home", help="Override home directory (test hook).")
|
|
717
|
-
_parser.add_argument("--profile", help="SLM_MCP_PROFILE to inject.")
|
|
718
|
-
_parser.add_argument(
|
|
719
|
-
"--list", action="store_true",
|
|
720
|
-
help="Print supported IDE ids with display names and exit.",
|
|
721
|
-
)
|
|
722
|
-
_args = _parser.parse_args()
|
|
723
|
-
|
|
724
|
-
if _args.list:
|
|
725
|
-
for _id, _desc in IDE_MATRIX.items():
|
|
726
|
-
_flag = "[OUT]" if not _desc.fmt else ""
|
|
727
|
-
print(f" {_id:22s} {_desc.display} {_flag}".rstrip())
|
|
728
|
-
sys.exit(0)
|
|
729
|
-
|
|
730
|
-
_home = Path(_args.home) if _args.home else None
|
|
731
|
-
|
|
732
|
-
# Resolve targets: "all" → every MCP-capable IDE (fmt != ""), else explicit list.
|
|
733
|
-
if "all" in _args.ide_ids:
|
|
734
|
-
_targets = [k for k, d in IDE_MATRIX.items() if d.fmt]
|
|
735
|
-
else:
|
|
736
|
-
_targets = [t for t in _args.ide_ids if t]
|
|
737
|
-
|
|
738
|
-
if not _targets:
|
|
739
|
-
print("No IDE ids given. Pass ide ids or 'all'. Use --list to see options.")
|
|
740
|
-
sys.exit(0)
|
|
741
|
-
|
|
742
|
-
_results = connect_many(_targets, home=_home, profile=_args.profile)
|
|
743
|
-
_ok = 0
|
|
744
|
-
_fail = 0
|
|
745
|
-
for _r in _results:
|
|
746
|
-
_err = _r.get("error")
|
|
747
|
-
_status = _r.get("mcp_config", "error")
|
|
748
|
-
if _err:
|
|
749
|
-
print(f" ERROR {_r['ide']}: {_err}", file=sys.stderr)
|
|
750
|
-
_fail += 1
|
|
751
|
-
else:
|
|
752
|
-
print(f" {_status.upper():9s} {_r['ide']} → {_r.get('mcp_path', '')}")
|
|
753
|
-
_ok += 1
|
|
754
|
-
print(f"\n{_ok} connected, {_fail} errors.")
|
|
755
|
-
sys.exit(0 if _fail == 0 else 1)
|