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,229 +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
|
-
"""Does this process still match what is installed on disk? (issue #107)
|
|
6
|
-
|
|
7
|
-
Why this module exists
|
|
8
|
-
----------------------
|
|
9
|
-
Python imports a module once. ``superlocalmemory.__version__`` is therefore
|
|
10
|
-
frozen at the instant a process started, and upgrading the package underneath a
|
|
11
|
-
long-lived ``slm mcp`` server changes nothing for that server -- it keeps
|
|
12
|
-
serving the code it read at startup, forever.
|
|
13
|
-
|
|
14
|
-
Nothing detected that. The stale process did not error; it returned confident,
|
|
15
|
-
plausible, *wrong* answers, and reported a ``serverInfo.version`` matching the
|
|
16
|
-
code it had loaded, which is self-consistent and therefore useless as a
|
|
17
|
-
staleness signal. During the v3.8.12 work this machine had eighteen ``slm mcp``
|
|
18
|
-
processes alive at once, spanning four days and two releases. One of them made
|
|
19
|
-
issue #106 look unfixed across two debugging sessions and contributed to v3.8.11
|
|
20
|
-
shipping a wrong fix, because the "evidence" that the fix had failed was really
|
|
21
|
-
a four-day-old process.
|
|
22
|
-
|
|
23
|
-
The asymmetry that makes this dangerous
|
|
24
|
-
---------------------------------------
|
|
25
|
-
A *loud* failure costs a user one confused minute. A *silent* one costs
|
|
26
|
-
whoever debugs it their entire session, because it actively argues that correct
|
|
27
|
-
code is broken. Everything here is therefore built so that no failure mode can
|
|
28
|
-
produce a false :data:`STATE_CURRENT`. Unreadable metadata, a hostile reader,
|
|
29
|
-
a non-string return -- all resolve to :data:`STATE_UNKNOWN`, which reports
|
|
30
|
-
"I could not tell" rather than "all is well".
|
|
31
|
-
|
|
32
|
-
Why ``importlib.metadata`` is the right source
|
|
33
|
-
----------------------------------------------
|
|
34
|
-
It reads the ``*.dist-info`` directory from disk on each call rather than
|
|
35
|
-
returning a value captured at import. Verified empirically: rewriting a
|
|
36
|
-
distribution's metadata underneath a live process and re-reading returns the
|
|
37
|
-
*new* version, with no ``importlib.invalidate_caches()`` needed. That is the
|
|
38
|
-
one property this whole module rests on, so it is pinned by a test.
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
from __future__ import annotations
|
|
42
|
-
|
|
43
|
-
from dataclasses import dataclass
|
|
44
|
-
from typing import Callable, Optional
|
|
45
|
-
|
|
46
|
-
from superlocalmemory import __version__
|
|
47
|
-
|
|
48
|
-
__all__ = (
|
|
49
|
-
"STATE_AHEAD",
|
|
50
|
-
"STATE_CURRENT",
|
|
51
|
-
"STATE_MISMATCH",
|
|
52
|
-
"STATE_STALE",
|
|
53
|
-
"STATE_UNKNOWN",
|
|
54
|
-
"VersionIntegrity",
|
|
55
|
-
"check_version_integrity",
|
|
56
|
-
"installed_distribution_version",
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
#: Imported code matches the installed distribution.
|
|
60
|
-
STATE_CURRENT = "current"
|
|
61
|
-
#: Imported code is *older* than what is installed -- the #107 failure.
|
|
62
|
-
STATE_STALE = "stale"
|
|
63
|
-
#: Imported code is *newer* than the installed distribution. Normal for an
|
|
64
|
-
#: editable checkout; deliberately not reported as a problem, because a warning
|
|
65
|
-
#: that fires on every maintainer's machine is a warning everyone learns to
|
|
66
|
-
#: ignore, and then it will not be read on the day it matters.
|
|
67
|
-
STATE_AHEAD = "ahead"
|
|
68
|
-
#: The two differ but cannot be ordered (local labels, unexpected formats).
|
|
69
|
-
#: Still surfaced -- a difference we cannot rank is not a difference we hide.
|
|
70
|
-
STATE_MISMATCH = "mismatch"
|
|
71
|
-
#: The installed version could not be determined at all.
|
|
72
|
-
STATE_UNKNOWN = "unknown"
|
|
73
|
-
|
|
74
|
-
_DISTRIBUTION_NAME = "superlocalmemory"
|
|
75
|
-
|
|
76
|
-
_RESTART_HINT = (
|
|
77
|
-
"Restart this process to load the installed code "
|
|
78
|
-
"(`slm restart` for the daemon; restart your MCP client for `slm mcp`)."
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
@dataclass(frozen=True)
|
|
83
|
-
class VersionIntegrity:
|
|
84
|
-
"""The outcome of comparing imported code against the installed dist."""
|
|
85
|
-
|
|
86
|
-
running: str
|
|
87
|
-
installed: Optional[str]
|
|
88
|
-
state: str
|
|
89
|
-
detail: str
|
|
90
|
-
hint: str = ""
|
|
91
|
-
|
|
92
|
-
@property
|
|
93
|
-
def is_stale(self) -> bool:
|
|
94
|
-
"""True only for the #107 failure: running behind what is installed.
|
|
95
|
-
|
|
96
|
-
Deliberately narrow. Callers gate warnings on this, and widening it to
|
|
97
|
-
mean "anything unusual" would make an editable checkout look broken.
|
|
98
|
-
"""
|
|
99
|
-
return self.state == STATE_STALE
|
|
100
|
-
|
|
101
|
-
@property
|
|
102
|
-
def differs(self) -> bool:
|
|
103
|
-
"""True whenever imported and installed are known to be different."""
|
|
104
|
-
return self.state in (STATE_STALE, STATE_AHEAD, STATE_MISMATCH)
|
|
105
|
-
|
|
106
|
-
def as_dict(self) -> dict:
|
|
107
|
-
"""JSON-safe payload for ``/health``, ``slm status --json``, doctor."""
|
|
108
|
-
return {
|
|
109
|
-
"running": self.running,
|
|
110
|
-
"installed": self.installed,
|
|
111
|
-
"state": self.state,
|
|
112
|
-
"detail": self.detail,
|
|
113
|
-
"hint": self.hint,
|
|
114
|
-
"is_stale": self.is_stale,
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def installed_distribution_version() -> str:
|
|
119
|
-
"""Return the on-disk version of the installed distribution.
|
|
120
|
-
|
|
121
|
-
Raises whatever ``importlib.metadata`` raises; :func:`check_version_integrity`
|
|
122
|
-
is the layer that turns failure into :data:`STATE_UNKNOWN`. Keeping the
|
|
123
|
-
raise here means a caller that genuinely wants the error can have it.
|
|
124
|
-
"""
|
|
125
|
-
from importlib.metadata import version as _version
|
|
126
|
-
|
|
127
|
-
return _version(_DISTRIBUTION_NAME)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def _version_tuple(raw: str) -> Optional[tuple[int, ...]]:
|
|
131
|
-
"""Parse a plain dotted release into ints, or ``None`` if it is not one.
|
|
132
|
-
|
|
133
|
-
Intentionally strict and dependency-free: anything carrying a local label,
|
|
134
|
-
pre-release marker, or non-numeric field returns ``None`` and is reported as
|
|
135
|
-
:data:`STATE_MISMATCH`. Guessing an order for such versions could mask a
|
|
136
|
-
real drift behind a confident-looking "current".
|
|
137
|
-
"""
|
|
138
|
-
parts = raw.strip().split(".")
|
|
139
|
-
if not parts or any(not p.isdigit() for p in parts):
|
|
140
|
-
return None
|
|
141
|
-
return tuple(int(p) for p in parts)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def check_version_integrity(
|
|
145
|
-
*,
|
|
146
|
-
running: Optional[str] = None,
|
|
147
|
-
installed_reader: Optional[Callable[[], str]] = None,
|
|
148
|
-
) -> VersionIntegrity:
|
|
149
|
-
"""Compare imported code against the installed distribution.
|
|
150
|
-
|
|
151
|
-
Never raises. Both sides are injectable so tests can drive every branch
|
|
152
|
-
without touching the real environment.
|
|
153
|
-
|
|
154
|
-
Args:
|
|
155
|
-
running: Version of the *imported* code. Defaults to
|
|
156
|
-
``superlocalmemory.__version__``, which is frozen at import.
|
|
157
|
-
installed_reader: Callable returning the on-disk version. Defaults to
|
|
158
|
-
reading the installed distribution metadata.
|
|
159
|
-
"""
|
|
160
|
-
running_version = running if running is not None else __version__
|
|
161
|
-
|
|
162
|
-
reader = installed_reader or installed_distribution_version
|
|
163
|
-
installed: Optional[str] = None
|
|
164
|
-
try:
|
|
165
|
-
candidate = reader()
|
|
166
|
-
except BaseException: # noqa: BLE001 - staleness reporting must never raise
|
|
167
|
-
# BaseException, not Exception: this runs on daemon and MCP startup
|
|
168
|
-
# paths, and a diagnostic must never be the reason a process dies.
|
|
169
|
-
candidate = None
|
|
170
|
-
|
|
171
|
-
if isinstance(candidate, str) and candidate.strip():
|
|
172
|
-
installed = candidate.strip()
|
|
173
|
-
|
|
174
|
-
if installed is None:
|
|
175
|
-
return VersionIntegrity(
|
|
176
|
-
running=running_version,
|
|
177
|
-
installed=None,
|
|
178
|
-
state=STATE_UNKNOWN,
|
|
179
|
-
detail=(
|
|
180
|
-
f"running {running_version}; could not read the installed "
|
|
181
|
-
f"distribution version, so staleness is undetermined"
|
|
182
|
-
),
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
if running_version == installed:
|
|
186
|
-
return VersionIntegrity(
|
|
187
|
-
running=running_version,
|
|
188
|
-
installed=installed,
|
|
189
|
-
state=STATE_CURRENT,
|
|
190
|
-
detail=f"running {running_version}, matching the installed distribution",
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
running_parts = _version_tuple(running_version)
|
|
194
|
-
installed_parts = _version_tuple(installed)
|
|
195
|
-
|
|
196
|
-
if running_parts is None or installed_parts is None:
|
|
197
|
-
return VersionIntegrity(
|
|
198
|
-
running=running_version,
|
|
199
|
-
installed=installed,
|
|
200
|
-
state=STATE_MISMATCH,
|
|
201
|
-
detail=(
|
|
202
|
-
f"running {running_version} but {installed} is installed; "
|
|
203
|
-
f"the two cannot be ordered"
|
|
204
|
-
),
|
|
205
|
-
hint=_RESTART_HINT,
|
|
206
|
-
)
|
|
207
|
-
|
|
208
|
-
if running_parts < installed_parts:
|
|
209
|
-
return VersionIntegrity(
|
|
210
|
-
running=running_version,
|
|
211
|
-
installed=installed,
|
|
212
|
-
state=STATE_STALE,
|
|
213
|
-
detail=(
|
|
214
|
-
f"running {running_version} but {installed} is installed — this "
|
|
215
|
-
f"process loaded its code before the upgrade and will keep "
|
|
216
|
-
f"serving {running_version} until it restarts"
|
|
217
|
-
),
|
|
218
|
-
hint=_RESTART_HINT,
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
return VersionIntegrity(
|
|
222
|
-
running=running_version,
|
|
223
|
-
installed=installed,
|
|
224
|
-
state=STATE_AHEAD,
|
|
225
|
-
detail=(
|
|
226
|
-
f"running {running_version}, ahead of the installed {installed} "
|
|
227
|
-
f"(normal for an editable or source checkout)"
|
|
228
|
-
),
|
|
229
|
-
)
|
|
@@ -1,13 +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
|
-
"""SLM Ingestion — external source adapters for Gmail, Calendar, Transcripts.
|
|
6
|
-
|
|
7
|
-
ALL adapters are OPT-IN. Nothing runs by default. User enables via:
|
|
8
|
-
slm adapters enable gmail
|
|
9
|
-
slm adapters enable calendar
|
|
10
|
-
slm adapters enable transcript
|
|
11
|
-
|
|
12
|
-
Adapters are stateless external processes that POST to the daemon's /ingest endpoint.
|
|
13
|
-
"""
|
|
@@ -1,255 +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
|
-
"""Adapter lifecycle manager — start, stop, enable, disable ingestion adapters.
|
|
6
|
-
|
|
7
|
-
All adapters run as separate subprocesses managed via PID files.
|
|
8
|
-
Config stored in ~/.superlocalmemory/adapters.json.
|
|
9
|
-
|
|
10
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
11
|
-
License: AGPL-3.0-or-later
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import json
|
|
17
|
-
import logging
|
|
18
|
-
import os
|
|
19
|
-
import subprocess
|
|
20
|
-
import sys
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
|
|
23
|
-
from superlocalmemory.infra.data_root import canonical_data_root, state_path
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger("superlocalmemory.ingestion.manager")
|
|
26
|
-
|
|
27
|
-
_SLM_HOME = None # test-only compatibility override
|
|
28
|
-
_ADAPTERS_CONFIG = None # test-only compatibility override
|
|
29
|
-
_VALID_ADAPTERS = ("gmail", "calendar", "transcript")
|
|
30
|
-
|
|
31
|
-
# Module paths for each adapter
|
|
32
|
-
_ADAPTER_MODULES = {
|
|
33
|
-
"gmail": "superlocalmemory.ingestion.gmail_adapter",
|
|
34
|
-
"calendar": "superlocalmemory.ingestion.calendar_adapter",
|
|
35
|
-
"transcript": "superlocalmemory.ingestion.transcript_adapter",
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def _slm_home() -> Path:
|
|
40
|
-
return Path(_SLM_HOME) if _SLM_HOME is not None else canonical_data_root()
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def _adapters_config_path() -> Path:
|
|
44
|
-
if _ADAPTERS_CONFIG is not None:
|
|
45
|
-
return Path(_ADAPTERS_CONFIG)
|
|
46
|
-
return state_path("adapters.json")
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def _adapter_log_dir() -> Path:
|
|
50
|
-
return _slm_home() / "logs"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def _load_config() -> dict:
|
|
54
|
-
config_path = _adapters_config_path()
|
|
55
|
-
if config_path.exists():
|
|
56
|
-
return json.loads(config_path.read_text())
|
|
57
|
-
return {name: {"enabled": False} for name in _VALID_ADAPTERS}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _save_config(config: dict) -> None:
|
|
61
|
-
config_path = _adapters_config_path()
|
|
62
|
-
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
63
|
-
config_path.write_text(json.dumps(config, indent=2))
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def _pid_file(name: str) -> Path:
|
|
67
|
-
return _slm_home() / f"adapter-{name}.pid"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _is_running(name: str) -> tuple[bool, int | None]:
|
|
71
|
-
"""Check if adapter is running. Returns (running, pid)."""
|
|
72
|
-
pf = _pid_file(name)
|
|
73
|
-
if not pf.exists():
|
|
74
|
-
return False, None
|
|
75
|
-
try:
|
|
76
|
-
pid = int(pf.read_text().strip())
|
|
77
|
-
try:
|
|
78
|
-
import psutil
|
|
79
|
-
return psutil.pid_exists(pid), pid
|
|
80
|
-
except ImportError:
|
|
81
|
-
os.kill(pid, 0)
|
|
82
|
-
return True, pid
|
|
83
|
-
except (ValueError, ProcessLookupError, PermissionError):
|
|
84
|
-
pf.unlink(missing_ok=True)
|
|
85
|
-
return False, None
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
# ---------------------------------------------------------------------------
|
|
89
|
-
# Public API
|
|
90
|
-
# ---------------------------------------------------------------------------
|
|
91
|
-
|
|
92
|
-
def list_adapters() -> list[dict]:
|
|
93
|
-
"""List all adapters with their status."""
|
|
94
|
-
config = _load_config()
|
|
95
|
-
result = []
|
|
96
|
-
for name in _VALID_ADAPTERS:
|
|
97
|
-
ac = config.get(name, {})
|
|
98
|
-
running, pid = _is_running(name)
|
|
99
|
-
result.append({
|
|
100
|
-
"name": name,
|
|
101
|
-
"enabled": ac.get("enabled", False),
|
|
102
|
-
"running": running,
|
|
103
|
-
"pid": pid,
|
|
104
|
-
"tier": ac.get("tier", ""),
|
|
105
|
-
"watch_dir": ac.get("watch_dir", ""),
|
|
106
|
-
})
|
|
107
|
-
return result
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def enable_adapter(name: str) -> dict:
|
|
111
|
-
"""Enable an adapter in config."""
|
|
112
|
-
if name not in _VALID_ADAPTERS:
|
|
113
|
-
return {"ok": False, "error": f"Unknown adapter: {name}. Valid: {_VALID_ADAPTERS}"}
|
|
114
|
-
config = _load_config()
|
|
115
|
-
config.setdefault(name, {})["enabled"] = True
|
|
116
|
-
_save_config(config)
|
|
117
|
-
return {"ok": True, "message": f"{name} adapter enabled. Run `slm adapters start {name}` to start."}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def disable_adapter(name: str) -> dict:
|
|
121
|
-
"""Disable an adapter. Stops it if running."""
|
|
122
|
-
if name not in _VALID_ADAPTERS:
|
|
123
|
-
return {"ok": False, "error": f"Unknown adapter: {name}"}
|
|
124
|
-
stop_adapter(name)
|
|
125
|
-
config = _load_config()
|
|
126
|
-
config.setdefault(name, {})["enabled"] = False
|
|
127
|
-
_save_config(config)
|
|
128
|
-
return {"ok": True, "message": f"{name} adapter disabled"}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def start_adapter(name: str) -> dict:
|
|
132
|
-
"""Start an adapter subprocess."""
|
|
133
|
-
if name not in _VALID_ADAPTERS:
|
|
134
|
-
return {"ok": False, "error": f"Unknown adapter: {name}"}
|
|
135
|
-
|
|
136
|
-
config = _load_config()
|
|
137
|
-
if not config.get(name, {}).get("enabled"):
|
|
138
|
-
return {"ok": False, "error": f"{name} not enabled. Run `slm adapters enable {name}` first."}
|
|
139
|
-
|
|
140
|
-
running, pid = _is_running(name)
|
|
141
|
-
if running:
|
|
142
|
-
return {"ok": True, "message": f"{name} already running (PID {pid})"}
|
|
143
|
-
|
|
144
|
-
module = _ADAPTER_MODULES.get(name)
|
|
145
|
-
if not module:
|
|
146
|
-
return {"ok": False, "error": f"No module for {name}"}
|
|
147
|
-
|
|
148
|
-
cmd = [sys.executable, "-m", module]
|
|
149
|
-
log_dir = _adapter_log_dir()
|
|
150
|
-
log_dir.mkdir(parents=True, exist_ok=True)
|
|
151
|
-
log_path = log_dir / f"adapter-{name}.log"
|
|
152
|
-
|
|
153
|
-
kwargs: dict = {}
|
|
154
|
-
if sys.platform == "win32":
|
|
155
|
-
kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
|
|
156
|
-
else:
|
|
157
|
-
kwargs["start_new_session"] = True
|
|
158
|
-
|
|
159
|
-
with open(log_path, "a") as lf:
|
|
160
|
-
proc = subprocess.Popen(cmd, stdout=lf, stderr=lf, **kwargs)
|
|
161
|
-
|
|
162
|
-
_pid_file(name).write_text(str(proc.pid))
|
|
163
|
-
return {"ok": True, "message": f"{name} started (PID {proc.pid})", "pid": proc.pid}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
def stop_adapter(name: str) -> dict:
|
|
167
|
-
"""Stop a running adapter."""
|
|
168
|
-
running, pid = _is_running(name)
|
|
169
|
-
if not running:
|
|
170
|
-
return {"ok": True, "message": f"{name} not running"}
|
|
171
|
-
|
|
172
|
-
try:
|
|
173
|
-
import psutil
|
|
174
|
-
proc = psutil.Process(pid)
|
|
175
|
-
proc.terminate()
|
|
176
|
-
proc.wait(timeout=10)
|
|
177
|
-
except ImportError:
|
|
178
|
-
# No psutil: best-effort termination. On Windows os.kill(pid, 15) maps to
|
|
179
|
-
# TerminateProcess (a hard kill, not a graceful SIGTERM) — psutil's
|
|
180
|
-
# terminate() does the same there, so behavior is equivalent either way.
|
|
181
|
-
os.kill(pid, 15)
|
|
182
|
-
except Exception:
|
|
183
|
-
pass
|
|
184
|
-
|
|
185
|
-
_pid_file(name).unlink(missing_ok=True)
|
|
186
|
-
return {"ok": True, "message": f"{name} stopped"}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
def status_adapters() -> list[dict]:
|
|
190
|
-
"""Get detailed status of all adapters."""
|
|
191
|
-
return list_adapters()
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
# ---------------------------------------------------------------------------
|
|
195
|
-
# CLI handler (called from commands.py)
|
|
196
|
-
# ---------------------------------------------------------------------------
|
|
197
|
-
|
|
198
|
-
def handle_adapters_cli(args: list[str]) -> None:
|
|
199
|
-
"""Handle `slm adapters <action> [name]` commands."""
|
|
200
|
-
if not args:
|
|
201
|
-
args = ["list"]
|
|
202
|
-
|
|
203
|
-
action = args[0]
|
|
204
|
-
name = args[1] if len(args) > 1 else ""
|
|
205
|
-
|
|
206
|
-
if action == "list":
|
|
207
|
-
adapters = list_adapters()
|
|
208
|
-
print(" Ingestion Adapters:")
|
|
209
|
-
print(" " + "-" * 50)
|
|
210
|
-
for a in adapters:
|
|
211
|
-
status = "running" if a["running"] else ("enabled" if a["enabled"] else "disabled")
|
|
212
|
-
pid_str = f" (PID {a['pid']})" if a["pid"] else ""
|
|
213
|
-
print(f" {a['name']:12s} {status:10s}{pid_str}")
|
|
214
|
-
print()
|
|
215
|
-
|
|
216
|
-
elif action == "enable":
|
|
217
|
-
if not name:
|
|
218
|
-
print(" Usage: slm adapters enable <gmail|calendar|transcript>")
|
|
219
|
-
return
|
|
220
|
-
result = enable_adapter(name)
|
|
221
|
-
print(f" {result.get('message', result.get('error', ''))}")
|
|
222
|
-
|
|
223
|
-
elif action == "disable":
|
|
224
|
-
if not name:
|
|
225
|
-
print(" Usage: slm adapters disable <name>")
|
|
226
|
-
return
|
|
227
|
-
result = disable_adapter(name)
|
|
228
|
-
print(f" {result.get('message', result.get('error', ''))}")
|
|
229
|
-
|
|
230
|
-
elif action == "start":
|
|
231
|
-
if not name:
|
|
232
|
-
print(" Usage: slm adapters start <name>")
|
|
233
|
-
return
|
|
234
|
-
result = start_adapter(name)
|
|
235
|
-
print(f" {result.get('message', result.get('error', ''))}")
|
|
236
|
-
|
|
237
|
-
elif action == "stop":
|
|
238
|
-
if not name:
|
|
239
|
-
print(" Usage: slm adapters stop <name>")
|
|
240
|
-
return
|
|
241
|
-
result = stop_adapter(name)
|
|
242
|
-
print(f" {result.get('message', result.get('error', ''))}")
|
|
243
|
-
|
|
244
|
-
elif action == "status":
|
|
245
|
-
adapters = status_adapters()
|
|
246
|
-
for a in adapters:
|
|
247
|
-
status = "RUNNING" if a["running"] else ("enabled" if a["enabled"] else "off")
|
|
248
|
-
print(f" {a['name']:12s} [{status}]", end="")
|
|
249
|
-
if a["pid"]:
|
|
250
|
-
print(f" PID={a['pid']}", end="")
|
|
251
|
-
print()
|
|
252
|
-
|
|
253
|
-
else:
|
|
254
|
-
print(f" Unknown action: {action}")
|
|
255
|
-
print(" Usage: slm adapters <list|enable|disable|start|stop|status> [name]")
|
|
@@ -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 | https://qualixar.com | https://varunpratap.com
|
|
4
|
-
|
|
5
|
-
"""Base adapter class for all ingestion adapters.
|
|
6
|
-
|
|
7
|
-
All adapters inherit this. Enforces stateless, safe, cross-platform operation:
|
|
8
|
-
- Clean shutdown via stop event + parent PID watchdog
|
|
9
|
-
- Rate limiting per hour
|
|
10
|
-
- Batch throttling with interruptible delays
|
|
11
|
-
- Retry on 429 responses
|
|
12
|
-
- Structured logging
|
|
13
|
-
|
|
14
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
15
|
-
License: AGPL-3.0-or-later
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import logging
|
|
21
|
-
import os
|
|
22
|
-
import signal
|
|
23
|
-
import sys
|
|
24
|
-
import threading
|
|
25
|
-
import time
|
|
26
|
-
from dataclasses import dataclass, field
|
|
27
|
-
from pathlib import Path
|
|
28
|
-
from typing import NamedTuple
|
|
29
|
-
|
|
30
|
-
logger = logging.getLogger("superlocalmemory.ingestion")
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@dataclass
|
|
34
|
-
class AdapterConfig:
|
|
35
|
-
daemon_port: int = 8765
|
|
36
|
-
batch_size: int = 50
|
|
37
|
-
batch_delay_sec: float = 5.0
|
|
38
|
-
rate_limit_per_hour: int = 100
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class IngestItem(NamedTuple):
|
|
42
|
-
content: str
|
|
43
|
-
dedup_key: str
|
|
44
|
-
metadata: dict = {}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class BaseAdapter:
|
|
48
|
-
"""All ingestion adapters inherit this class.
|
|
49
|
-
|
|
50
|
-
Provides: run loop, rate limiting, retry, shutdown, parent watchdog.
|
|
51
|
-
Subclasses implement: fetch_items(), wait_for_next_cycle(), source_type.
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
source_type: str = "unknown"
|
|
55
|
-
|
|
56
|
-
def __init__(self, config: AdapterConfig | None = None):
|
|
57
|
-
self.config = config or AdapterConfig()
|
|
58
|
-
self.daemon_url = f"http://127.0.0.1:{self.config.daemon_port}"
|
|
59
|
-
self._items_this_hour = 0
|
|
60
|
-
self._hour_start = time.time()
|
|
61
|
-
self._stop_event = threading.Event()
|
|
62
|
-
self._parent_pid = os.getppid()
|
|
63
|
-
self._total_ingested = 0
|
|
64
|
-
|
|
65
|
-
def run(self) -> None:
|
|
66
|
-
"""Main adapter loop. Subclasses don't override this."""
|
|
67
|
-
self._setup_signals()
|
|
68
|
-
logger.info("%s adapter started (PID %d)", self.source_type, os.getpid())
|
|
69
|
-
|
|
70
|
-
while not self._stop_event.is_set():
|
|
71
|
-
# Parent watchdog: exit if daemon died
|
|
72
|
-
try:
|
|
73
|
-
import psutil
|
|
74
|
-
if not psutil.pid_exists(self._parent_pid):
|
|
75
|
-
logger.info("Parent daemon died, adapter exiting")
|
|
76
|
-
break
|
|
77
|
-
except ImportError:
|
|
78
|
-
try:
|
|
79
|
-
os.kill(self._parent_pid, 0)
|
|
80
|
-
except (ProcessLookupError, PermissionError):
|
|
81
|
-
logger.info("Parent daemon died, adapter exiting")
|
|
82
|
-
break
|
|
83
|
-
|
|
84
|
-
try:
|
|
85
|
-
items = self.fetch_items()
|
|
86
|
-
except Exception as exc:
|
|
87
|
-
logger.warning("fetch_items failed: %s", exc)
|
|
88
|
-
self._stop_event.wait(30)
|
|
89
|
-
continue
|
|
90
|
-
|
|
91
|
-
if not items:
|
|
92
|
-
self.wait_for_next_cycle()
|
|
93
|
-
continue
|
|
94
|
-
|
|
95
|
-
# Process in batches
|
|
96
|
-
for i in range(0, len(items), self.config.batch_size):
|
|
97
|
-
if self._stop_event.is_set():
|
|
98
|
-
break
|
|
99
|
-
batch = items[i:i + self.config.batch_size]
|
|
100
|
-
for item in batch:
|
|
101
|
-
if self._stop_event.is_set():
|
|
102
|
-
break
|
|
103
|
-
if self._rate_limited():
|
|
104
|
-
logger.info("Rate limit reached (%d/hr), waiting",
|
|
105
|
-
self.config.rate_limit_per_hour)
|
|
106
|
-
self._stop_event.wait(60)
|
|
107
|
-
continue
|
|
108
|
-
self._ingest(item)
|
|
109
|
-
# Interruptible batch delay
|
|
110
|
-
self._stop_event.wait(self.config.batch_delay_sec)
|
|
111
|
-
|
|
112
|
-
self.wait_for_next_cycle()
|
|
113
|
-
|
|
114
|
-
logger.info("%s adapter stopped (total ingested: %d)",
|
|
115
|
-
self.source_type, self._total_ingested)
|
|
116
|
-
|
|
117
|
-
def stop(self) -> None:
|
|
118
|
-
self._stop_event.set()
|
|
119
|
-
|
|
120
|
-
# -- Subclass interface --
|
|
121
|
-
|
|
122
|
-
def fetch_items(self) -> list[IngestItem]:
|
|
123
|
-
"""Fetch items from the source. Subclass MUST implement."""
|
|
124
|
-
raise NotImplementedError
|
|
125
|
-
|
|
126
|
-
def wait_for_next_cycle(self) -> None:
|
|
127
|
-
"""Wait before next fetch cycle. Default: 5 min interruptible."""
|
|
128
|
-
self._stop_event.wait(300)
|
|
129
|
-
|
|
130
|
-
# -- Internal --
|
|
131
|
-
|
|
132
|
-
def _ingest(self, item: IngestItem) -> bool:
|
|
133
|
-
"""POST to daemon /ingest endpoint. Returns True on success."""
|
|
134
|
-
payload = {
|
|
135
|
-
"content": item.content,
|
|
136
|
-
"source_type": self.source_type,
|
|
137
|
-
"dedup_key": item.dedup_key,
|
|
138
|
-
"metadata": item.metadata if item.metadata else {},
|
|
139
|
-
}
|
|
140
|
-
for attempt in range(2):
|
|
141
|
-
try:
|
|
142
|
-
from superlocalmemory.cli.daemon import daemon_request
|
|
143
|
-
|
|
144
|
-
data = daemon_request("POST", "/ingest", payload)
|
|
145
|
-
if data and data.get("ingested"):
|
|
146
|
-
self._items_this_hour += 1
|
|
147
|
-
self._total_ingested += 1
|
|
148
|
-
return True
|
|
149
|
-
return False # Already ingested (dedup)
|
|
150
|
-
except Exception as exc:
|
|
151
|
-
if "429" in str(exc) and attempt == 0:
|
|
152
|
-
logger.info("Daemon returned 429, backing off 5s")
|
|
153
|
-
self._stop_event.wait(5)
|
|
154
|
-
continue
|
|
155
|
-
logger.debug("Ingest failed: %s", exc)
|
|
156
|
-
return False
|
|
157
|
-
return False
|
|
158
|
-
|
|
159
|
-
def _rate_limited(self) -> bool:
|
|
160
|
-
if time.time() - self._hour_start > 3600:
|
|
161
|
-
self._items_this_hour = 0
|
|
162
|
-
self._hour_start = time.time()
|
|
163
|
-
return self._items_this_hour >= self.config.rate_limit_per_hour
|
|
164
|
-
|
|
165
|
-
def _setup_signals(self) -> None:
|
|
166
|
-
"""Set up clean shutdown on SIGTERM."""
|
|
167
|
-
def _handler(sig, frame):
|
|
168
|
-
self.stop()
|
|
169
|
-
signal.signal(signal.SIGTERM, _handler)
|
|
170
|
-
if sys.platform != "win32":
|
|
171
|
-
signal.signal(signal.SIGINT, _handler)
|