superlocalmemory 2.8.6 → 3.0.0
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/LICENSE +9 -1
- package/NOTICE +63 -0
- package/README.md +165 -480
- package/bin/slm +17 -449
- package/bin/slm-npm +1 -1
- package/conftest.py +5 -0
- package/docs/api-reference.md +284 -0
- package/docs/architecture.md +149 -0
- package/docs/auto-memory.md +150 -0
- package/docs/cli-reference.md +276 -0
- package/docs/compliance.md +191 -0
- package/docs/configuration.md +182 -0
- package/docs/getting-started.md +102 -0
- package/docs/ide-setup.md +261 -0
- package/docs/mcp-tools.md +220 -0
- package/docs/migration-from-v2.md +170 -0
- package/docs/profiles.md +173 -0
- package/docs/troubleshooting.md +310 -0
- package/{configs → ide/configs}/antigravity-mcp.json +3 -3
- package/ide/configs/chatgpt-desktop-mcp.json +16 -0
- package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
- package/{configs → ide/configs}/codex-mcp.toml +4 -4
- package/{configs → ide/configs}/continue-mcp.yaml +4 -3
- package/{configs → ide/configs}/continue-skills.yaml +6 -6
- package/ide/configs/cursor-mcp.json +15 -0
- package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
- package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
- package/{configs → ide/configs}/opencode-mcp.json +2 -2
- package/{configs → ide/configs}/perplexity-mcp.json +2 -2
- package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
- package/{configs → ide/configs}/windsurf-mcp.json +3 -3
- package/{configs → ide/configs}/zed-mcp.json +2 -2
- package/{hooks → ide/hooks}/context-hook.js +9 -20
- package/ide/hooks/memory-list-skill.js +70 -0
- package/ide/hooks/memory-profile-skill.js +101 -0
- package/ide/hooks/memory-recall-skill.js +62 -0
- package/ide/hooks/memory-remember-skill.js +68 -0
- package/ide/hooks/memory-reset-skill.js +160 -0
- package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
- package/ide/integrations/langchain/README.md +106 -0
- package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
- package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
- package/ide/integrations/langchain/pyproject.toml +38 -0
- package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
- package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
- package/ide/integrations/langchain/tests/test_security.py +117 -0
- package/ide/integrations/llamaindex/README.md +81 -0
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
- package/ide/integrations/llamaindex/pyproject.toml +43 -0
- package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
- package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
- package/ide/integrations/llamaindex/tests/test_security.py +241 -0
- package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
- package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
- package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
- package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
- package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
- package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
- package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
- package/package.json +13 -22
- package/pyproject.toml +85 -0
- package/scripts/build-dmg.sh +417 -0
- package/scripts/install-skills.ps1 +334 -0
- package/scripts/postinstall.js +2 -2
- package/scripts/start-dashboard.ps1 +52 -0
- package/scripts/start-dashboard.sh +41 -0
- package/scripts/sync-wiki.ps1 +127 -0
- package/scripts/sync-wiki.sh +82 -0
- package/scripts/test-dmg.sh +161 -0
- package/scripts/test-npm-package.ps1 +252 -0
- package/scripts/test-npm-package.sh +207 -0
- package/scripts/verify-install.ps1 +294 -0
- package/scripts/verify-install.sh +266 -0
- package/src/superlocalmemory/__init__.py +0 -0
- package/src/superlocalmemory/attribution/__init__.py +9 -0
- package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
- package/src/superlocalmemory/attribution/signer.py +153 -0
- package/src/superlocalmemory/attribution/watermark.py +189 -0
- package/src/superlocalmemory/cli/__init__.py +5 -0
- package/src/superlocalmemory/cli/commands.py +245 -0
- package/src/superlocalmemory/cli/main.py +89 -0
- package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
- package/src/superlocalmemory/cli/post_install.py +99 -0
- package/src/superlocalmemory/cli/setup_wizard.py +129 -0
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +204 -0
- package/src/superlocalmemory/compliance/audit.py +314 -0
- package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
- package/src/superlocalmemory/compliance/gdpr.py +294 -0
- package/src/superlocalmemory/compliance/lifecycle.py +158 -0
- package/src/superlocalmemory/compliance/retention.py +232 -0
- package/src/superlocalmemory/compliance/scheduler.py +148 -0
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/config.py +391 -0
- package/src/superlocalmemory/core/embeddings.py +293 -0
- package/src/superlocalmemory/core/engine.py +701 -0
- package/src/superlocalmemory/core/hooks.py +65 -0
- package/src/superlocalmemory/core/maintenance.py +172 -0
- package/src/superlocalmemory/core/modes.py +140 -0
- package/src/superlocalmemory/core/profiles.py +234 -0
- package/src/superlocalmemory/core/registry.py +117 -0
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/consolidator.py +485 -0
- package/src/superlocalmemory/encoding/emotional.py +125 -0
- package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
- package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
- package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
- package/src/superlocalmemory/encoding/foresight.py +91 -0
- package/src/superlocalmemory/encoding/graph_builder.py +302 -0
- package/src/superlocalmemory/encoding/observation_builder.py +160 -0
- package/src/superlocalmemory/encoding/scene_builder.py +183 -0
- package/src/superlocalmemory/encoding/signal_inference.py +90 -0
- package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
- package/src/superlocalmemory/encoding/type_router.py +235 -0
- package/src/superlocalmemory/hooks/__init__.py +3 -0
- package/src/superlocalmemory/hooks/auto_capture.py +111 -0
- package/src/superlocalmemory/hooks/auto_recall.py +93 -0
- package/src/superlocalmemory/hooks/ide_connector.py +204 -0
- package/src/superlocalmemory/hooks/rules_engine.py +99 -0
- package/src/superlocalmemory/infra/__init__.py +3 -0
- package/src/superlocalmemory/infra/auth_middleware.py +82 -0
- package/src/superlocalmemory/infra/backup.py +317 -0
- package/src/superlocalmemory/infra/cache_manager.py +267 -0
- package/src/superlocalmemory/infra/event_bus.py +381 -0
- package/src/superlocalmemory/infra/rate_limiter.py +135 -0
- package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +172 -0
- package/src/superlocalmemory/learning/behavioral.py +490 -0
- package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
- package/src/superlocalmemory/learning/bootstrap.py +298 -0
- package/src/superlocalmemory/learning/cross_project.py +399 -0
- package/src/superlocalmemory/learning/database.py +376 -0
- package/src/superlocalmemory/learning/engagement.py +323 -0
- package/src/superlocalmemory/learning/features.py +138 -0
- package/src/superlocalmemory/learning/feedback.py +316 -0
- package/src/superlocalmemory/learning/outcomes.py +255 -0
- package/src/superlocalmemory/learning/project_context.py +366 -0
- package/src/superlocalmemory/learning/ranker.py +155 -0
- package/src/superlocalmemory/learning/source_quality.py +303 -0
- package/src/superlocalmemory/learning/workflows.py +309 -0
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +316 -0
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/fisher.py +356 -0
- package/src/superlocalmemory/math/langevin.py +398 -0
- package/src/superlocalmemory/math/sheaf.py +257 -0
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/resources.py +245 -0
- package/src/superlocalmemory/mcp/server.py +61 -0
- package/src/superlocalmemory/mcp/tools.py +18 -0
- package/src/superlocalmemory/mcp/tools_core.py +305 -0
- package/src/superlocalmemory/mcp/tools_v28.py +223 -0
- package/src/superlocalmemory/mcp/tools_v3.py +286 -0
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +295 -0
- package/src/superlocalmemory/retrieval/ann_index.py +223 -0
- package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
- package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
- package/src/superlocalmemory/retrieval/engine.py +390 -0
- package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
- package/src/superlocalmemory/retrieval/fusion.py +78 -0
- package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
- package/src/superlocalmemory/retrieval/reranker.py +154 -0
- package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
- package/src/superlocalmemory/retrieval/strategy.py +96 -0
- package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
- package/src/superlocalmemory/server/__init__.py +1 -0
- package/src/superlocalmemory/server/api.py +248 -0
- package/src/superlocalmemory/server/routes/__init__.py +4 -0
- package/src/superlocalmemory/server/routes/agents.py +107 -0
- package/src/superlocalmemory/server/routes/backup.py +91 -0
- package/src/superlocalmemory/server/routes/behavioral.py +127 -0
- package/src/superlocalmemory/server/routes/compliance.py +160 -0
- package/src/superlocalmemory/server/routes/data_io.py +188 -0
- package/src/superlocalmemory/server/routes/events.py +183 -0
- package/src/superlocalmemory/server/routes/helpers.py +85 -0
- package/src/superlocalmemory/server/routes/learning.py +273 -0
- package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
- package/src/superlocalmemory/server/routes/memories.py +399 -0
- package/src/superlocalmemory/server/routes/profiles.py +219 -0
- package/src/superlocalmemory/server/routes/stats.py +346 -0
- package/src/superlocalmemory/server/routes/v3_api.py +365 -0
- package/src/superlocalmemory/server/routes/ws.py +82 -0
- package/src/superlocalmemory/server/security_middleware.py +57 -0
- package/src/superlocalmemory/server/ui.py +245 -0
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/access_control.py +182 -0
- package/src/superlocalmemory/storage/database.py +594 -0
- package/src/superlocalmemory/storage/migrations.py +303 -0
- package/src/superlocalmemory/storage/models.py +406 -0
- package/src/superlocalmemory/storage/schema.py +726 -0
- package/src/superlocalmemory/storage/v2_migrator.py +317 -0
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +130 -0
- package/src/superlocalmemory/trust/provenance.py +124 -0
- package/src/superlocalmemory/trust/scorer.py +347 -0
- package/src/superlocalmemory/trust/signals.py +153 -0
- package/ui/index.html +278 -5
- package/ui/js/auto-settings.js +70 -0
- package/ui/js/dashboard.js +90 -0
- package/ui/js/fact-detail.js +92 -0
- package/ui/js/feedback.js +2 -2
- package/ui/js/ide-status.js +102 -0
- package/ui/js/math-health.js +98 -0
- package/ui/js/recall-lab.js +127 -0
- package/ui/js/settings.js +2 -2
- package/ui/js/trust-dashboard.js +73 -0
- package/api_server.py +0 -724
- package/bin/aider-smart +0 -72
- package/bin/superlocalmemoryv2-learning +0 -4
- package/bin/superlocalmemoryv2-list +0 -3
- package/bin/superlocalmemoryv2-patterns +0 -4
- package/bin/superlocalmemoryv2-profile +0 -3
- package/bin/superlocalmemoryv2-recall +0 -3
- package/bin/superlocalmemoryv2-remember +0 -3
- package/bin/superlocalmemoryv2-reset +0 -3
- package/bin/superlocalmemoryv2-status +0 -3
- package/configs/chatgpt-desktop-mcp.json +0 -16
- package/configs/cursor-mcp.json +0 -15
- package/hooks/memory-list-skill.js +0 -139
- package/hooks/memory-profile-skill.js +0 -273
- package/hooks/memory-recall-skill.js +0 -114
- package/hooks/memory-remember-skill.js +0 -127
- package/hooks/memory-reset-skill.js +0 -274
- package/mcp_server.py +0 -1808
- package/requirements-core.txt +0 -22
- package/requirements-learning.txt +0 -12
- package/requirements.txt +0 -12
- package/src/agent_registry.py +0 -411
- package/src/auth_middleware.py +0 -61
- package/src/auto_backup.py +0 -459
- package/src/behavioral/__init__.py +0 -49
- package/src/behavioral/behavioral_listener.py +0 -203
- package/src/behavioral/behavioral_patterns.py +0 -275
- package/src/behavioral/cross_project_transfer.py +0 -206
- package/src/behavioral/outcome_inference.py +0 -194
- package/src/behavioral/outcome_tracker.py +0 -193
- package/src/behavioral/tests/__init__.py +0 -4
- package/src/behavioral/tests/test_behavioral_integration.py +0 -108
- package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
- package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
- package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
- package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
- package/src/behavioral/tests/test_outcome_inference.py +0 -107
- package/src/behavioral/tests/test_outcome_tracker.py +0 -96
- package/src/cache_manager.py +0 -518
- package/src/compliance/__init__.py +0 -48
- package/src/compliance/abac_engine.py +0 -149
- package/src/compliance/abac_middleware.py +0 -116
- package/src/compliance/audit_db.py +0 -215
- package/src/compliance/audit_logger.py +0 -148
- package/src/compliance/retention_manager.py +0 -289
- package/src/compliance/retention_scheduler.py +0 -186
- package/src/compliance/tests/__init__.py +0 -4
- package/src/compliance/tests/test_abac_enforcement.py +0 -95
- package/src/compliance/tests/test_abac_engine.py +0 -124
- package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
- package/src/compliance/tests/test_audit_db.py +0 -123
- package/src/compliance/tests/test_audit_logger.py +0 -98
- package/src/compliance/tests/test_mcp_audit.py +0 -128
- package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
- package/src/compliance/tests/test_retention_manager.py +0 -131
- package/src/compliance/tests/test_retention_scheduler.py +0 -99
- package/src/compression/__init__.py +0 -25
- package/src/compression/cli.py +0 -150
- package/src/compression/cold_storage.py +0 -217
- package/src/compression/config.py +0 -72
- package/src/compression/orchestrator.py +0 -133
- package/src/compression/tier2_compressor.py +0 -228
- package/src/compression/tier3_compressor.py +0 -153
- package/src/compression/tier_classifier.py +0 -148
- package/src/db_connection_manager.py +0 -536
- package/src/embedding_engine.py +0 -63
- package/src/embeddings/__init__.py +0 -47
- package/src/embeddings/cache.py +0 -70
- package/src/embeddings/cli.py +0 -113
- package/src/embeddings/constants.py +0 -47
- package/src/embeddings/database.py +0 -91
- package/src/embeddings/engine.py +0 -247
- package/src/embeddings/model_loader.py +0 -145
- package/src/event_bus.py +0 -562
- package/src/graph/__init__.py +0 -36
- package/src/graph/build_helpers.py +0 -74
- package/src/graph/cli.py +0 -87
- package/src/graph/cluster_builder.py +0 -188
- package/src/graph/cluster_summary.py +0 -148
- package/src/graph/constants.py +0 -47
- package/src/graph/edge_builder.py +0 -162
- package/src/graph/entity_extractor.py +0 -95
- package/src/graph/graph_core.py +0 -226
- package/src/graph/graph_search.py +0 -231
- package/src/graph/hierarchical.py +0 -207
- package/src/graph/schema.py +0 -99
- package/src/graph_engine.py +0 -52
- package/src/hnsw_index.py +0 -628
- package/src/hybrid_search.py +0 -46
- package/src/learning/__init__.py +0 -217
- package/src/learning/adaptive_ranker.py +0 -682
- package/src/learning/bootstrap/__init__.py +0 -69
- package/src/learning/bootstrap/constants.py +0 -93
- package/src/learning/bootstrap/db_queries.py +0 -316
- package/src/learning/bootstrap/sampling.py +0 -82
- package/src/learning/bootstrap/text_utils.py +0 -71
- package/src/learning/cross_project_aggregator.py +0 -857
- package/src/learning/db/__init__.py +0 -40
- package/src/learning/db/constants.py +0 -44
- package/src/learning/db/schema.py +0 -279
- package/src/learning/engagement_tracker.py +0 -628
- package/src/learning/feature_extractor.py +0 -708
- package/src/learning/feedback_collector.py +0 -806
- package/src/learning/learning_db.py +0 -915
- package/src/learning/project_context_manager.py +0 -572
- package/src/learning/ranking/__init__.py +0 -33
- package/src/learning/ranking/constants.py +0 -84
- package/src/learning/ranking/helpers.py +0 -278
- package/src/learning/source_quality_scorer.py +0 -676
- package/src/learning/synthetic_bootstrap.py +0 -755
- package/src/learning/tests/test_adaptive_ranker.py +0 -325
- package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
- package/src/learning/tests/test_aggregator.py +0 -306
- package/src/learning/tests/test_auto_retrain_v28.py +0 -35
- package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
- package/src/learning/tests/test_feature_extractor_v28.py +0 -93
- package/src/learning/tests/test_feedback_collector.py +0 -294
- package/src/learning/tests/test_learning_db.py +0 -602
- package/src/learning/tests/test_learning_db_v28.py +0 -110
- package/src/learning/tests/test_learning_init_v28.py +0 -48
- package/src/learning/tests/test_outcome_signals.py +0 -48
- package/src/learning/tests/test_project_context.py +0 -292
- package/src/learning/tests/test_schema_migration.py +0 -319
- package/src/learning/tests/test_signal_inference.py +0 -397
- package/src/learning/tests/test_source_quality.py +0 -351
- package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
- package/src/learning/tests/test_workflow_miner.py +0 -318
- package/src/learning/workflow_pattern_miner.py +0 -655
- package/src/lifecycle/__init__.py +0 -54
- package/src/lifecycle/bounded_growth.py +0 -239
- package/src/lifecycle/compaction_engine.py +0 -226
- package/src/lifecycle/lifecycle_engine.py +0 -355
- package/src/lifecycle/lifecycle_evaluator.py +0 -257
- package/src/lifecycle/lifecycle_scheduler.py +0 -130
- package/src/lifecycle/retention_policy.py +0 -285
- package/src/lifecycle/tests/test_bounded_growth.py +0 -193
- package/src/lifecycle/tests/test_compaction.py +0 -179
- package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
- package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
- package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
- package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
- package/src/lifecycle/tests/test_mcp_compact.py +0 -149
- package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
- package/src/lifecycle/tests/test_retention_policy.py +0 -162
- package/src/mcp_tools_v28.py +0 -281
- package/src/memory/__init__.py +0 -36
- package/src/memory/cli.py +0 -205
- package/src/memory/constants.py +0 -39
- package/src/memory/helpers.py +0 -28
- package/src/memory/schema.py +0 -166
- package/src/memory-profiles.py +0 -595
- package/src/memory-reset.py +0 -491
- package/src/memory_compression.py +0 -989
- package/src/memory_store_v2.py +0 -1155
- package/src/migrate_v1_to_v2.py +0 -629
- package/src/pattern_learner.py +0 -34
- package/src/patterns/__init__.py +0 -24
- package/src/patterns/analyzers.py +0 -251
- package/src/patterns/learner.py +0 -271
- package/src/patterns/scoring.py +0 -171
- package/src/patterns/store.py +0 -225
- package/src/patterns/terminology.py +0 -140
- package/src/provenance_tracker.py +0 -312
- package/src/qualixar_attribution.py +0 -139
- package/src/qualixar_watermark.py +0 -78
- package/src/query_optimizer.py +0 -511
- package/src/rate_limiter.py +0 -83
- package/src/search/__init__.py +0 -20
- package/src/search/cli.py +0 -77
- package/src/search/constants.py +0 -26
- package/src/search/engine.py +0 -241
- package/src/search/fusion.py +0 -122
- package/src/search/index_loader.py +0 -114
- package/src/search/methods.py +0 -162
- package/src/search_engine_v2.py +0 -401
- package/src/setup_validator.py +0 -482
- package/src/subscription_manager.py +0 -391
- package/src/tree/__init__.py +0 -59
- package/src/tree/builder.py +0 -185
- package/src/tree/nodes.py +0 -202
- package/src/tree/queries.py +0 -257
- package/src/tree/schema.py +0 -80
- package/src/tree_manager.py +0 -19
- package/src/trust/__init__.py +0 -45
- package/src/trust/constants.py +0 -66
- package/src/trust/queries.py +0 -157
- package/src/trust/schema.py +0 -95
- package/src/trust/scorer.py +0 -299
- package/src/trust/signals.py +0 -95
- package/src/trust_scorer.py +0 -44
- package/ui/app.js +0 -1588
- package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
- package/ui/js/graph-cytoscape.js +0 -1168
- package/ui/js/graph-d3-backup.js +0 -32
- package/ui/js/graph.js +0 -32
- package/ui_server.py +0 -286
- /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
- /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
- /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
- /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
- /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
- /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
- /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
- /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
- /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
- /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
- /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
- /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
- /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
- /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
- /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
- /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
- /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
- /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
- /package/{completions → ide/completions}/slm.bash +0 -0
- /package/{completions → ide/completions}/slm.zsh +0 -0
- /package/{configs → ide/configs}/cody-commands.json +0 -0
- /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
- /package/{install.ps1 → scripts/install.ps1} +0 -0
- /package/{install.sh → scripts/install.sh} +0 -0
package/ui/js/graph-d3-backup.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// SuperLocalMemory V2 - Knowledge Graph (D3.js force-directed)
|
|
2
|
-
// Depends on: core.js, modal.js (openMemoryDetail)
|
|
3
|
-
|
|
4
|
-
var graphData = { nodes: [], links: [] };
|
|
5
|
-
|
|
6
|
-
async function loadGraph() {
|
|
7
|
-
var maxNodes = document.getElementById('graph-max-nodes').value;
|
|
8
|
-
try {
|
|
9
|
-
var response = await fetch('/api/graph?max_nodes=' + maxNodes);
|
|
10
|
-
graphData = await response.json();
|
|
11
|
-
renderGraph(graphData);
|
|
12
|
-
} catch (error) {
|
|
13
|
-
console.error('Error loading graph:', error);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function renderGraph(data) {
|
|
18
|
-
var container = document.getElementById('graph-container');
|
|
19
|
-
container.textContent = '';
|
|
20
|
-
var width = container.clientWidth || 1200;
|
|
21
|
-
var height = 600;
|
|
22
|
-
var svg = d3.select('#graph-container').append('svg').attr('width', width).attr('height', height);
|
|
23
|
-
var tooltip = d3.select('body').append('div').attr('class', 'tooltip-custom').style('opacity', 0);
|
|
24
|
-
var colorScale = d3.scaleOrdinal(d3.schemeCategory10);
|
|
25
|
-
var simulation = d3.forceSimulation(data.nodes).force('link', d3.forceLink(data.links).id(function(d) { return d.id; }).distance(100)).force('charge', d3.forceManyBody().strength(-200)).force('center', d3.forceCenter(width / 2, height / 2)).force('collision', d3.forceCollide().radius(20));
|
|
26
|
-
var link = svg.append('g').selectAll('line').data(data.links).enter().append('line').attr('class', 'link').attr('stroke-width', function(d) { return Math.sqrt(d.weight * 2); });
|
|
27
|
-
var node = svg.append('g').selectAll('circle').data(data.nodes).enter().append('circle').attr('class', 'node').attr('r', function(d) { return 5 + (d.importance || 5); }).attr('fill', function(d) { return colorScale(d.cluster_id || 0); }).call(d3.drag().on('start', dragStarted).on('drag', dragged).on('end', dragEnded)).on('mouseover', function(event, d) { tooltip.transition().duration(200).style('opacity', .9); var label = d.category || d.project_name || 'Memory #' + d.id; tooltip.text(label + ': ' + (d.content_preview || d.summary || 'No content')).style('left', (event.pageX + 10) + 'px').style('top', (event.pageY - 28) + 'px'); }).on('mouseout', function() { tooltip.transition().duration(500).style('opacity', 0); }).on('click', function(event, d) { openMemoryDetail(d); });
|
|
28
|
-
simulation.on('tick', function() { link.attr('x1', function(d) { return d.source.x; }).attr('y1', function(d) { return d.source.y; }).attr('x2', function(d) { return d.target.x; }).attr('y2', function(d) { return d.target.y; }); node.attr('cx', function(d) { return d.x; }).attr('cy', function(d) { return d.y; }); });
|
|
29
|
-
function dragStarted(event, d) { if (!event.active) simulation.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; }
|
|
30
|
-
function dragged(event, d) { d.fx = event.x; d.fy = event.y; }
|
|
31
|
-
function dragEnded(event, d) { if (!event.active) simulation.alphaTarget(0); d.fx = null; d.fy = null; }
|
|
32
|
-
}
|
package/ui/js/graph.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// SuperLocalMemory V2 - Knowledge Graph (D3.js force-directed)
|
|
2
|
-
// Depends on: core.js, modal.js (openMemoryDetail)
|
|
3
|
-
|
|
4
|
-
var graphData = { nodes: [], links: [] };
|
|
5
|
-
|
|
6
|
-
async function loadGraph() {
|
|
7
|
-
var maxNodes = document.getElementById('graph-max-nodes').value;
|
|
8
|
-
try {
|
|
9
|
-
var response = await fetch('/api/graph?max_nodes=' + maxNodes);
|
|
10
|
-
graphData = await response.json();
|
|
11
|
-
renderGraph(graphData);
|
|
12
|
-
} catch (error) {
|
|
13
|
-
console.error('Error loading graph:', error);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function renderGraph(data) {
|
|
18
|
-
var container = document.getElementById('graph-container');
|
|
19
|
-
container.textContent = '';
|
|
20
|
-
var width = container.clientWidth || 1200;
|
|
21
|
-
var height = 600;
|
|
22
|
-
var svg = d3.select('#graph-container').append('svg').attr('width', width).attr('height', height);
|
|
23
|
-
var tooltip = d3.select('body').append('div').attr('class', 'tooltip-custom').style('opacity', 0);
|
|
24
|
-
var colorScale = d3.scaleOrdinal(d3.schemeCategory10);
|
|
25
|
-
var simulation = d3.forceSimulation(data.nodes).force('link', d3.forceLink(data.links).id(function(d) { return d.id; }).distance(100)).force('charge', d3.forceManyBody().strength(-200)).force('center', d3.forceCenter(width / 2, height / 2)).force('collision', d3.forceCollide().radius(20));
|
|
26
|
-
var link = svg.append('g').selectAll('line').data(data.links).enter().append('line').attr('class', 'link').attr('stroke-width', function(d) { return Math.sqrt(d.weight * 2); });
|
|
27
|
-
var node = svg.append('g').selectAll('circle').data(data.nodes).enter().append('circle').attr('class', 'node').attr('r', function(d) { return 5 + (d.importance || 5); }).attr('fill', function(d) { return colorScale(d.cluster_id || 0); }).call(d3.drag().on('start', dragStarted).on('drag', dragged).on('end', dragEnded)).on('mouseover', function(event, d) { tooltip.transition().duration(200).style('opacity', .9); var label = d.category || d.project_name || 'Memory #' + d.id; tooltip.text(label + ': ' + (d.content_preview || d.summary || 'No content')).style('left', (event.pageX + 10) + 'px').style('top', (event.pageY - 28) + 'px'); }).on('mouseout', function() { tooltip.transition().duration(500).style('opacity', 0); }).on('click', function(event, d) { openMemoryDetail(d); });
|
|
28
|
-
simulation.on('tick', function() { link.attr('x1', function(d) { return d.source.x; }).attr('y1', function(d) { return d.source.y; }).attr('x2', function(d) { return d.target.x; }).attr('y2', function(d) { return d.target.y; }); node.attr('cx', function(d) { return d.x; }).attr('cy', function(d) { return d.y; }); });
|
|
29
|
-
function dragStarted(event, d) { if (!event.active) simulation.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; }
|
|
30
|
-
function dragged(event, d) { d.fx = event.x; d.fy = event.y; }
|
|
31
|
-
function dragEnded(event, d) { if (!event.active) simulation.alphaTarget(0); d.fx = null; d.fy = null; }
|
|
32
|
-
}
|
package/ui_server.py
DELETED
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
-
"""
|
|
5
|
-
SuperLocalMemory V2.5.0 - FastAPI UI Server
|
|
6
|
-
App initialization, middleware, static mount, and router registration.
|
|
7
|
-
|
|
8
|
-
All route handlers live in routes/ directory:
|
|
9
|
-
routes/memories.py — /api/memories, /api/graph, /api/search, /api/clusters
|
|
10
|
-
routes/stats.py — /api/stats, /api/timeline, /api/patterns
|
|
11
|
-
routes/profiles.py — /api/profiles (CRUD + switch)
|
|
12
|
-
routes/backup.py — /api/backup (status, create, configure, list)
|
|
13
|
-
routes/data_io.py — /api/export, /api/import
|
|
14
|
-
routes/events.py — /events/stream (SSE), /api/events [v2.5]
|
|
15
|
-
routes/agents.py — /api/agents, /api/trust [v2.5]
|
|
16
|
-
routes/ws.py — /ws/updates (WebSocket)
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
import sys
|
|
20
|
-
from pathlib import Path
|
|
21
|
-
from datetime import datetime
|
|
22
|
-
|
|
23
|
-
_script_dir = str(Path(__file__).parent.resolve())
|
|
24
|
-
sys.path = [p for p in sys.path if p not in ("", _script_dir)]
|
|
25
|
-
|
|
26
|
-
try:
|
|
27
|
-
from fastapi import FastAPI
|
|
28
|
-
from fastapi.staticfiles import StaticFiles
|
|
29
|
-
from fastapi.responses import HTMLResponse
|
|
30
|
-
from fastapi.middleware.cors import CORSMiddleware
|
|
31
|
-
from fastapi.middleware.gzip import GZipMiddleware
|
|
32
|
-
import uvicorn
|
|
33
|
-
except ImportError:
|
|
34
|
-
raise ImportError(
|
|
35
|
-
"FastAPI dependencies not installed. "
|
|
36
|
-
"Install with: pip install 'fastapi[all]' uvicorn websockets"
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
sys.path.insert(0, _script_dir)
|
|
40
|
-
|
|
41
|
-
from security_middleware import SecurityHeadersMiddleware
|
|
42
|
-
|
|
43
|
-
# Add src/ and routes/ to path
|
|
44
|
-
sys.path.insert(0, str(Path(__file__).parent / "src"))
|
|
45
|
-
sys.path.insert(0, str(Path(__file__).parent))
|
|
46
|
-
|
|
47
|
-
# Configuration
|
|
48
|
-
MEMORY_DIR = Path.home() / ".claude-memory"
|
|
49
|
-
DB_PATH = MEMORY_DIR / "memory.db"
|
|
50
|
-
UI_DIR = Path(__file__).parent / "ui"
|
|
51
|
-
|
|
52
|
-
# Initialize FastAPI application
|
|
53
|
-
app = FastAPI(
|
|
54
|
-
title="SuperLocalMemory V2.5.0 UI Server",
|
|
55
|
-
description="Real-Time Memory Dashboard with Event Bus, Agent Registry, and Trust Scoring",
|
|
56
|
-
version="2.5.0",
|
|
57
|
-
docs_url="/api/docs",
|
|
58
|
-
redoc_url="/api/redoc",
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
# Middleware (order matters: security headers should be outermost)
|
|
62
|
-
app.add_middleware(SecurityHeadersMiddleware)
|
|
63
|
-
app.add_middleware(GZipMiddleware, minimum_size=1000)
|
|
64
|
-
app.add_middleware(
|
|
65
|
-
CORSMiddleware,
|
|
66
|
-
allow_origins=[
|
|
67
|
-
"http://localhost:8765", # Dashboard
|
|
68
|
-
"http://127.0.0.1:8765",
|
|
69
|
-
"http://localhost:8417", # MCP
|
|
70
|
-
"http://127.0.0.1:8417",
|
|
71
|
-
],
|
|
72
|
-
allow_credentials=True,
|
|
73
|
-
allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
|
|
74
|
-
allow_headers=["Content-Type", "Authorization", "X-SLM-API-Key"],
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
# Rate limiting (v2.6)
|
|
78
|
-
try:
|
|
79
|
-
from rate_limiter import write_limiter, read_limiter
|
|
80
|
-
|
|
81
|
-
@app.middleware("http")
|
|
82
|
-
async def rate_limit_middleware(request, call_next):
|
|
83
|
-
client_ip = request.client.host if request.client else "unknown"
|
|
84
|
-
|
|
85
|
-
# Determine if this is a write or read endpoint
|
|
86
|
-
is_write = request.method in ("POST", "PUT", "DELETE", "PATCH")
|
|
87
|
-
limiter = write_limiter if is_write else read_limiter
|
|
88
|
-
|
|
89
|
-
allowed, remaining = limiter.is_allowed(client_ip)
|
|
90
|
-
if not allowed:
|
|
91
|
-
from fastapi.responses import JSONResponse
|
|
92
|
-
|
|
93
|
-
return JSONResponse(
|
|
94
|
-
status_code=429,
|
|
95
|
-
content={"error": "Too many requests. Please slow down."},
|
|
96
|
-
headers={"Retry-After": str(limiter.window)},
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
response = await call_next(request)
|
|
100
|
-
response.headers["X-RateLimit-Remaining"] = str(remaining)
|
|
101
|
-
return response
|
|
102
|
-
|
|
103
|
-
except ImportError:
|
|
104
|
-
pass # Rate limiter not available — continue without it
|
|
105
|
-
|
|
106
|
-
# Optional API key authentication (v2.6)
|
|
107
|
-
try:
|
|
108
|
-
from auth_middleware import check_api_key
|
|
109
|
-
|
|
110
|
-
@app.middleware("http")
|
|
111
|
-
async def auth_middleware(request, call_next):
|
|
112
|
-
is_write = request.method in ("POST", "PUT", "DELETE", "PATCH")
|
|
113
|
-
headers = dict(request.headers)
|
|
114
|
-
if not check_api_key(headers, is_write=is_write):
|
|
115
|
-
from fastapi.responses import JSONResponse
|
|
116
|
-
|
|
117
|
-
return JSONResponse(
|
|
118
|
-
status_code=401,
|
|
119
|
-
content={
|
|
120
|
-
"error": "Invalid or missing API key. Set X-SLM-API-Key header."
|
|
121
|
-
},
|
|
122
|
-
)
|
|
123
|
-
response = await call_next(request)
|
|
124
|
-
return response
|
|
125
|
-
except ImportError:
|
|
126
|
-
pass # Auth middleware not available
|
|
127
|
-
|
|
128
|
-
# Mount static files (UI directory)
|
|
129
|
-
UI_DIR.mkdir(exist_ok=True)
|
|
130
|
-
app.mount("/static", StaticFiles(directory=str(UI_DIR)), name="static")
|
|
131
|
-
|
|
132
|
-
# ============================================================================
|
|
133
|
-
# Register Route Modules
|
|
134
|
-
# ============================================================================
|
|
135
|
-
|
|
136
|
-
from routes.memories import router as memories_router
|
|
137
|
-
from routes.stats import router as stats_router
|
|
138
|
-
from routes.profiles import router as profiles_router
|
|
139
|
-
from routes.backup import router as backup_router
|
|
140
|
-
from routes.data_io import router as data_io_router
|
|
141
|
-
from routes.events import router as events_router, register_event_listener
|
|
142
|
-
from routes.agents import router as agents_router
|
|
143
|
-
from routes.ws import router as ws_router, manager as ws_manager
|
|
144
|
-
|
|
145
|
-
# v2.7 Learning routes (graceful)
|
|
146
|
-
try:
|
|
147
|
-
from routes.learning import router as learning_router
|
|
148
|
-
|
|
149
|
-
LEARNING_ROUTES = True
|
|
150
|
-
except ImportError:
|
|
151
|
-
LEARNING_ROUTES = False
|
|
152
|
-
|
|
153
|
-
app.include_router(memories_router)
|
|
154
|
-
app.include_router(stats_router)
|
|
155
|
-
app.include_router(profiles_router)
|
|
156
|
-
app.include_router(backup_router)
|
|
157
|
-
app.include_router(data_io_router)
|
|
158
|
-
app.include_router(events_router)
|
|
159
|
-
app.include_router(agents_router)
|
|
160
|
-
app.include_router(ws_router)
|
|
161
|
-
if LEARNING_ROUTES:
|
|
162
|
-
app.include_router(learning_router)
|
|
163
|
-
|
|
164
|
-
# v2.8 routes (graceful — don't fail if engines unavailable)
|
|
165
|
-
try:
|
|
166
|
-
from routes.lifecycle import router as lifecycle_router
|
|
167
|
-
|
|
168
|
-
app.include_router(lifecycle_router)
|
|
169
|
-
except ImportError:
|
|
170
|
-
pass
|
|
171
|
-
|
|
172
|
-
try:
|
|
173
|
-
from routes.behavioral import router as behavioral_router
|
|
174
|
-
|
|
175
|
-
app.include_router(behavioral_router)
|
|
176
|
-
except ImportError:
|
|
177
|
-
pass
|
|
178
|
-
|
|
179
|
-
try:
|
|
180
|
-
from routes.compliance import router as compliance_router
|
|
181
|
-
|
|
182
|
-
app.include_router(compliance_router)
|
|
183
|
-
except ImportError:
|
|
184
|
-
pass
|
|
185
|
-
|
|
186
|
-
# Wire WebSocket manager into routes that need broadcast capability
|
|
187
|
-
import routes.profiles as _profiles_mod
|
|
188
|
-
import routes.data_io as _data_io_mod
|
|
189
|
-
|
|
190
|
-
_profiles_mod.ws_manager = ws_manager
|
|
191
|
-
_data_io_mod.ws_manager = ws_manager
|
|
192
|
-
|
|
193
|
-
# ============================================================================
|
|
194
|
-
# Basic Routes (root page + health check)
|
|
195
|
-
# ============================================================================
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
@app.get("/", response_class=HTMLResponse)
|
|
199
|
-
async def root():
|
|
200
|
-
"""Serve main UI page."""
|
|
201
|
-
index_path = UI_DIR / "index.html"
|
|
202
|
-
if not index_path.exists():
|
|
203
|
-
return """
|
|
204
|
-
<!DOCTYPE html>
|
|
205
|
-
<html>
|
|
206
|
-
<head><title>SuperLocalMemory V2.5.0</title></head>
|
|
207
|
-
<body style="font-family: Arial; padding: 40px;">
|
|
208
|
-
<h1>SuperLocalMemory V2.5.0 UI Server Running</h1>
|
|
209
|
-
<p>UI not found. Check ui/index.html</p>
|
|
210
|
-
<p><a href="/api/docs">API Documentation</a></p>
|
|
211
|
-
</body>
|
|
212
|
-
</html>
|
|
213
|
-
"""
|
|
214
|
-
return index_path.read_text()
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
@app.get("/health")
|
|
218
|
-
async def health_check():
|
|
219
|
-
"""Health check endpoint."""
|
|
220
|
-
return {
|
|
221
|
-
"status": "healthy",
|
|
222
|
-
"version": "2.5.0",
|
|
223
|
-
"database": "connected" if DB_PATH.exists() else "missing",
|
|
224
|
-
"timestamp": datetime.now().isoformat(),
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
# ============================================================================
|
|
229
|
-
# Startup Events
|
|
230
|
-
# ============================================================================
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
@app.on_event("startup")
|
|
234
|
-
async def startup_event():
|
|
235
|
-
"""Register Event Bus listener for SSE bridge on startup."""
|
|
236
|
-
register_event_listener()
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
# ============================================================================
|
|
240
|
-
# Server Startup
|
|
241
|
-
# ============================================================================
|
|
242
|
-
|
|
243
|
-
if __name__ == "__main__":
|
|
244
|
-
import argparse
|
|
245
|
-
import socket
|
|
246
|
-
|
|
247
|
-
parser = argparse.ArgumentParser(description="SuperLocalMemory V2 - Web Dashboard")
|
|
248
|
-
parser.add_argument(
|
|
249
|
-
"--port", type=int, default=8765, help="Port to run on (default 8765)"
|
|
250
|
-
)
|
|
251
|
-
parser.add_argument(
|
|
252
|
-
"--profile", type=str, default=None, help="Memory profile to use"
|
|
253
|
-
)
|
|
254
|
-
args = parser.parse_args()
|
|
255
|
-
|
|
256
|
-
def find_available_port(preferred):
|
|
257
|
-
for port in [preferred] + list(range(preferred + 1, preferred + 20)):
|
|
258
|
-
try:
|
|
259
|
-
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
260
|
-
s.bind(("127.0.0.1", port))
|
|
261
|
-
return port
|
|
262
|
-
except OSError:
|
|
263
|
-
continue
|
|
264
|
-
return preferred
|
|
265
|
-
|
|
266
|
-
ui_port = find_available_port(args.port)
|
|
267
|
-
if ui_port != args.port:
|
|
268
|
-
print(f"\n Port {args.port} in use — using {ui_port} instead\n")
|
|
269
|
-
|
|
270
|
-
print("=" * 70)
|
|
271
|
-
print(" SuperLocalMemory V2.5.0 - Web Dashboard")
|
|
272
|
-
print(" Copyright (c) 2026 Varun Pratap Bhardwaj")
|
|
273
|
-
print("=" * 70)
|
|
274
|
-
print(f" Database: {DB_PATH}")
|
|
275
|
-
print(f" UI: {UI_DIR}")
|
|
276
|
-
print(f" Routes: 8 modules, 28 endpoints")
|
|
277
|
-
print("=" * 70)
|
|
278
|
-
print(f"\n Dashboard: http://localhost:{ui_port}")
|
|
279
|
-
print(f" API Docs: http://localhost:{ui_port}/api/docs")
|
|
280
|
-
print(f" Health: http://localhost:{ui_port}/health")
|
|
281
|
-
print(f" SSE Stream: http://localhost:{ui_port}/events/stream")
|
|
282
|
-
print(f" WebSocket: ws://localhost:{ui_port}/ws/updates")
|
|
283
|
-
print("\n Press Ctrl+C to stop\n")
|
|
284
|
-
|
|
285
|
-
# SECURITY: Bind to localhost only
|
|
286
|
-
uvicorn.run(app, host="127.0.0.1", port=ui_port, log_level="info", access_log=True)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|