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,291 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""Per-fact outcome score: read it, update it, and damp it honestly.
|
|
5
|
-
|
|
6
|
-
WHAT IT IS
|
|
7
|
-
----------
|
|
8
|
-
One number per (fact, profile): an exponentially-weighted average of the rewards
|
|
9
|
-
of the settlements that fact took part in. Ranking otherwise scores a memory
|
|
10
|
-
purely by how much it *resembles* the query — nothing in the pipeline knows
|
|
11
|
-
whether a memory has ever actually helped.
|
|
12
|
-
|
|
13
|
-
WHY IT IS NOT A MODEL FEATURE, WHICH AN EARLIER DESIGN GOT BACKWARDS
|
|
14
|
-
----------------------------------------------------------------
|
|
15
|
-
An earlier design said to add ``"outcome_score"`` to ``FEATURE_NAMES`` for inference and
|
|
16
|
-
exclude it from the training matrix. That cannot work, and the model's own
|
|
17
|
-
closing gotcha says why: ``booster.predict(X)`` needs the same columns in the
|
|
18
|
-
same order the model was trained on. A feature present at inference and absent
|
|
19
|
-
in training is a shape mismatch, not a clever exclusion.
|
|
20
|
-
|
|
21
|
-
Two more reasons, both checkable: ``features.py`` asserts
|
|
22
|
-
``len(FEATURE_NAMES) == FEATURE_DIM`` with ``FEATURE_DIM = 20``, and
|
|
23
|
-
``routes/brain.py`` surfaces that constant as ``feature_count_expected``. The
|
|
24
|
-
live model is a 20-feature model. Adding a 21st silently invalidates it.
|
|
25
|
-
|
|
26
|
-
So PCOS is applied AFTER the model score, as a bonus on the ranking score. That
|
|
27
|
-
satisfies this true by construction: there is nothing to exclude from
|
|
28
|
-
training because it never enters training. Self-reinforcement — "model learns
|
|
29
|
-
high PCOS wins, which raises PCOS" — is impossible when the model cannot see it.
|
|
30
|
-
|
|
31
|
-
THE TWO DAMPING RULES, AND WHAT EACH IS FOR
|
|
32
|
-
-------------------------------------------
|
|
33
|
-
**Confidence weighting.** A fact settled once at reward 1.0 is not a fact that
|
|
34
|
-
works; it is a fact that worked once. The bonus is scaled by
|
|
35
|
-
``log1p(play_count) / log1p(20)``, so a single settlement contributes ~1/5 of
|
|
36
|
-
what twenty do, and an unsettled fact contributes exactly nothing rather than
|
|
37
|
-
being penalised for being new.
|
|
38
|
-
|
|
39
|
-
**Rich-get-richer.** A fact that ranks well gets shown, gets settled, ranks
|
|
40
|
-
better. Measured over 1,000 simulated queries with near-tied retrieval scores,
|
|
41
|
-
the single most-favoured fact took first place in 5.30% of them with the bonus
|
|
42
|
-
on and 1.30% with it off — so the bonus alone breaks the release limit
|
|
43
|
-
of "no fact above 5%". The counter-pressure is ``RecentTopCounter``: once a fact
|
|
44
|
-
has won first place ``_CAP_MIN`` times inside a rolling window it stops
|
|
45
|
-
receiving the bonus. Not removed and not demoted — a memory that genuinely keeps
|
|
46
|
-
being relevant must stay returnable. It only stops compounding.
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
from __future__ import annotations
|
|
50
|
-
|
|
51
|
-
import logging
|
|
52
|
-
import math
|
|
53
|
-
import sqlite3
|
|
54
|
-
from collections import defaultdict
|
|
55
|
-
from pathlib import Path
|
|
56
|
-
|
|
57
|
-
logger = logging.getLogger(__name__)
|
|
58
|
-
|
|
59
|
-
__all__ = [
|
|
60
|
-
"fetch_scores",
|
|
61
|
-
"update_scores",
|
|
62
|
-
"confidence_weight",
|
|
63
|
-
"bonus_for",
|
|
64
|
-
"RecentTopCounter",
|
|
65
|
-
"RECENT_TOPS",
|
|
66
|
-
"TAU",
|
|
67
|
-
"MAX_BONUS",
|
|
68
|
-
]
|
|
69
|
-
|
|
70
|
-
#: EMA rate. Low on purpose: one outcome should nudge a score, not define it.
|
|
71
|
-
TAU = 0.1
|
|
72
|
-
|
|
73
|
-
#: play_count at which a score is trusted in full.
|
|
74
|
-
_FULL_CONFIDENCE_PLAYS = 20
|
|
75
|
-
|
|
76
|
-
#: Largest absolute change PCOS may make to a ranking score, as a fraction.
|
|
77
|
-
#: The point of PCOS is to break ties between similar-looking memories, not to
|
|
78
|
-
#: overrule the retrieval that found them — a memory that does not match the
|
|
79
|
-
#: query must never be dragged to the top by history.
|
|
80
|
-
MAX_BONUS = 0.15
|
|
81
|
-
|
|
82
|
-
#: First-place finishes inside the rolling window before a fact stops
|
|
83
|
-
#: receiving the bonus. Three is low on purpose: the measurement shows
|
|
84
|
-
#: concentration comes from a small number of repeat winners, so the cap has to
|
|
85
|
-
#: bite early to matter at all.
|
|
86
|
-
_CAP_MIN = 3
|
|
87
|
-
|
|
88
|
-
_NEUTRAL = 0.5
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
def confidence_weight(play_count: int) -> float:
|
|
92
|
-
"""How much of a fact's score to believe, from how often it has settled.
|
|
93
|
-
|
|
94
|
-
``log1p`` rather than linear: the difference between one settlement and two
|
|
95
|
-
is far more informative than between nineteen and twenty.
|
|
96
|
-
"""
|
|
97
|
-
if play_count <= 0:
|
|
98
|
-
return 0.0
|
|
99
|
-
return min(1.0, math.log1p(play_count) / math.log1p(_FULL_CONFIDENCE_PLAYS))
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def bonus_for(score: float, play_count: int) -> float:
|
|
103
|
-
"""Signed ranking bonus in ``[-MAX_BONUS, +MAX_BONUS]``.
|
|
104
|
-
|
|
105
|
-
Centred on 0.5, so a fact whose outcomes are neutral gets no bonus at all
|
|
106
|
-
and an unproven fact is never penalised relative to one that has never been
|
|
107
|
-
tried.
|
|
108
|
-
"""
|
|
109
|
-
return (
|
|
110
|
-
(float(score) - _NEUTRAL) * 2.0
|
|
111
|
-
* confidence_weight(int(play_count))
|
|
112
|
-
* MAX_BONUS
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
class RecentTopCounter:
|
|
117
|
-
"""How often each fact has recently won first place, per profile.
|
|
118
|
-
|
|
119
|
-
WHY THIS EXISTS, AND WHY IT IS NOT OPTIONAL. Measured over a
|
|
120
|
-
1,000-query simulation with 200 facts and near-tied retrieval scores
|
|
121
|
-
(spread 0.02, which is what an embedding channel actually returns for
|
|
122
|
-
closely related memories), the single most-favoured fact took first place:
|
|
123
|
-
|
|
124
|
-
no outcome bonus 1.30% of queries
|
|
125
|
-
bonus, MAX_BONUS = 0.15 5.30% of queries
|
|
126
|
-
|
|
127
|
-
The release limit is "no fact reaches more than 5% of displays over
|
|
128
|
-
a 1,000-query simulation". The bonus alone breaks it. A control run with the
|
|
129
|
-
bonus disabled sits at 1.30% at every spread, so the bonus is the cause and
|
|
130
|
-
not the tie-breaking — that control is the only reason this is known.
|
|
131
|
-
|
|
132
|
-
HOW IT DIFFERS FROM THE PLAN. The original countermeasure multiplies a capped
|
|
133
|
-
fact's ``ranking_score`` by 0.1. That is a 10x demotion of a memory whose
|
|
134
|
-
only offence is having been useful three times, and it would visibly damage
|
|
135
|
-
answers — a genuinely relevant memory must stay returnable. This instead
|
|
136
|
-
withholds the BONUS from a fact that has recently been winning. The fact
|
|
137
|
-
keeps every point retrieval gave it and simply stops compounding.
|
|
138
|
-
|
|
139
|
-
WHY A ROLLING WINDOW RATHER THAN A SESSION. ``run_recall`` has no
|
|
140
|
-
``session_id`` parameter, so there is no session identity at this layer to
|
|
141
|
-
key on, and threading one through every caller to bound an in-memory
|
|
142
|
-
counter is not worth it. A rolling window over the last ``_WINDOW`` queries
|
|
143
|
-
per profile gives the same property — recent concentration is what
|
|
144
|
-
compounds — without new plumbing. In-process and ephemeral on purpose: a DB
|
|
145
|
-
write per displayed fact per query is exactly the contention the exposure
|
|
146
|
-
enqueue was switched off to avoid.
|
|
147
|
-
"""
|
|
148
|
-
|
|
149
|
-
__slots__ = ("_counts", "_seen")
|
|
150
|
-
|
|
151
|
-
#: Queries per profile before the window resets.
|
|
152
|
-
_WINDOW = 200
|
|
153
|
-
|
|
154
|
-
def __init__(self) -> None:
|
|
155
|
-
self._counts: dict[str, dict[str, int]] = defaultdict(
|
|
156
|
-
lambda: defaultdict(int)
|
|
157
|
-
)
|
|
158
|
-
self._seen: dict[str, int] = defaultdict(int)
|
|
159
|
-
|
|
160
|
-
def record_top(self, profile_id: str, fact_id: str) -> None:
|
|
161
|
-
"""Note that ``fact_id`` took first place for ``profile_id``.
|
|
162
|
-
|
|
163
|
-
The window DECAYS rather than being dropped. Emptying it wholesale every
|
|
164
|
-
``_WINDOW`` queries handed every previously-capped memory its bonus back
|
|
165
|
-
at the same instant, so concentration spiked immediately after each
|
|
166
|
-
reset — the cap stopped biting exactly when the run-up had made it most
|
|
167
|
-
necessary. Halving instead keeps a repeat winner near its cap and lets a
|
|
168
|
-
memory that has stopped winning recover gradually.
|
|
169
|
-
"""
|
|
170
|
-
key = profile_id or ""
|
|
171
|
-
self._seen[key] += 1
|
|
172
|
-
if self._seen[key] > self._WINDOW:
|
|
173
|
-
bucket = self._counts.get(key)
|
|
174
|
-
if bucket:
|
|
175
|
-
halved = {f: c // 2 for f, c in bucket.items() if c > 1}
|
|
176
|
-
self._counts[key] = defaultdict(int, halved)
|
|
177
|
-
self._seen[key] = 0
|
|
178
|
-
self._counts[key][fact_id] += 1
|
|
179
|
-
|
|
180
|
-
def tops(self, profile_id: str, fact_id: str) -> int:
|
|
181
|
-
return self._counts.get(profile_id or "", {}).get(fact_id, 0)
|
|
182
|
-
|
|
183
|
-
def capped(self, profile_id: str, fact_id: str) -> bool:
|
|
184
|
-
"""Whether this fact has won often enough to stop earning a bonus."""
|
|
185
|
-
return self.tops(profile_id, fact_id) >= _CAP_MIN
|
|
186
|
-
|
|
187
|
-
def forget(self, profile_id: str) -> None:
|
|
188
|
-
"""Drop everything held for a profile. Called on erasure.
|
|
189
|
-
|
|
190
|
-
In-process and ephemeral, so it dies with the process anyway — but an
|
|
191
|
-
Article 17 request must not leave a profile's recent winners sitting in
|
|
192
|
-
a live process's memory for the rest of its lifetime.
|
|
193
|
-
"""
|
|
194
|
-
key = profile_id or ""
|
|
195
|
-
self._counts.pop(key, None)
|
|
196
|
-
self._seen.pop(key, None)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
#: One counter for the process. Ephemeral by design — see the class docstring.
|
|
200
|
-
RECENT_TOPS = RecentTopCounter()
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def fetch_scores(
|
|
204
|
-
conn: sqlite3.Connection,
|
|
205
|
-
profile_id: str,
|
|
206
|
-
fact_ids: list[str],
|
|
207
|
-
) -> dict[str, tuple[float, int]]:
|
|
208
|
-
"""``{fact_id: (score, play_count)}`` for the ids that have a row.
|
|
209
|
-
|
|
210
|
-
One batched query against the ``(fact_id, profile_id)`` primary key rather
|
|
211
|
-
than a LEFT JOIN into the hydration SQL, which is what an earlier design proposed.
|
|
212
|
-
The JOIN would have to reach ``AtomicFact``, and ``_row_to_fact`` ignores
|
|
213
|
-
columns the dataclass does not declare — so it would mean adding fields to a
|
|
214
|
-
model used across the whole codebase to carry a number only the ranker
|
|
215
|
-
reads. A missing row is a cold start, and the caller treats it as neutral.
|
|
216
|
-
|
|
217
|
-
Never raises: on a store where M045 has not run this returns ``{}`` and
|
|
218
|
-
ranking proceeds exactly as it did before PCOS existed.
|
|
219
|
-
"""
|
|
220
|
-
ids = [str(f) for f in fact_ids if f]
|
|
221
|
-
if not ids:
|
|
222
|
-
return {}
|
|
223
|
-
placeholders = ", ".join("?" * len(ids))
|
|
224
|
-
try:
|
|
225
|
-
rows = conn.execute(
|
|
226
|
-
"SELECT fact_id, score, play_count FROM fact_outcome_score "
|
|
227
|
-
f"WHERE profile_id = ? AND fact_id IN ({placeholders})",
|
|
228
|
-
(str(profile_id), *ids),
|
|
229
|
-
).fetchall()
|
|
230
|
-
except sqlite3.Error as exc:
|
|
231
|
-
logger.debug("pcos.fetch_scores unavailable: %s", exc)
|
|
232
|
-
return {}
|
|
233
|
-
out: dict[str, tuple[float, int]] = {}
|
|
234
|
-
for row in rows:
|
|
235
|
-
try:
|
|
236
|
-
out[str(row[0])] = (float(row[1]), int(row[2]))
|
|
237
|
-
except (TypeError, ValueError, IndexError):
|
|
238
|
-
continue
|
|
239
|
-
return out
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def update_scores(
|
|
243
|
-
conn: sqlite3.Connection,
|
|
244
|
-
profile_id: str,
|
|
245
|
-
fact_ids: list[str],
|
|
246
|
-
reward: float,
|
|
247
|
-
) -> int:
|
|
248
|
-
"""Fold ``reward`` into each fact's score. Returns rows written.
|
|
249
|
-
|
|
250
|
-
Shrinkage on the way in: the effective rate is ``TAU * min(1, plays/10)``, so
|
|
251
|
-
the first few settlements move a score gently and a single lucky outcome
|
|
252
|
-
cannot define a fact. A fact with no row starts from the neutral prior and
|
|
253
|
-
takes one ``TAU`` step toward the reward.
|
|
254
|
-
|
|
255
|
-
The caller owns the transaction. Never raises — a lost PCOS update costs one
|
|
256
|
-
increment of a score that is advisory by construction, and it must never
|
|
257
|
-
take down the settlement that produced it.
|
|
258
|
-
"""
|
|
259
|
-
ids = [str(f) for f in fact_ids if f]
|
|
260
|
-
if not ids:
|
|
261
|
-
return 0
|
|
262
|
-
try:
|
|
263
|
-
reward_f = max(0.0, min(1.0, float(reward)))
|
|
264
|
-
except (TypeError, ValueError):
|
|
265
|
-
return 0
|
|
266
|
-
|
|
267
|
-
existing = fetch_scores(conn, profile_id, ids)
|
|
268
|
-
written = 0
|
|
269
|
-
for fid in ids:
|
|
270
|
-
old_score, old_plays = existing.get(fid, (_NEUTRAL, 0))
|
|
271
|
-
if old_plays <= 0:
|
|
272
|
-
new_score = _NEUTRAL + TAU * (reward_f - _NEUTRAL)
|
|
273
|
-
else:
|
|
274
|
-
rate = TAU * min(1.0, old_plays / 10.0)
|
|
275
|
-
new_score = (1.0 - rate) * old_score + rate * reward_f
|
|
276
|
-
new_score = max(0.0, min(1.0, new_score))
|
|
277
|
-
try:
|
|
278
|
-
conn.execute(
|
|
279
|
-
"INSERT INTO fact_outcome_score "
|
|
280
|
-
"(fact_id, profile_id, score, play_count, updated_at) "
|
|
281
|
-
"VALUES (?, ?, ?, ?, datetime('now')) "
|
|
282
|
-
"ON CONFLICT (fact_id, profile_id) DO UPDATE SET "
|
|
283
|
-
" score = excluded.score, "
|
|
284
|
-
" play_count = fact_outcome_score.play_count + 1, "
|
|
285
|
-
" updated_at = excluded.updated_at",
|
|
286
|
-
(fid, str(profile_id), new_score, old_plays + 1),
|
|
287
|
-
)
|
|
288
|
-
written += 1
|
|
289
|
-
except sqlite3.Error as exc:
|
|
290
|
-
logger.debug("pcos.update_scores %s: %s", fid, exc)
|
|
291
|
-
return written
|
|
@@ -1,366 +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
|
-
"""Project context detection via filesystem analysis.
|
|
6
|
-
|
|
7
|
-
Scans a directory for project manifest files (package.json, pyproject.toml,
|
|
8
|
-
Cargo.toml, etc.) and extracts project metadata: name, languages, frameworks,
|
|
9
|
-
build tools. No database access -- pure filesystem analysis.
|
|
10
|
-
|
|
11
|
-
Ported from V2 ProjectContextManager. V2 memory.db multi-signal detection
|
|
12
|
-
replaced with direct filesystem scanning (the DB-based signals are handled
|
|
13
|
-
by the retrieval layer in V3).
|
|
14
|
-
|
|
15
|
-
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import json
|
|
21
|
-
import logging
|
|
22
|
-
import re
|
|
23
|
-
from pathlib import Path
|
|
24
|
-
from typing import Any, Optional
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger(__name__)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# ---------------------------------------------------------------------------
|
|
30
|
-
# Manifest definitions
|
|
31
|
-
# ---------------------------------------------------------------------------
|
|
32
|
-
|
|
33
|
-
# Each manifest maps a filename to a parser function name.
|
|
34
|
-
# The parser extracts (project_name, languages, frameworks) from the file.
|
|
35
|
-
|
|
36
|
-
_MANIFEST_FILES: list[dict[str, Any]] = [
|
|
37
|
-
{
|
|
38
|
-
"filename": "package.json",
|
|
39
|
-
"languages": ["javascript", "typescript"],
|
|
40
|
-
"parser": "_parse_package_json",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"filename": "pyproject.toml",
|
|
44
|
-
"languages": ["python"],
|
|
45
|
-
"parser": "_parse_pyproject_toml",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"filename": "Cargo.toml",
|
|
49
|
-
"languages": ["rust"],
|
|
50
|
-
"parser": "_parse_cargo_toml",
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"filename": "go.mod",
|
|
54
|
-
"languages": ["go"],
|
|
55
|
-
"parser": "_parse_go_mod",
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"filename": "pom.xml",
|
|
59
|
-
"languages": ["java"],
|
|
60
|
-
"parser": "_parse_pom_xml",
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"filename": "build.gradle",
|
|
64
|
-
"languages": ["java", "kotlin"],
|
|
65
|
-
"parser": "_parse_gradle",
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"filename": "build.gradle.kts",
|
|
69
|
-
"languages": ["kotlin"],
|
|
70
|
-
"parser": "_parse_gradle",
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"filename": "Gemfile",
|
|
74
|
-
"languages": ["ruby"],
|
|
75
|
-
"parser": "_parse_gemfile",
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"filename": "composer.json",
|
|
79
|
-
"languages": ["php"],
|
|
80
|
-
"parser": "_parse_composer_json",
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"filename": "pubspec.yaml",
|
|
84
|
-
"languages": ["dart"],
|
|
85
|
-
"parser": "_parse_pubspec_yaml",
|
|
86
|
-
},
|
|
87
|
-
]
|
|
88
|
-
|
|
89
|
-
# Framework detection via dependency names
|
|
90
|
-
_FRAMEWORK_HINTS: dict[str, str] = {
|
|
91
|
-
"react": "React",
|
|
92
|
-
"react-dom": "React",
|
|
93
|
-
"vue": "Vue",
|
|
94
|
-
"next": "Next.js",
|
|
95
|
-
"nuxt": "Nuxt",
|
|
96
|
-
"angular": "Angular",
|
|
97
|
-
"svelte": "Svelte",
|
|
98
|
-
"@sveltejs/kit": "SvelteKit",
|
|
99
|
-
"express": "Express",
|
|
100
|
-
"fastapi": "FastAPI",
|
|
101
|
-
"django": "Django",
|
|
102
|
-
"flask": "Flask",
|
|
103
|
-
"fastify": "Fastify",
|
|
104
|
-
"spring-boot": "Spring Boot",
|
|
105
|
-
"rails": "Rails",
|
|
106
|
-
"nestjs": "NestJS",
|
|
107
|
-
"@nestjs/core": "NestJS",
|
|
108
|
-
"tailwindcss": "Tailwind CSS",
|
|
109
|
-
"pytest": "pytest",
|
|
110
|
-
"jest": "Jest",
|
|
111
|
-
"vitest": "Vitest",
|
|
112
|
-
"torch": "PyTorch",
|
|
113
|
-
"tensorflow": "TensorFlow",
|
|
114
|
-
"transformers": "Hugging Face",
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
class ProjectContextManager:
|
|
119
|
-
"""Detect project context from the filesystem.
|
|
120
|
-
|
|
121
|
-
No database needed -- scans the target directory for manifest files
|
|
122
|
-
and extracts project metadata.
|
|
123
|
-
"""
|
|
124
|
-
|
|
125
|
-
def detect(self, path: Path | str) -> dict[str, Any]:
|
|
126
|
-
"""Detect project context from a directory.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
path: Directory to scan.
|
|
130
|
-
|
|
131
|
-
Returns:
|
|
132
|
-
Dict with keys: project_name, languages, frameworks,
|
|
133
|
-
build_tool, manifest_file. All values may be None/empty
|
|
134
|
-
when no manifest is found.
|
|
135
|
-
"""
|
|
136
|
-
directory = Path(path)
|
|
137
|
-
if not directory.is_dir():
|
|
138
|
-
return _empty_context()
|
|
139
|
-
|
|
140
|
-
# Try each manifest file
|
|
141
|
-
for manifest_def in _MANIFEST_FILES:
|
|
142
|
-
manifest_path = directory / manifest_def["filename"]
|
|
143
|
-
if not manifest_path.exists():
|
|
144
|
-
continue
|
|
145
|
-
|
|
146
|
-
parser_name = manifest_def["parser"]
|
|
147
|
-
parser = _PARSERS.get(parser_name)
|
|
148
|
-
if parser is None:
|
|
149
|
-
continue
|
|
150
|
-
|
|
151
|
-
try:
|
|
152
|
-
info = parser(manifest_path)
|
|
153
|
-
except Exception as exc:
|
|
154
|
-
logger.debug(
|
|
155
|
-
"Failed to parse %s: %s", manifest_path, exc
|
|
156
|
-
)
|
|
157
|
-
continue
|
|
158
|
-
|
|
159
|
-
# Merge manifest-defined languages
|
|
160
|
-
languages = list(
|
|
161
|
-
set(info.get("languages", []) + manifest_def["languages"])
|
|
162
|
-
)
|
|
163
|
-
return {
|
|
164
|
-
"project_name": info.get("project_name") or directory.name,
|
|
165
|
-
"languages": languages,
|
|
166
|
-
"frameworks": info.get("frameworks", []),
|
|
167
|
-
"build_tool": info.get("build_tool"),
|
|
168
|
-
"manifest_file": manifest_def["filename"],
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
# Fallback: infer from file extensions
|
|
172
|
-
return self._infer_from_extensions(directory)
|
|
173
|
-
|
|
174
|
-
# ------------------------------------------------------------------
|
|
175
|
-
# Fallback extension scanning
|
|
176
|
-
# ------------------------------------------------------------------
|
|
177
|
-
|
|
178
|
-
@staticmethod
|
|
179
|
-
def _infer_from_extensions(directory: Path) -> dict[str, Any]:
|
|
180
|
-
"""Scan for source files and infer language from extensions."""
|
|
181
|
-
ext_map: dict[str, str] = {
|
|
182
|
-
".py": "python",
|
|
183
|
-
".js": "javascript",
|
|
184
|
-
".ts": "typescript",
|
|
185
|
-
".tsx": "typescript",
|
|
186
|
-
".jsx": "javascript",
|
|
187
|
-
".rs": "rust",
|
|
188
|
-
".go": "go",
|
|
189
|
-
".java": "java",
|
|
190
|
-
".kt": "kotlin",
|
|
191
|
-
".rb": "ruby",
|
|
192
|
-
".php": "php",
|
|
193
|
-
".dart": "dart",
|
|
194
|
-
".swift": "swift",
|
|
195
|
-
".cs": "csharp",
|
|
196
|
-
".cpp": "cpp",
|
|
197
|
-
".c": "c",
|
|
198
|
-
}
|
|
199
|
-
detected: set[str] = set()
|
|
200
|
-
try:
|
|
201
|
-
for child in directory.iterdir():
|
|
202
|
-
if child.is_file() and child.suffix in ext_map:
|
|
203
|
-
detected.add(ext_map[child.suffix])
|
|
204
|
-
except PermissionError:
|
|
205
|
-
pass
|
|
206
|
-
|
|
207
|
-
return {
|
|
208
|
-
"project_name": directory.name,
|
|
209
|
-
"languages": sorted(detected),
|
|
210
|
-
"frameworks": [],
|
|
211
|
-
"build_tool": None,
|
|
212
|
-
"manifest_file": None,
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
# ----------------------------------------------------------------------
|
|
217
|
-
# Parsers (one per manifest type)
|
|
218
|
-
# ----------------------------------------------------------------------
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
def _parse_package_json(path: Path) -> dict[str, Any]:
|
|
222
|
-
with open(path, "r", encoding="utf-8") as f:
|
|
223
|
-
data = json.load(f)
|
|
224
|
-
deps = set(data.get("dependencies", {}).keys())
|
|
225
|
-
deps |= set(data.get("devDependencies", {}).keys())
|
|
226
|
-
frameworks = [
|
|
227
|
-
_FRAMEWORK_HINTS[d] for d in deps if d in _FRAMEWORK_HINTS
|
|
228
|
-
]
|
|
229
|
-
lang = ["typescript"] if "typescript" in deps else ["javascript"]
|
|
230
|
-
return {
|
|
231
|
-
"project_name": data.get("name", ""),
|
|
232
|
-
"languages": lang,
|
|
233
|
-
"frameworks": sorted(set(frameworks)),
|
|
234
|
-
"build_tool": "npm",
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
def _parse_pyproject_toml(path: Path) -> dict[str, Any]:
|
|
239
|
-
text = path.read_text(encoding="utf-8")
|
|
240
|
-
name = ""
|
|
241
|
-
# Simple TOML name extraction (no toml library required)
|
|
242
|
-
m = re.search(r'name\s*=\s*["\']([^"\']+)["\']', text)
|
|
243
|
-
if m:
|
|
244
|
-
name = m.group(1)
|
|
245
|
-
|
|
246
|
-
# Detect frameworks from dependencies section
|
|
247
|
-
frameworks: list[str] = []
|
|
248
|
-
for hint_key, hint_name in _FRAMEWORK_HINTS.items():
|
|
249
|
-
if hint_key in text.lower():
|
|
250
|
-
frameworks.append(hint_name)
|
|
251
|
-
|
|
252
|
-
build_tool = "poetry" if "[tool.poetry]" in text else "setuptools"
|
|
253
|
-
if "[tool.hatch]" in text:
|
|
254
|
-
build_tool = "hatch"
|
|
255
|
-
|
|
256
|
-
return {
|
|
257
|
-
"project_name": name,
|
|
258
|
-
"languages": ["python"],
|
|
259
|
-
"frameworks": sorted(set(frameworks)),
|
|
260
|
-
"build_tool": build_tool,
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
def _parse_cargo_toml(path: Path) -> dict[str, Any]:
|
|
265
|
-
text = path.read_text(encoding="utf-8")
|
|
266
|
-
m = re.search(r'name\s*=\s*"([^"]+)"', text)
|
|
267
|
-
return {
|
|
268
|
-
"project_name": m.group(1) if m else "",
|
|
269
|
-
"languages": ["rust"],
|
|
270
|
-
"frameworks": [],
|
|
271
|
-
"build_tool": "cargo",
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
def _parse_go_mod(path: Path) -> dict[str, Any]:
|
|
276
|
-
text = path.read_text(encoding="utf-8")
|
|
277
|
-
m = re.search(r"^module\s+(\S+)", text, re.MULTILINE)
|
|
278
|
-
module_name = m.group(1) if m else ""
|
|
279
|
-
project_name = module_name.split("/")[-1] if module_name else ""
|
|
280
|
-
return {
|
|
281
|
-
"project_name": project_name,
|
|
282
|
-
"languages": ["go"],
|
|
283
|
-
"frameworks": [],
|
|
284
|
-
"build_tool": "go",
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
def _parse_pom_xml(path: Path) -> dict[str, Any]:
|
|
289
|
-
text = path.read_text(encoding="utf-8")
|
|
290
|
-
m = re.search(r"<artifactId>([^<]+)</artifactId>", text)
|
|
291
|
-
frameworks = []
|
|
292
|
-
if "spring-boot" in text.lower():
|
|
293
|
-
frameworks.append("Spring Boot")
|
|
294
|
-
return {
|
|
295
|
-
"project_name": m.group(1) if m else "",
|
|
296
|
-
"languages": ["java"],
|
|
297
|
-
"frameworks": frameworks,
|
|
298
|
-
"build_tool": "maven",
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
def _parse_gradle(path: Path) -> dict[str, Any]:
|
|
303
|
-
return {
|
|
304
|
-
"project_name": path.parent.name,
|
|
305
|
-
"languages": ["java", "kotlin"],
|
|
306
|
-
"frameworks": [],
|
|
307
|
-
"build_tool": "gradle",
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
def _parse_gemfile(path: Path) -> dict[str, Any]:
|
|
312
|
-
text = path.read_text(encoding="utf-8")
|
|
313
|
-
frameworks = ["Rails"] if "rails" in text.lower() else []
|
|
314
|
-
return {
|
|
315
|
-
"project_name": path.parent.name,
|
|
316
|
-
"languages": ["ruby"],
|
|
317
|
-
"frameworks": frameworks,
|
|
318
|
-
"build_tool": "bundler",
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
def _parse_composer_json(path: Path) -> dict[str, Any]:
|
|
323
|
-
with open(path, "r", encoding="utf-8") as f:
|
|
324
|
-
data = json.load(f)
|
|
325
|
-
return {
|
|
326
|
-
"project_name": data.get("name", "").split("/")[-1],
|
|
327
|
-
"languages": ["php"],
|
|
328
|
-
"frameworks": [],
|
|
329
|
-
"build_tool": "composer",
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def _parse_pubspec_yaml(path: Path) -> dict[str, Any]:
|
|
334
|
-
text = path.read_text(encoding="utf-8")
|
|
335
|
-
m = re.search(r"^name:\s*(\S+)", text, re.MULTILINE)
|
|
336
|
-
frameworks = ["Flutter"] if "flutter" in text.lower() else []
|
|
337
|
-
return {
|
|
338
|
-
"project_name": m.group(1) if m else "",
|
|
339
|
-
"languages": ["dart"],
|
|
340
|
-
"frameworks": frameworks,
|
|
341
|
-
"build_tool": "pub",
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
# Parser dispatch table
|
|
346
|
-
_PARSERS: dict[str, Any] = {
|
|
347
|
-
"_parse_package_json": _parse_package_json,
|
|
348
|
-
"_parse_pyproject_toml": _parse_pyproject_toml,
|
|
349
|
-
"_parse_cargo_toml": _parse_cargo_toml,
|
|
350
|
-
"_parse_go_mod": _parse_go_mod,
|
|
351
|
-
"_parse_pom_xml": _parse_pom_xml,
|
|
352
|
-
"_parse_gradle": _parse_gradle,
|
|
353
|
-
"_parse_gemfile": _parse_gemfile,
|
|
354
|
-
"_parse_composer_json": _parse_composer_json,
|
|
355
|
-
"_parse_pubspec_yaml": _parse_pubspec_yaml,
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
def _empty_context() -> dict[str, Any]:
|
|
360
|
-
return {
|
|
361
|
-
"project_name": None,
|
|
362
|
-
"languages": [],
|
|
363
|
-
"frameworks": [],
|
|
364
|
-
"build_tool": None,
|
|
365
|
-
"manifest_file": None,
|
|
366
|
-
}
|