diff --git "a/graphify-out/graph.json" "b/graphify-out/graph.json" --- "a/graphify-out/graph.json" +++ "b/graphify-out/graph.json" @@ -80,7 +80,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_main", - "community": 29, + "community": 12, "norm_label": "main.py" }, { @@ -90,7 +90,7 @@ "source_location": "L66", "_origin": "ast", "id": "app_main_lifespan", - "community": 29, + "community": 12, "norm_label": "lifespan()" }, { @@ -100,7 +100,7 @@ "source_location": "", "_origin": "ast", "id": "fastapi", - "community": 29, + "community": 12, "norm_label": "fastapi" }, { @@ -110,7 +110,7 @@ "source_location": "L160", "_origin": "ast", "id": "app_main_root", - "community": 29, + "community": 10, "norm_label": "root()" }, { @@ -120,7 +120,7 @@ "source_location": "L262", "_origin": "ast", "id": "app_main_health_check", - "community": 29, + "community": 12, "norm_label": "health_check()" }, { @@ -130,7 +130,7 @@ "source_location": "L67", "_origin": "ast", "id": "app_main_rationale_67", - "community": 29, + "community": 12, "norm_label": "application lifespan manager handles startup and shutdown events for" }, { @@ -140,7 +140,7 @@ "source_location": "L161", "_origin": "ast", "id": "app_main_rationale_161", - "community": 29, + "community": 10, "norm_label": "live health dashboard \u2014 phase 23 what this shows: instead of a h" }, { @@ -150,7 +150,7 @@ "source_location": "L263", "_origin": "ast", "id": "app_main_rationale_263", - "community": 29, + "community": 12, "norm_label": "enhanced health check endpoint with scheduler status used by external monit" }, { @@ -170,7 +170,7 @@ "source_location": "L6", "_origin": "ast", "id": "app_models_article", - "community": 27, + "community": 57, "norm_label": "article" }, { @@ -180,7 +180,7 @@ "source_location": "", "_origin": "ast", "id": "basemodel", - "community": 16, + "community": 1, "norm_label": "basemodel" }, { @@ -190,7 +190,7 @@ "source_location": "L34", "_origin": "ast", "id": "app_models_article_parse_datetime", - "community": 27, + "community": 57, "norm_label": ".parse_datetime()" }, { @@ -220,7 +220,7 @@ "source_location": "L75", "_origin": "ast", "id": "app_models_viewcountrequest", - "community": 16, + "community": 1, "norm_label": "viewcountrequest" }, { @@ -230,7 +230,7 @@ "source_location": "L79", "_origin": "ast", "id": "app_models_viewcountresponse", - "community": 16, + "community": 1, "norm_label": "viewcountresponse" }, { @@ -240,7 +240,7 @@ "source_location": "L85", "_origin": "ast", "id": "app_models_errorresponse", - "community": 16, + "community": 1, "norm_label": "errorresponse" }, { @@ -250,7 +250,7 @@ "source_location": "L35", "_origin": "ast", "id": "app_models_rationale_35", - "community": 27, + "community": 57, "norm_label": "parse datetime from various formats including rfc 2822 (rss feeds)" }, { @@ -280,7 +280,7 @@ "source_location": "L76", "_origin": "ast", "id": "app_models_rationale_76", - "community": 16, + "community": 1, "norm_label": "request model for view count increment" }, { @@ -290,7 +290,7 @@ "source_location": "L80", "_origin": "ast", "id": "app_models_rationale_80", - "community": 16, + "community": 1, "norm_label": "response model for view count" }, { @@ -320,7 +320,7 @@ "source_location": "L17", "_origin": "ast", "id": "app_routes_admin_warm_cache", - "community": 34, + "community": 32, "norm_label": "warm_cache()" }, { @@ -330,7 +330,7 @@ "source_location": "", "_origin": "ast", "id": "backgroundtasks", - "community": 34, + "community": 32, "norm_label": "backgroundtasks" }, { @@ -340,7 +340,7 @@ "source_location": "L35", "_origin": "ast", "id": "app_routes_admin_warm_cache_background", - "community": 34, + "community": 32, "norm_label": "_warm_cache_background()" }, { @@ -350,7 +350,7 @@ "source_location": "L77", "_origin": "ast", "id": "app_routes_admin_get_cache_stats", - "community": 34, + "community": 32, "norm_label": "get_cache_stats()" }, { @@ -370,7 +370,7 @@ "source_location": "L144", "_origin": "ast", "id": "app_routes_admin_get_database_stats", - "community": 32, + "community": 10, "norm_label": "get_database_stats()" }, { @@ -380,7 +380,7 @@ "source_location": "L172", "_origin": "ast", "id": "app_routes_admin_cleanup_old_articles", - "community": 32, + "community": 10, "norm_label": "cleanup_old_articles()" }, { @@ -410,7 +410,7 @@ "source_location": "L314", "_origin": "ast", "id": "app_routes_admin_trigger_cleanup_job", - "community": 44, + "community": 32, "norm_label": "trigger_cleanup_job()" }, { @@ -440,7 +440,7 @@ "source_location": "L419", "_origin": "ast", "id": "app_routes_admin_get_subscriber_analytics", - "community": 32, + "community": 10, "norm_label": "get_subscriber_analytics()" }, { @@ -460,7 +460,7 @@ "source_location": "L535", "_origin": "ast", "id": "app_routes_admin_reset_bloom_filter", - "community": 32, + "community": 8, "norm_label": "reset_bloom_filter()" }, { @@ -470,7 +470,7 @@ "source_location": "L597", "_origin": "ast", "id": "app_routes_admin_get_bloom_filter_stats", - "community": 32, + "community": 8, "norm_label": "get_bloom_filter_stats()" }, { @@ -480,7 +480,7 @@ "source_location": "L659", "_origin": "ast", "id": "app_routes_admin_bloom_filter_health_check", - "community": 32, + "community": 8, "norm_label": "bloom_filter_health_check()" }, { @@ -490,7 +490,7 @@ "source_location": "L752", "_origin": "ast", "id": "app_routes_admin_reset_circuit_breakers", - "community": 32, + "community": 18, "norm_label": "reset_circuit_breakers()" }, { @@ -500,7 +500,7 @@ "source_location": "L18", "_origin": "ast", "id": "app_routes_admin_rationale_18", - "community": 34, + "community": 32, "norm_label": "start a background cache-warm job for all categories. fix 2: the old vers" }, { @@ -510,7 +510,7 @@ "source_location": "L36", "_origin": "ast", "id": "app_routes_admin_rationale_36", - "community": 34, + "community": 32, "norm_label": "the actual cache-warming work \u2014 runs in the background so the http request" }, { @@ -520,7 +520,7 @@ "source_location": "L78", "_origin": "ast", "id": "app_routes_admin_rationale_78", - "community": 34, + "community": 32, "norm_label": "get cache statistics returns information about: - which cate" }, { @@ -540,7 +540,7 @@ "source_location": "L145", "_origin": "ast", "id": "app_routes_admin_rationale_145", - "community": 32, + "community": 10, "norm_label": "get appwrite database statistics (phase 2) returns: - total" }, { @@ -550,7 +550,7 @@ "source_location": "L173", "_origin": "ast", "id": "app_routes_admin_rationale_173", - "community": 32, + "community": 10, "norm_label": "delete articles older than specified days from appwrite database args" }, { @@ -580,7 +580,7 @@ "source_location": "L315", "_origin": "ast", "id": "app_routes_admin_rationale_315", - "community": 44, + "community": 32, "norm_label": "manually trigger the cleanup job (phase 3) deletes articles older tha" }, { @@ -610,7 +610,7 @@ "source_location": "L420", "_origin": "ast", "id": "app_routes_admin_rationale_420", - "community": 32, + "community": 10, "norm_label": "get subscriber distribution by preference from appwrite shows how man" }, { @@ -630,7 +630,7 @@ "source_location": "L536", "_origin": "ast", "id": "app_routes_admin_rationale_536", - "community": 32, + "community": 8, "norm_label": "reset scalable bloom filter - integration sync mechanism **use case**" }, { @@ -640,7 +640,7 @@ "source_location": "L598", "_origin": "ast", "id": "app_routes_admin_rationale_598", - "community": 32, + "community": 8, "norm_label": "get scalable bloom filter statistics - observability endpoint shows:" }, { @@ -650,7 +650,7 @@ "source_location": "L660", "_origin": "ast", "id": "app_routes_admin_rationale_660", - "community": 32, + "community": 8, "norm_label": "quick health check for bloom filter - production monitoring returns:" }, { @@ -660,7 +660,7 @@ "source_location": "L753", "_origin": "ast", "id": "app_routes_admin_rationale_753", - "community": 32, + "community": 18, "norm_label": "emergency circuit breaker reset run this endpoint right after any redeplo" }, { @@ -670,49 +670,9 @@ "source_location": "L1", "_origin": "ast", "id": "app_routes_analytics", - "community": 16, + "community": 88, "norm_label": "analytics.py" }, - { - "label": "increment_view_count()", - "file_type": "code", - "source_file": "app/routes/analytics.py", - "source_location": "L9", - "_origin": "ast", - "id": "app_routes_analytics_increment_view_count", - "community": 16, - "norm_label": "increment_view_count()" - }, - { - "label": "get_view_count()", - "file_type": "code", - "source_file": "app/routes/analytics.py", - "source_location": "L25", - "_origin": "ast", - "id": "app_routes_analytics_get_view_count", - "community": 16, - "norm_label": "get_view_count()" - }, - { - "label": "Increment view count for an article", - "file_type": "rationale", - "source_file": "app/routes/analytics.py", - "source_location": "L10", - "_origin": "ast", - "id": "app_routes_analytics_rationale_10", - "community": 16, - "norm_label": "increment view count for an article" - }, - { - "label": "Get view count for an article", - "file_type": "rationale", - "source_file": "app/routes/analytics.py", - "source_location": "L26", - "_origin": "ast", - "id": "app_routes_analytics_rationale_26", - "community": 16, - "norm_label": "get view count for an article" - }, { "label": "audio.py", "file_type": "code", @@ -720,7 +680,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_routes_audio", - "community": 16, + "community": 17, "norm_label": "audio.py" }, { @@ -730,7 +690,7 @@ "source_location": "L13", "_origin": "ast", "id": "app_routes_audio_audiogenerationrequest", - "community": 16, + "community": 17, "norm_label": "audiogenerationrequest" }, { @@ -740,7 +700,7 @@ "source_location": "L20", "_origin": "ast", "id": "app_routes_audio_audioresponse", - "community": 16, + "community": 17, "norm_label": "audioresponse" }, { @@ -750,7 +710,7 @@ "source_location": "L27", "_origin": "ast", "id": "app_routes_audio_find_article", - "community": 16, + "community": 17, "norm_label": "_find_article()" }, { @@ -760,7 +720,7 @@ "source_location": "L73", "_origin": "ast", "id": "app_routes_audio_get_audio_status", - "community": 16, + "community": 17, "norm_label": "get_audio_status()" }, { @@ -770,7 +730,7 @@ "source_location": "L107", "_origin": "ast", "id": "app_routes_audio_generate_audio_summary", - "community": 16, + "community": 17, "norm_label": "generate_audio_summary()" }, { @@ -780,7 +740,7 @@ "source_location": "L28", "_origin": "ast", "id": "app_routes_audio_rationale_28", - "community": 16, + "community": 17, "norm_label": "helper to find an article across multiple collections. returns (article, co" }, { @@ -790,7 +750,7 @@ "source_location": "L74", "_origin": "ast", "id": "app_routes_audio_rationale_74", - "community": 16, + "community": 17, "norm_label": "check if audio/text summary exists for an article." }, { @@ -800,7 +760,7 @@ "source_location": "L108", "_origin": "ast", "id": "app_routes_audio_rationale_108", - "community": 16, + "community": 17, "norm_label": "generate audio summary for an article by url" }, { @@ -1000,7 +960,7 @@ "source_location": "L86", "_origin": "ast", "id": "app_routes_monitoring_clear_cache", - "community": 12, + "community": 18, "norm_label": "clear_cache()" }, { @@ -1010,7 +970,7 @@ "source_location": "L121", "_origin": "ast", "id": "app_routes_monitoring_cache_health_check", - "community": 12, + "community": 18, "norm_label": "cache_health_check()" }, { @@ -1030,7 +990,7 @@ "source_location": "L188", "_origin": "ast", "id": "app_routes_monitoring_get_ingestion_stats", - "community": 12, + "community": 63, "norm_label": "get_ingestion_stats()" }, { @@ -1040,7 +1000,7 @@ "source_location": "L237", "_origin": "ast", "id": "app_routes_monitoring_get_ingestion_alerts", - "community": 12, + "community": 63, "norm_label": "get_ingestion_alerts()" }, { @@ -1050,7 +1010,7 @@ "source_location": "L289", "_origin": "ast", "id": "app_routes_monitoring_get_quota_stats", - "community": 38, + "community": 12, "norm_label": "get_quota_stats()" }, { @@ -1080,7 +1040,7 @@ "source_location": "L87", "_origin": "ast", "id": "app_routes_monitoring_rationale_87", - "community": 12, + "community": 18, "norm_label": "clear all cached data (admin endpoint). use with caution: this will f" }, { @@ -1090,7 +1050,7 @@ "source_location": "L122", "_origin": "ast", "id": "app_routes_monitoring_rationale_122", - "community": 12, + "community": 18, "norm_label": "simple health check endpoint for cache connectivity. returns:" }, { @@ -1110,7 +1070,7 @@ "source_location": "L189", "_origin": "ast", "id": "app_routes_monitoring_rationale_189", - "community": 12, + "community": 63, "norm_label": "get ingestion statistics returns metrics about news ingestion perform" }, { @@ -1120,7 +1080,7 @@ "source_location": "L238", "_origin": "ast", "id": "app_routes_monitoring_rationale_238", - "community": 12, + "community": 63, "norm_label": "check for ingestion alerts monitors: - high duplicate rate (>90%" }, { @@ -1130,7 +1090,7 @@ "source_location": "L290", "_origin": "ast", "id": "app_routes_monitoring_rationale_290", - "community": 38, + "community": 12, "norm_label": "get api quota usage statistics tracks usage for: - gnews api (10" }, { @@ -1140,7 +1100,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_routes_news", - "community": 29, + "community": 1, "norm_label": "news.py" }, { @@ -1180,7 +1140,7 @@ "source_location": "L303", "_origin": "ast", "id": "app_routes_news_get_provider_stats", - "community": 29, + "community": 1, "norm_label": "get_provider_stats()" }, { @@ -1220,7 +1180,7 @@ "source_location": "L304", "_origin": "ast", "id": "app_routes_news_rationale_304", - "community": 29, + "community": 1, "norm_label": "get statistics about news provider usage and health returns informati" }, { @@ -1230,7 +1190,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_routes_research", - "community": 17, + "community": 10, "norm_label": "research.py" }, { @@ -1240,7 +1200,7 @@ "source_location": "L12", "_origin": "ast", "id": "app_routes_research_get_research_paper", - "community": 17, + "community": 10, "norm_label": "get_research_paper()" }, { @@ -1250,7 +1210,7 @@ "source_location": "L13", "_origin": "ast", "id": "app_routes_research_rationale_13", - "community": 17, + "community": 10, "norm_label": "get a single research paper by id." }, { @@ -1400,7 +1360,7 @@ "source_location": "L315", "_origin": "ast", "id": "app_routes_subscription_get_subscription_status", - "community": 16, + "community": 10, "norm_label": "get_subscription_status()" }, { @@ -1470,7 +1430,7 @@ "source_location": "L316", "_origin": "ast", "id": "app_routes_subscription_rationale_316", - "community": 16, + "community": 10, "norm_label": "get subscription status by email required for dashboard to sync with appwri" }, { @@ -1490,7 +1450,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_adaptive_scheduler", - "community": 15, + "community": 80, "norm_label": "adaptive_scheduler.py" }, { @@ -1620,7 +1580,7 @@ "source_location": "L285", "_origin": "ast", "id": "app_services_adaptive_scheduler_get_adaptive_scheduler", - "community": 28, + "community": 80, "norm_label": "get_adaptive_scheduler()" }, { @@ -1630,7 +1590,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_adaptive_scheduler_rationale_1", - "community": 15, + "community": 80, "norm_label": "adaptive scheduler for dynamic category fetching automatically adjusts fetch" }, { @@ -1760,7 +1720,7 @@ "source_location": "L286", "_origin": "ast", "id": "app_services_adaptive_scheduler_rationale_286", - "community": 28, + "community": 80, "norm_label": "get or create adaptive scheduler instance" }, { @@ -1770,7 +1730,7 @@ "source_location": "L167", "_origin": "ast", "id": "app_services_adaptive_scheduler_rationale_167", - "community": 15, + "community": 80, "norm_label": "# note: we no longer call _save_velocity_data() here." }, { @@ -1780,7 +1740,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_alert_service", - "community": 17, + "community": 16, "norm_label": "alert_service.py" }, { @@ -1790,7 +1750,7 @@ "source_location": "L12", "_origin": "ast", "id": "app_services_alert_service_send_admin_alert", - "community": 17, + "community": 16, "norm_label": "send_admin_alert()" }, { @@ -1800,7 +1760,7 @@ "source_location": "L97", "_origin": "ast", "id": "app_services_alert_service_alert_zero_articles", - "community": 17, + "community": 16, "norm_label": "alert_zero_articles()" }, { @@ -1810,7 +1770,7 @@ "source_location": "L112", "_origin": "ast", "id": "app_services_alert_service_alert_quota_exhausted", - "community": 17, + "community": 16, "norm_label": "alert_quota_exhausted()" }, { @@ -1820,7 +1780,7 @@ "source_location": "L132", "_origin": "ast", "id": "app_services_alert_service_alert_high_failure_rate", - "community": 17, + "community": 16, "norm_label": "alert_high_failure_rate()" }, { @@ -1830,7 +1790,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_alert_service_rationale_1", - "community": 17, + "community": 16, "norm_label": "admin alerting service sends real-time alerts via webhooks (discord/slack) for" }, { @@ -1840,7 +1800,7 @@ "source_location": "L18", "_origin": "ast", "id": "app_services_alert_service_rationale_18", - "community": 17, + "community": 16, "norm_label": "send alert to admin via webhook (discord/slack) this converts passive" }, { @@ -1850,7 +1810,7 @@ "source_location": "L98", "_origin": "ast", "id": "app_services_alert_service_rationale_98", - "community": 17, + "community": 16, "norm_label": "alert: critical - no articles available for newsletter" }, { @@ -1860,7 +1820,7 @@ "source_location": "L118", "_origin": "ast", "id": "app_services_alert_service_rationale_118", - "community": 17, + "community": 16, "norm_label": "alert: warning - brevo api quota exhausted" }, { @@ -1870,7 +1830,7 @@ "source_location": "L138", "_origin": "ast", "id": "app_services_alert_service_rationale_138", - "community": 17, + "community": 16, "norm_label": "alert: error - high email failure rate" }, { @@ -1880,7 +1840,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_api_quota", - "community": 38, + "community": 4, "norm_label": "api_quota.py" }, { @@ -1970,7 +1930,7 @@ "source_location": "L243", "_origin": "ast", "id": "app_services_api_quota_get_quota_tracker", - "community": 38, + "community": 4, "norm_label": "get_quota_tracker()" }, { @@ -1980,7 +1940,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_api_quota_rationale_1", - "community": 38, + "community": 4, "norm_label": "api quota tracking service monitors api usage and prevents hitting rate limits" }, { @@ -2050,7 +2010,7 @@ "source_location": "L244", "_origin": "ast", "id": "app_services_api_quota_rationale_244", - "community": 38, + "community": 4, "norm_label": "get or create global quota tracker instance" }, { @@ -2180,7 +2140,7 @@ "source_location": "L195", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_get_collection_id", - "community": 40, + "community": 85, "norm_label": ".get_collection_id()" }, { @@ -2200,7 +2160,7 @@ "source_location": "L260", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_get_articles", - "community": 40, + "community": 85, "norm_label": ".get_articles()" }, { @@ -2210,7 +2170,7 @@ "source_location": "L354", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", - "community": 40, + "community": 85, "norm_label": ".get_articles_with_queries()" }, { @@ -2280,7 +2240,7 @@ "source_location": "L713", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_create_subscriber", - "community": 40, + "community": 44, "norm_label": ".create_subscriber()" }, { @@ -2290,7 +2250,7 @@ "source_location": "L765", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_get_subscriber", - "community": 40, + "community": 44, "norm_label": ".get_subscriber()" }, { @@ -2300,7 +2260,7 @@ "source_location": "L786", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_update_subscriber", - "community": 40, + "community": 44, "norm_label": ".update_subscriber()" }, { @@ -2330,7 +2290,7 @@ "source_location": "L862", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_update_subscription_status", - "community": 40, + "community": 44, "norm_label": ".update_subscription_status()" }, { @@ -2340,7 +2300,7 @@ "source_location": "L904", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", - "community": 40, + "community": 44, "norm_label": ".update_subscriber_status()" }, { @@ -2350,7 +2310,7 @@ "source_location": "L932", "_origin": "ast", "id": "app_services_appwrite_db_appwritedatabase_update_last_sent", - "community": 40, + "community": 44, "norm_label": ".update_last_sent()" }, { @@ -2390,7 +2350,7 @@ "source_location": "L1090", "_origin": "ast", "id": "app_services_appwrite_db_get_appwrite_db", - "community": 17, + "community": 10, "norm_label": "get_appwrite_db()" }, { @@ -2450,7 +2410,7 @@ "source_location": "L196", "_origin": "ast", "id": "app_services_appwrite_db_rationale_196", - "community": 40, + "community": 85, "norm_label": "phase 4: strict routing algorithm (vertical architecture)" }, { @@ -2470,7 +2430,7 @@ "source_location": "L261", "_origin": "ast", "id": "app_services_appwrite_db_rationale_261", - "community": 40, + "community": 85, "norm_label": "get articles by category with pagination and projection (faang-level)" }, { @@ -2480,7 +2440,7 @@ "source_location": "L355", "_origin": "ast", "id": "app_services_appwrite_db_rationale_355", - "community": 40, + "community": 85, "norm_label": "get articles with custom query filters (for cursor pagination)" }, { @@ -2540,7 +2500,7 @@ "source_location": "L714", "_origin": "ast", "id": "app_services_appwrite_db_rationale_714", - "community": 40, + "community": 44, "norm_label": "create a new subscriber in appwrite (dual-write) uses boolean flags sch" }, { @@ -2550,7 +2510,7 @@ "source_location": "L766", "_origin": "ast", "id": "app_services_appwrite_db_rationale_766", - "community": 40, + "community": 44, "norm_label": "get subscriber by email" }, { @@ -2560,7 +2520,7 @@ "source_location": "L787", "_origin": "ast", "id": "app_services_appwrite_db_rationale_787", - "community": 40, + "community": 44, "norm_label": "update subscriber preferences" }, { @@ -2590,7 +2550,7 @@ "source_location": "L863", "_origin": "ast", "id": "app_services_appwrite_db_rationale_863", - "community": 40, + "community": 44, "norm_label": "update specific subscription preference (granular unsubscribe)" }, { @@ -2600,7 +2560,7 @@ "source_location": "L905", "_origin": "ast", "id": "app_services_appwrite_db_rationale_905", - "community": 40, + "community": 44, "norm_label": "update global subscription status (global unsubscribe)" }, { @@ -2610,7 +2570,7 @@ "source_location": "L933", "_origin": "ast", "id": "app_services_appwrite_db_rationale_933", - "community": 40, + "community": 44, "norm_label": "update lastsentat timestamp for a subscriber" }, { @@ -2650,7 +2610,7 @@ "source_location": "L1091", "_origin": "ast", "id": "app_services_appwrite_db_rationale_1091", - "community": 17, + "community": 10, "norm_label": "get or create appwrite database singleton instance" }, { @@ -2810,7 +2770,7 @@ "source_location": "L16", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice", - "community": 18, + "community": 16, "norm_label": "brevoemailservice" }, { @@ -2820,7 +2780,7 @@ "source_location": "L19", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_init", - "community": 18, + "community": 16, "norm_label": ".__init__()" }, { @@ -2830,7 +2790,7 @@ "source_location": "L34", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_get_account_info", - "community": 18, + "community": 16, "norm_label": ".get_account_info()" }, { @@ -2840,7 +2800,7 @@ "source_location": "L66", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_check_quota", - "community": 18, + "community": 16, "norm_label": ".check_quota()" }, { @@ -2850,7 +2810,7 @@ "source_location": "", "_origin": "ast", "id": "app_services_brevo_email_service_py_any", - "community": 18, + "community": 16, "norm_label": "any" }, { @@ -2860,7 +2820,7 @@ "source_location": "L104", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_token", - "community": 18, + "community": 16, "norm_label": ".generate_unsubscribe_token()" }, { @@ -2870,7 +2830,7 @@ "source_location": "L111", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", - "community": 18, + "community": 16, "norm_label": ".generate_unsubscribe_link()" }, { @@ -2880,7 +2840,7 @@ "source_location": "L119", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", - "community": 18, + "community": 16, "norm_label": ".send_welcome_email()" }, { @@ -2890,7 +2850,7 @@ "source_location": "L203", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_send_newsletter", - "community": 18, + "community": 16, "norm_label": ".send_newsletter()" }, { @@ -2900,7 +2860,7 @@ "source_location": "L404", "_origin": "ast", "id": "app_services_brevo_email_service_brevoemailservice_send_unsubscribe_confirmation", - "community": 18, + "community": 16, "norm_label": ".send_unsubscribe_confirmation()" }, { @@ -2930,7 +2890,7 @@ "source_location": "L17", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_17", - "community": 18, + "community": 16, "norm_label": "email service using brevo api" }, { @@ -2940,7 +2900,7 @@ "source_location": "L35", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_35", - "community": 18, + "community": 16, "norm_label": "get brevo account information including email credits returns" }, { @@ -2950,7 +2910,7 @@ "source_location": "L67", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_67", - "community": 18, + "community": 16, "norm_label": "check if there are enough email credits for the send job args" }, { @@ -2960,7 +2920,7 @@ "source_location": "L105", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_105", - "community": 18, + "community": 16, "norm_label": "generate unique token for unsubscribe links" }, { @@ -2970,7 +2930,7 @@ "source_location": "L112", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_112", - "community": 18, + "community": 16, "norm_label": "generate unsubscribe url with optional preference" }, { @@ -2980,7 +2940,7 @@ "source_location": "L120", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_120", - "community": 18, + "community": 16, "norm_label": "send welcome email to new subscriber" }, { @@ -2990,7 +2950,7 @@ "source_location": "L212", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_212", - "community": 18, + "community": 16, "norm_label": "send newsletter to subscribers with quota-aware sending args:" }, { @@ -3000,7 +2960,7 @@ "source_location": "L405", "_origin": "ast", "id": "app_services_brevo_email_service_rationale_405", - "community": 18, + "community": 16, "norm_label": "send confirmation email after unsubscribe" }, { @@ -3120,7 +3080,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_cache_service", - "community": 28, + "community": 29, "norm_label": "cache_service.py" }, { @@ -3200,7 +3160,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_cache_service_rationale_1", - "community": 28, + "community": 29, "norm_label": "cache service using redis provides caching layer to reduce external api calls w" }, { @@ -3430,7 +3390,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_circuit_breaker", - "community": 11, + "community": 18, "norm_label": "circuit_breaker.py" }, { @@ -3440,7 +3400,7 @@ "source_location": "L25", "_origin": "ast", "id": "app_services_circuit_breaker_circuitstate", - "community": 11, + "community": 18, "norm_label": "circuitstate" }, { @@ -3450,7 +3410,7 @@ "source_location": "", "_origin": "ast", "id": "str", - "community": 11, + "community": 18, "norm_label": "str" }, { @@ -3460,7 +3420,7 @@ "source_location": "", "_origin": "ast", "id": "enum", - "community": 9, + "community": 4, "norm_label": "enum" }, { @@ -3600,7 +3560,7 @@ "source_location": "L464", "_origin": "ast", "id": "app_services_circuit_breaker_get_circuit_breaker", - "community": 11, + "community": 18, "norm_label": "get_circuit_breaker()" }, { @@ -3610,7 +3570,7 @@ "source_location": "L485", "_origin": "ast", "id": "app_services_circuit_breaker_startup_circuit_breaker", - "community": 11, + "community": 12, "norm_label": "startup_circuit_breaker()" }, { @@ -3620,7 +3580,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_circuit_breaker_rationale_1", - "community": 11, + "community": 18, "norm_label": "provider circuit breaker ======================== prevents wasting time/band" }, { @@ -3630,7 +3590,7 @@ "source_location": "L26", "_origin": "ast", "id": "app_services_circuit_breaker_rationale_26", - "community": 11, + "community": 18, "norm_label": "circuit breaker states" }, { @@ -3770,7 +3730,7 @@ "source_location": "L465", "_origin": "ast", "id": "app_services_circuit_breaker_rationale_465", - "community": 11, + "community": 18, "norm_label": "get or create global circuit breaker instance. this is a lazy singleton \u2014" }, { @@ -3780,7 +3740,7 @@ "source_location": "L486", "_origin": "ast", "id": "app_services_circuit_breaker_rationale_486", - "community": 11, + "community": 12, "norm_label": "load saved circuit states from redis on server startup. this function is" }, { @@ -3790,7 +3750,7 @@ "source_location": "L83", "_origin": "ast", "id": "app_services_circuit_breaker_rationale_83", - "community": 11, + "community": 18, "norm_label": "# important: every provider registered in news_aggregator.py must be" }, { @@ -3800,7 +3760,7 @@ "source_location": "L109", "_origin": "ast", "id": "app_services_circuit_breaker_rationale_109", - "community": 11, + "community": 18, "norm_label": "# note: we deliberately do not try to load redis state here." }, { @@ -3930,7 +3890,7 @@ "source_location": "L267", "_origin": "ast", "id": "app_services_deduplication_get_url_filter", - "community": 32, + "community": 8, "norm_label": "get_url_filter()" }, { @@ -4050,7 +4010,7 @@ "source_location": "L268", "_origin": "ast", "id": "app_services_deduplication_rationale_268", - "community": 32, + "community": 8, "norm_label": "get or create global url filter instance returns: urlfilter:" }, { @@ -4230,2088 +4190,2078 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_firebase_service", - "community": 17, + "community": 135, "norm_label": "firebase_service.py" }, { - "label": "FirebaseService", + "label": "ingestion_metrics.py", "file_type": "code", - "source_file": "app/services/firebase_service.py", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L1", + "_origin": "ast", + "id": "app_services_ingestion_metrics", + "community": 63, + "norm_label": "ingestion_metrics.py" + }, + { + "label": "IngestionMetrics", + "file_type": "code", + "source_file": "app/services/ingestion_metrics.py", "source_location": "L13", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice", - "community": 10, - "norm_label": "firebaseservice" + "id": "app_services_ingestion_metrics_ingestionmetrics", + "community": 21, + "norm_label": "ingestionmetrics" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/firebase_service.py", + "source_file": "app/services/ingestion_metrics.py", "source_location": "L16", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_init", - "community": 10, + "id": "app_services_ingestion_metrics_ingestionmetrics_init", + "community": 21, "norm_label": ".__init__()" }, { - "label": "._initialize()", + "label": ".record_run()", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L22", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L25", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_initialize", - "community": 10, - "norm_label": "._initialize()" + "id": "app_services_ingestion_metrics_ingestionmetrics_record_run", + "community": 21, + "norm_label": ".record_run()" }, { - "label": "._get_article_id()", + "label": ".get_stats()", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L95", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L68", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_get_article_id", - "community": 10, - "norm_label": "._get_article_id()" + "id": "app_services_ingestion_metrics_ingestionmetrics_get_stats", + "community": 21, + "norm_label": ".get_stats()" }, { - "label": ".increment_view()", + "label": ".check_alerts()", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L101", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L97", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_increment_view", - "community": 10, - "norm_label": ".increment_view()" + "id": "app_services_ingestion_metrics_ingestionmetrics_check_alerts", + "community": 21, + "norm_label": ".check_alerts()" }, { - "label": ".get_view_count()", + "label": "get_ingestion_metrics()", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L134", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L140", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_get_view_count", - "community": 10, - "norm_label": ".get_view_count()" + "id": "app_services_ingestion_metrics_get_ingestion_metrics", + "community": 63, + "norm_label": "get_ingestion_metrics()" }, { - "label": ".add_subscriber()", - "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L153", + "label": "Ingestion Statistics Tracking Monitors ingestion performance, duplicate rates,", + "file_type": "rationale", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_add_subscriber", - "community": 10, - "norm_label": ".add_subscriber()" + "id": "app_services_ingestion_metrics_rationale_1", + "community": 63, + "norm_label": "ingestion statistics tracking monitors ingestion performance, duplicate rates," }, { - "label": ".get_subscriber()", - "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L210", + "label": "Track ingestion metrics over time", + "file_type": "rationale", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L14", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_get_subscriber", - "community": 10, - "norm_label": ".get_subscriber()" + "id": "app_services_ingestion_metrics_rationale_14", + "community": 21, + "norm_label": "track ingestion metrics over time" }, { - "label": ".get_subscriber_by_token()", - "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L227", + "label": "Record metrics from an ingestion run", + "file_type": "rationale", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L34", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_get_subscriber_by_token", - "community": 10, - "norm_label": ".get_subscriber_by_token()" + "id": "app_services_ingestion_metrics_rationale_34", + "community": 21, + "norm_label": "record metrics from an ingestion run" }, { - "label": ".update_subscriber_status()", - "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L249", + "label": "Get current ingestion statistics", + "file_type": "rationale", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L69", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_update_subscriber_status", - "community": 10, - "norm_label": ".update_subscriber_status()" + "id": "app_services_ingestion_metrics_rationale_69", + "community": 21, + "norm_label": "get current ingestion statistics" }, { - "label": ".get_all_subscribers()", - "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L273", + "label": "Check if any metrics exceed thresholds", + "file_type": "rationale", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L98", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_get_all_subscribers", - "community": 10, - "norm_label": ".get_all_subscribers()" + "id": "app_services_ingestion_metrics_rationale_98", + "community": 21, + "norm_label": "check if any metrics exceed thresholds" }, { - "label": ".get_subscribers_by_preference()", - "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L298", + "label": "Get or create global ingestion metrics instance", + "file_type": "rationale", + "source_file": "app/services/ingestion_metrics.py", + "source_location": "L141", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_get_subscribers_by_preference", - "community": 10, - "norm_label": ".get_subscribers_by_preference()" + "id": "app_services_ingestion_metrics_rationale_141", + "community": 63, + "norm_label": "get or create global ingestion metrics instance" }, { - "label": ".update_preference()", + "label": "news_aggregator.py", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L349", + "source_file": "app/services/news_aggregator.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_update_preference", - "community": 10, - "norm_label": ".update_preference()" + "id": "app_services_news_aggregator", + "community": 9, + "norm_label": "news_aggregator.py" }, { - "label": ".update_subscription_status()", + "label": "NewsAggregator", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L376", + "source_file": "app/services/news_aggregator.py", + "source_location": "L42", "_origin": "ast", - "id": "app_services_firebase_service_firebaseservice_update_subscription_status", - "community": 10, - "norm_label": ".update_subscription_status()" + "id": "app_services_news_aggregator_newsaggregator", + "community": 27, + "norm_label": "newsaggregator" }, { - "label": "get_firebase_service()", + "label": ".__init__()", "file_type": "code", - "source_file": "app/services/firebase_service.py", - "source_location": "L426", + "source_file": "app/services/news_aggregator.py", + "source_location": "L45", "_origin": "ast", - "id": "app_services_firebase_service_get_firebase_service", - "community": 17, - "norm_label": "get_firebase_service()" + "id": "app_services_news_aggregator_newsaggregator_init", + "community": 4, + "norm_label": ".__init__()" }, { - "label": "Firebase Realtime Database service for analytics (optional)", - "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L14", + "label": ".fetch_by_category()", + "file_type": "code", + "source_file": "app/services/news_aggregator.py", + "source_location": "L203", "_origin": "ast", - "id": "app_services_firebase_service_rationale_14", - "community": 10, - "norm_label": "firebase realtime database service for analytics (optional)" + "id": "app_services_news_aggregator_newsaggregator_fetch_by_category", + "community": 27, + "norm_label": ".fetch_by_category()" }, { - "label": "Initialize Firebase Admin SDK", - "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L23", + "label": ".fetch_from_provider()", + "file_type": "code", + "source_file": "app/services/news_aggregator.py", + "source_location": "L436", "_origin": "ast", - "id": "app_services_firebase_service_rationale_23", - "community": 10, - "norm_label": "initialize firebase admin sdk" + "id": "app_services_news_aggregator_newsaggregator_fetch_from_provider", + "community": 27, + "norm_label": ".fetch_from_provider()" }, { - "label": "Generate article ID from URL", - "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L96", + "label": ".fetch_rss()", + "file_type": "code", + "source_file": "app/services/news_aggregator.py", + "source_location": "L448", "_origin": "ast", - "id": "app_services_firebase_service_rationale_96", - "community": 10, - "norm_label": "generate article id from url" + "id": "app_services_news_aggregator_newsaggregator_fetch_rss", + "community": 27, + "norm_label": ".fetch_rss()" }, { - "label": "Increment view count for an article", - "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L102", + "label": ".search()", + "file_type": "code", + "source_file": "app/services/news_aggregator.py", + "source_location": "L465", "_origin": "ast", - "id": "app_services_firebase_service_rationale_102", - "community": 10, - "norm_label": "increment view count for an article" + "id": "app_services_news_aggregator_newsaggregator_search", + "community": 27, + "norm_label": ".search()" }, { - "label": "Get view count for an article", - "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L135", + "label": ".get_stats()", + "file_type": "code", + "source_file": "app/services/news_aggregator.py", + "source_location": "L486", "_origin": "ast", - "id": "app_services_firebase_service_rationale_135", - "community": 10, - "norm_label": "get view count for an article" + "id": "app_services_news_aggregator_newsaggregator_get_stats", + "community": 27, + "norm_label": ".get_stats()" }, { - "label": "Add or Update subscriber in database Now supports merging 'subscription", + "label": "Service for aggregating news from multiple sources with automatic failover", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L154", + "source_file": "app/services/news_aggregator.py", + "source_location": "L43", "_origin": "ast", - "id": "app_services_firebase_service_rationale_154", - "community": 10, - "norm_label": "add or update subscriber in database now supports merging 'subscription" + "id": "app_services_news_aggregator_rationale_43", + "community": 27, + "norm_label": "service for aggregating news from multiple sources with automatic failover" }, { - "label": "Get subscriber by email", + "label": "Fetch news from ALL available sources for a category. Strategy (Phase", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L211", + "source_file": "app/services/news_aggregator.py", + "source_location": "L204", "_origin": "ast", - "id": "app_services_firebase_service_rationale_211", - "community": 10, - "norm_label": "get subscriber by email" + "id": "app_services_news_aggregator_rationale_204", + "community": 27, + "norm_label": "fetch news from all available sources for a category. strategy (phase" }, { - "label": "Get subscriber by unsubscribe token", + "label": "Fetch news specifically from a named provider (bypassing priority/failover)", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L228", + "source_file": "app/services/news_aggregator.py", + "source_location": "L437", "_origin": "ast", - "id": "app_services_firebase_service_rationale_228", - "community": 10, - "norm_label": "get subscriber by unsubscribe token" + "id": "app_services_news_aggregator_rationale_437", + "community": 27, + "norm_label": "fetch news specifically from a named provider (bypassing priority/failover)" }, { - "label": "Update subscriber subscription status", + "label": "Fetch RSS from cloud providers", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L250", + "source_file": "app/services/news_aggregator.py", + "source_location": "L449", "_origin": "ast", - "id": "app_services_firebase_service_rationale_250", - "community": 10, - "norm_label": "update subscriber subscription status" + "id": "app_services_news_aggregator_rationale_449", + "community": 27, + "norm_label": "fetch rss from cloud providers" }, { - "label": "Get all subscribers from database with migration support", + "label": "Search news articles using hybrid approach Currently uses Google News R", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L274", + "source_file": "app/services/news_aggregator.py", + "source_location": "L466", "_origin": "ast", - "id": "app_services_firebase_service_rationale_274", - "community": 10, - "norm_label": "get all subscribers from database with migration support" + "id": "app_services_news_aggregator_rationale_466", + "community": 27, + "norm_label": "search news articles using hybrid approach currently uses google news r" }, { - "label": "Get all subscribers filtered by newsletter preference Supports NEW 'sub", + "label": "Get usage statistics for monitoring", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L299", + "source_file": "app/services/news_aggregator.py", + "source_location": "L487", "_origin": "ast", - "id": "app_services_firebase_service_rationale_299", - "community": 10, - "norm_label": "get all subscribers filtered by newsletter preference supports new 'sub" + "id": "app_services_news_aggregator_rationale_487", + "community": 27, + "norm_label": "get usage statistics for monitoring" }, { - "label": "Update subscriber's newsletter preference", + "label": "# NOTE: 'inshorts' removed \u2014 100% connection-reset failures on HF Spaces (geo-bl", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L350", + "source_file": "app/services/news_aggregator.py", + "source_location": "L119", "_origin": "ast", - "id": "app_services_firebase_service_rationale_350", - "community": 10, - "norm_label": "update subscriber's newsletter preference" + "id": "app_services_news_aggregator_rationale_119", + "community": 9, + "norm_label": "# note: 'inshorts' removed \u2014 100% connection-reset failures on hf spaces (geo-bl" }, { - "label": "Update a SPECIFIC subscription (Granular Unsubscribe) e.g. Set 'Morning", + "label": "# NOTE: 'wikinews' removed \u2014 returns stale 2009-era political articles (0 keywor", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L377", + "source_file": "app/services/news_aggregator.py", + "source_location": "L120", "_origin": "ast", - "id": "app_services_firebase_service_rationale_377", - "community": 10, - "norm_label": "update a specific subscription (granular unsubscribe) e.g. set 'morning" + "id": "app_services_news_aggregator_rationale_120", + "community": 9, + "norm_label": "# note: 'wikinews' removed \u2014 returns stale 2009-era political articles (0 keywor" + }, + { + "label": "news_processor.py", + "file_type": "code", + "source_file": "app/services/news_processor.py", + "source_location": "L1", + "_origin": "ast", + "id": "app_services_news_processor", + "community": 80, + "norm_label": "news_processor.py" + }, + { + "label": "process_category()", + "file_type": "code", + "source_file": "app/services/news_processor.py", + "source_location": "L22", + "_origin": "ast", + "id": "app_services_news_processor_process_category", + "community": 80, + "norm_label": "process_category()" }, { - "label": "Get or create Firebase service singleton instance", + "label": "News Processor Service Handles the heavy lifting of fetching, validating, and s", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L427", + "source_file": "app/services/news_processor.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_firebase_service_rationale_427", - "community": 17, - "norm_label": "get or create firebase service singleton instance" + "id": "app_services_news_processor_rationale_1", + "community": 80, + "norm_label": "news processor service handles the heavy lifting of fetching, validating, and s" }, { - "label": "# NOTE: Firebase RTDB only supports sorting/filtering on ONE key.", + "label": "Core logic: Fetch -> Validate -> Save -> Update Adaptive Interval", "file_type": "rationale", - "source_file": "app/services/firebase_service.py", - "source_location": "L309", + "source_file": "app/services/news_processor.py", + "source_location": "L23", "_origin": "ast", - "id": "app_services_firebase_service_rationale_309", - "community": 17, - "norm_label": "# note: firebase rtdb only supports sorting/filtering on one key." + "id": "app_services_news_processor_rationale_23", + "community": 80, + "norm_label": "core logic: fetch -> validate -> save -> update adaptive interval" }, { - "label": "ingestion_metrics.py", + "label": "# NOTE: fetched_approx excludes Redis-dedup volume (not returned by", + "file_type": "rationale", + "source_file": "app/services/news_processor.py", + "source_location": "L71", + "_origin": "ast", + "id": "app_services_news_processor_rationale_71", + "community": 80, + "norm_label": "# note: fetched_approx excludes redis-dedup volume (not returned by" + }, + { + "label": "news_providers.py", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", + "source_file": "app/services/news_providers.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_ingestion_metrics", - "community": 21, - "norm_label": "ingestion_metrics.py" + "id": "app_services_news_providers", + "community": 4, + "norm_label": "news_providers.py" }, { - "label": "IngestionMetrics", + "label": "ProviderStatus", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", + "source_file": "app/services/news_providers.py", "source_location": "L13", "_origin": "ast", - "id": "app_services_ingestion_metrics_ingestionmetrics", - "community": 21, - "norm_label": "ingestionmetrics" + "id": "app_services_news_providers_providerstatus", + "community": 4, + "norm_label": "providerstatus" }, { - "label": ".__init__()", + "label": "NewsProvider", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L16", + "source_file": "app/services/news_providers.py", + "source_location": "L19", "_origin": "ast", - "id": "app_services_ingestion_metrics_ingestionmetrics_init", - "community": 21, - "norm_label": ".__init__()" + "id": "app_services_news_providers_newsprovider", + "community": 4, + "norm_label": "newsprovider" }, { - "label": ".record_run()", + "label": "ABC", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L25", + "source_file": "", + "source_location": "", "_origin": "ast", - "id": "app_services_ingestion_metrics_ingestionmetrics_record_run", - "community": 21, - "norm_label": ".record_run()" + "id": "abc", + "community": 9, + "norm_label": "abc" }, { - "label": ".get_stats()", + "label": ".__init__()", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L68", + "source_file": "app/services/news_providers.py", + "source_location": "L22", "_origin": "ast", - "id": "app_services_ingestion_metrics_ingestionmetrics_get_stats", - "community": 21, - "norm_label": ".get_stats()" + "id": "app_services_news_providers_newsprovider_init", + "community": 4, + "norm_label": ".__init__()" }, { - "label": ".check_alerts()", + "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L97", + "source_file": "app/services/news_providers.py", + "source_location": "L32", "_origin": "ast", - "id": "app_services_ingestion_metrics_ingestionmetrics_check_alerts", - "community": 21, - "norm_label": ".check_alerts()" + "id": "app_services_news_providers_newsprovider_fetch_news", + "community": 4, + "norm_label": ".fetch_news()" }, { - "label": "get_ingestion_metrics()", + "label": ".is_available()", "file_type": "code", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L140", + "source_file": "app/services/news_providers.py", + "source_location": "L36", "_origin": "ast", - "id": "app_services_ingestion_metrics_get_ingestion_metrics", - "community": 12, - "norm_label": "get_ingestion_metrics()" + "id": "app_services_news_providers_newsprovider_is_available", + "community": 4, + "norm_label": ".is_available()" }, { - "label": "Ingestion Statistics Tracking Monitors ingestion performance, duplicate rates,", - "file_type": "rationale", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L1", + "label": ".handle_429()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L46", "_origin": "ast", - "id": "app_services_ingestion_metrics_rationale_1", - "community": 21, - "norm_label": "ingestion statistics tracking monitors ingestion performance, duplicate rates," + "id": "app_services_news_providers_newsprovider_handle_429", + "community": 57, + "norm_label": ".handle_429()" }, { - "label": "Track ingestion metrics over time", - "file_type": "rationale", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L14", + "label": ".mark_rate_limited()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L57", "_origin": "ast", - "id": "app_services_ingestion_metrics_rationale_14", - "community": 21, - "norm_label": "track ingestion metrics over time" + "id": "app_services_news_providers_newsprovider_mark_rate_limited", + "community": 4, + "norm_label": ".mark_rate_limited()" }, { - "label": "Record metrics from an ingestion run", - "file_type": "rationale", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L34", + "label": ".reset_daily_quota()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L61", "_origin": "ast", - "id": "app_services_ingestion_metrics_rationale_34", - "community": 21, - "norm_label": "record metrics from an ingestion run" + "id": "app_services_news_providers_newsprovider_reset_daily_quota", + "community": 4, + "norm_label": ".reset_daily_quota()" }, { - "label": "Get current ingestion statistics", - "file_type": "rationale", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L69", + "label": "GNewsProvider", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L67", "_origin": "ast", - "id": "app_services_ingestion_metrics_rationale_69", - "community": 21, - "norm_label": "get current ingestion statistics" + "id": "app_services_news_providers_gnewsprovider", + "community": 4, + "norm_label": "gnewsprovider" }, { - "label": "Check if any metrics exceed thresholds", - "file_type": "rationale", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L98", + "label": ".__init__()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L70", "_origin": "ast", - "id": "app_services_ingestion_metrics_rationale_98", - "community": 21, - "norm_label": "check if any metrics exceed thresholds" + "id": "app_services_news_providers_gnewsprovider_init", + "community": 4, + "norm_label": ".__init__()" }, { - "label": "Get or create global ingestion metrics instance", - "file_type": "rationale", - "source_file": "app/services/ingestion_metrics.py", - "source_location": "L141", + "label": ".fetch_news()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L107", "_origin": "ast", - "id": "app_services_ingestion_metrics_rationale_141", - "community": 12, - "norm_label": "get or create global ingestion metrics instance" + "id": "app_services_news_providers_gnewsprovider_fetch_news", + "community": 57, + "norm_label": ".fetch_news()" }, { - "label": "news_aggregator.py", + "label": "._parse_response()", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L1", + "source_file": "app/services/news_providers.py", + "source_location": "L179", "_origin": "ast", - "id": "app_services_news_aggregator", + "id": "app_services_news_providers_gnewsprovider_parse_response", "community": 4, - "norm_label": "news_aggregator.py" + "norm_label": "._parse_response()" }, { - "label": "NewsAggregator", + "label": "NewsAPIProvider", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L42", + "source_file": "app/services/news_providers.py", + "source_location": "L200", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator", + "id": "app_services_news_providers_newsapiprovider", "community": 4, - "norm_label": "newsaggregator" + "norm_label": "newsapiprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L45", + "source_file": "app/services/news_providers.py", + "source_location": "L203", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator_init", + "id": "app_services_news_providers_newsapiprovider_init", "community": 4, "norm_label": ".__init__()" }, { - "label": ".fetch_by_category()", + "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L203", + "source_file": "app/services/news_providers.py", + "source_location": "L241", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator_fetch_by_category", - "community": 27, - "norm_label": ".fetch_by_category()" + "id": "app_services_news_providers_newsapiprovider_fetch_news", + "community": 57, + "norm_label": ".fetch_news()" }, { - "label": ".fetch_from_provider()", + "label": "._parse_response()", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L436", + "source_file": "app/services/news_providers.py", + "source_location": "L314", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator_fetch_from_provider", - "community": 27, - "norm_label": ".fetch_from_provider()" + "id": "app_services_news_providers_newsapiprovider_parse_response", + "community": 4, + "norm_label": "._parse_response()" }, { - "label": ".fetch_rss()", + "label": "NewsDataProvider", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L448", + "source_file": "app/services/news_providers.py", + "source_location": "L335", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator_fetch_rss", - "community": 27, - "norm_label": ".fetch_rss()" + "id": "app_services_news_providers_newsdataprovider", + "community": 57, + "norm_label": "newsdataprovider" }, { - "label": ".search()", + "label": ".__init__()", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L465", + "source_file": "app/services/news_providers.py", + "source_location": "L338", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator_search", - "community": 27, - "norm_label": ".search()" + "id": "app_services_news_providers_newsdataprovider_init", + "community": 4, + "norm_label": ".__init__()" }, { - "label": ".get_stats()", + "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/news_aggregator.py", - "source_location": "L486", + "source_file": "app/services/news_providers.py", + "source_location": "L375", "_origin": "ast", - "id": "app_services_news_aggregator_newsaggregator_get_stats", - "community": 4, - "norm_label": ".get_stats()" + "id": "app_services_news_providers_newsdataprovider_fetch_news", + "community": 57, + "norm_label": ".fetch_news()" }, { - "label": "Service for aggregating news from multiple sources with automatic failover", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L43", + "label": "._parse_response()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L421", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_43", - "community": 4, - "norm_label": "service for aggregating news from multiple sources with automatic failover" + "id": "app_services_news_providers_newsdataprovider_parse_response", + "community": 57, + "norm_label": "._parse_response()" }, { - "label": "Fetch news from ALL available sources for a category. Strategy (Phase", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L204", + "label": "GoogleNewsRSSProvider", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L442", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_204", - "community": 27, - "norm_label": "fetch news from all available sources for a category. strategy (phase" + "id": "app_services_news_providers_googlenewsrssprovider", + "community": 4, + "norm_label": "googlenewsrssprovider" }, { - "label": "Fetch news specifically from a named provider (bypassing priority/failover)", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L437", + "label": ".__init__()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L445", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_437", - "community": 27, - "norm_label": "fetch news specifically from a named provider (bypassing priority/failover)" + "id": "app_services_news_providers_googlenewsrssprovider_init", + "community": 4, + "norm_label": ".__init__()" }, { - "label": "Fetch RSS from cloud providers", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L449", + "label": ".fetch_news()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L476", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_449", - "community": 27, - "norm_label": "fetch rss from cloud providers" + "id": "app_services_news_providers_googlenewsrssprovider_fetch_news", + "community": 57, + "norm_label": ".fetch_news()" }, { - "label": "Search news articles using hybrid approach Currently uses Google News R", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L466", + "label": "MediumRSSProvider", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L510", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_466", - "community": 27, - "norm_label": "search news articles using hybrid approach currently uses google news r" + "id": "app_services_news_providers_mediumrssprovider", + "community": 4, + "norm_label": "mediumrssprovider" }, { - "label": "Get usage statistics for monitoring", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L487", + "label": ".__init__()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L516", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_487", + "id": "app_services_news_providers_mediumrssprovider_init", "community": 4, - "norm_label": "get usage statistics for monitoring" + "norm_label": ".__init__()" }, { - "label": "# NOTE: 'inshorts' removed \u2014 100% connection-reset failures on HF Spaces (geo-bl", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L119", + "label": ".fetch_news()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L532", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_119", + "id": "app_services_news_providers_mediumrssprovider_fetch_news", "community": 4, - "norm_label": "# note: 'inshorts' removed \u2014 100% connection-reset failures on hf spaces (geo-bl" + "norm_label": ".fetch_news()" }, { - "label": "# NOTE: 'wikinews' removed \u2014 returns stale 2009-era political articles (0 keywor", - "file_type": "rationale", - "source_file": "app/services/news_aggregator.py", - "source_location": "L120", + "label": "._extract_medium_image()", + "file_type": "code", + "source_file": "app/services/news_providers.py", + "source_location": "L586", "_origin": "ast", - "id": "app_services_news_aggregator_rationale_120", + "id": "app_services_news_providers_mediumrssprovider_extract_medium_image", "community": 4, - "norm_label": "# note: 'wikinews' removed \u2014 returns stale 2009-era political articles (0 keywor" + "norm_label": "._extract_medium_image()" }, { - "label": "news_processor.py", + "label": "._clean_html()", "file_type": "code", - "source_file": "app/services/news_processor.py", - "source_location": "L1", + "source_file": "app/services/news_providers.py", + "source_location": "L604", "_origin": "ast", - "id": "app_services_news_processor", - "community": 28, - "norm_label": "news_processor.py" + "id": "app_services_news_providers_mediumrssprovider_clean_html", + "community": 4, + "norm_label": "._clean_html()" }, { - "label": "process_category()", + "label": "._parse_pub_date()", "file_type": "code", - "source_file": "app/services/news_processor.py", - "source_location": "L22", + "source_file": "app/services/news_providers.py", + "source_location": "L611", "_origin": "ast", - "id": "app_services_news_processor_process_category", - "community": 28, - "norm_label": "process_category()" + "id": "app_services_news_providers_mediumrssprovider_parse_pub_date", + "community": 4, + "norm_label": "._parse_pub_date()" }, { - "label": "News Processor Service Handles the heavy lifting of fetching, validating, and s", - "file_type": "rationale", - "source_file": "app/services/news_processor.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_news_processor_rationale_1", - "community": 28, - "norm_label": "news processor service handles the heavy lifting of fetching, validating, and s" - }, - { - "label": "Core logic: Fetch -> Validate -> Save -> Update Adaptive Interval", - "file_type": "rationale", - "source_file": "app/services/news_processor.py", - "source_location": "L23", - "_origin": "ast", - "id": "app_services_news_processor_rationale_23", - "community": 28, - "norm_label": "core logic: fetch -> validate -> save -> update adaptive interval" - }, - { - "label": "# NOTE: fetched_approx excludes Redis-dedup volume (not returned by", - "file_type": "rationale", - "source_file": "app/services/news_processor.py", - "source_location": "L71", - "_origin": "ast", - "id": "app_services_news_processor_rationale_71", - "community": 28, - "norm_label": "# note: fetched_approx excludes redis-dedup volume (not returned by" - }, - { - "label": "news_providers.py", + "label": "OfficialCloudProvider", "file_type": "code", "source_file": "app/services/news_providers.py", - "source_location": "L1", + "source_location": "L620", "_origin": "ast", - "id": "app_services_news_providers", + "id": "app_services_news_providers_officialcloudprovider", "community": 4, - "norm_label": "news_providers.py" + "norm_label": "officialcloudprovider" }, { - "label": "ProviderStatus", + "label": ".__init__()", "file_type": "code", "source_file": "app/services/news_providers.py", - "source_location": "L13", + "source_location": "L627", "_origin": "ast", - "id": "app_services_news_providers_providerstatus", + "id": "app_services_news_providers_officialcloudprovider_init", "community": 4, - "norm_label": "providerstatus" + "norm_label": ".__init__()" }, { - "label": "NewsProvider", + "label": ".fetch_news()", "file_type": "code", "source_file": "app/services/news_providers.py", - "source_location": "L19", - "_origin": "ast", - "id": "app_services_news_providers_newsprovider", - "community": 4, - "norm_label": "newsprovider" - }, - { - "label": "ABC", - "file_type": "code", - "source_file": "", - "source_location": "", + "source_location": "L651", "_origin": "ast", - "id": "abc", - "community": 9, - "norm_label": "abc" + "id": "app_services_news_providers_officialcloudprovider_fetch_news", + "community": 57, + "norm_label": ".fetch_news()" }, { - "label": ".__init__()", - "file_type": "code", + "label": "Abstract base class for news providers", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L22", + "source_location": "L20", "_origin": "ast", - "id": "app_services_news_providers_newsprovider_init", + "id": "app_services_news_providers_rationale_20", "community": 4, - "norm_label": ".__init__()" + "norm_label": "abstract base class for news providers" }, { - "label": ".fetch_news()", - "file_type": "code", + "label": "Fetch news articles for a given category", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L32", + "source_location": "L33", "_origin": "ast", - "id": "app_services_news_providers_newsprovider_fetch_news", - "community": 27, - "norm_label": ".fetch_news()" + "id": "app_services_news_providers_rationale_33", + "community": 4, + "norm_label": "fetch news articles for a given category" }, { - "label": ".is_available()", - "file_type": "code", + "label": "Check if provider is available", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L36", + "source_location": "L37", "_origin": "ast", - "id": "app_services_news_providers_newsprovider_is_available", + "id": "app_services_news_providers_rationale_37", "community": 4, - "norm_label": ".is_available()" + "norm_label": "check if provider is available" }, { - "label": ".handle_429()", - "file_type": "code", + "label": "Implement exponential backoff for 429 Too Many Requests", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L46", + "source_location": "L47", "_origin": "ast", - "id": "app_services_news_providers_newsprovider_handle_429", + "id": "app_services_news_providers_rationale_47", "community": 57, - "norm_label": ".handle_429()" + "norm_label": "implement exponential backoff for 429 too many requests" }, { - "label": ".mark_rate_limited()", - "file_type": "code", + "label": "Mark provider as rate limited", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L57", + "source_location": "L58", "_origin": "ast", - "id": "app_services_news_providers_newsprovider_mark_rate_limited", + "id": "app_services_news_providers_rationale_58", "community": 4, - "norm_label": ".mark_rate_limited()" + "norm_label": "mark provider as rate limited" }, { - "label": ".reset_daily_quota()", - "file_type": "code", + "label": "GNews.io API provider", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L61", + "source_location": "L68", "_origin": "ast", - "id": "app_services_news_providers_newsprovider_reset_daily_quota", + "id": "app_services_news_providers_rationale_68", "community": 4, - "norm_label": ".reset_daily_quota()" + "norm_label": "gnews.io api provider" }, { - "label": "GNewsProvider", - "file_type": "code", + "label": "Fetch news from GNews API. Why no 'from'/'to' date filter here?", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L67", + "source_location": "L108", "_origin": "ast", - "id": "app_services_news_providers_gnewsprovider", - "community": 4, - "norm_label": "gnewsprovider" + "id": "app_services_news_providers_rationale_108", + "community": 57, + "norm_label": "fetch news from gnews api. why no 'from'/'to' date filter here?" }, { - "label": ".__init__()", - "file_type": "code", + "label": "Parse GNews API response", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L70", + "source_location": "L180", "_origin": "ast", - "id": "app_services_news_providers_gnewsprovider_init", + "id": "app_services_news_providers_rationale_180", "community": 4, - "norm_label": ".__init__()" + "norm_label": "parse gnews api response" }, { - "label": ".fetch_news()", - "file_type": "code", + "label": "Fetch news from NewsAPI. Phase 20 upgrade: The query string is now bu", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L107", + "source_location": "L242", "_origin": "ast", - "id": "app_services_news_providers_gnewsprovider_fetch_news", + "id": "app_services_news_providers_rationale_242", "community": 57, - "norm_label": ".fetch_news()" + "norm_label": "fetch news from newsapi. phase 20 upgrade: the query string is now bu" }, { - "label": "._parse_response()", - "file_type": "code", + "label": "Parse NewsAPI response", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L179", + "source_location": "L315", "_origin": "ast", - "id": "app_services_news_providers_gnewsprovider_parse_response", - "community": 27, - "norm_label": "._parse_response()" + "id": "app_services_news_providers_rationale_315", + "community": 4, + "norm_label": "parse newsapi response" }, { - "label": "NewsAPIProvider", - "file_type": "code", + "label": "Fetch news from NewsData.io", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L200", + "source_location": "L376", "_origin": "ast", - "id": "app_services_news_providers_newsapiprovider", - "community": 4, - "norm_label": "newsapiprovider" + "id": "app_services_news_providers_rationale_376", + "community": 57, + "norm_label": "fetch news from newsdata.io" }, { - "label": ".__init__()", - "file_type": "code", + "label": "Parse NewsData.io response", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L203", + "source_location": "L422", "_origin": "ast", - "id": "app_services_news_providers_newsapiprovider_init", - "community": 4, - "norm_label": ".__init__()" + "id": "app_services_news_providers_rationale_422", + "community": 57, + "norm_label": "parse newsdata.io response" }, { - "label": ".fetch_news()", - "file_type": "code", + "label": "Google News RSS provider (no API key needed)", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L241", + "source_location": "L443", "_origin": "ast", - "id": "app_services_news_providers_newsapiprovider_fetch_news", - "community": 57, - "norm_label": ".fetch_news()" + "id": "app_services_news_providers_rationale_443", + "community": 4, + "norm_label": "google news rss provider (no api key needed)" }, { - "label": "._parse_response()", - "file_type": "code", + "label": "Fetch news from Google News RSS", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L314", + "source_location": "L477", "_origin": "ast", - "id": "app_services_news_providers_newsapiprovider_parse_response", - "community": 27, - "norm_label": "._parse_response()" + "id": "app_services_news_providers_rationale_477", + "community": 57, + "norm_label": "fetch news from google news rss" }, { - "label": "NewsDataProvider", - "file_type": "code", + "label": "Medium RSS Provider Fetches latest 10 articles per tag. Handles CDATA image", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L335", + "source_location": "L511", "_origin": "ast", - "id": "app_services_news_providers_newsdataprovider", + "id": "app_services_news_providers_rationale_511", "community": 4, - "norm_label": "newsdataprovider" + "norm_label": "medium rss provider fetches latest 10 articles per tag. handles cdata image" }, { - "label": ".__init__()", - "file_type": "code", + "label": "Fetch and parse Medium RSS feed", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L338", + "source_location": "L533", "_origin": "ast", - "id": "app_services_news_providers_newsdataprovider_init", + "id": "app_services_news_providers_rationale_533", "community": 4, - "norm_label": ".__init__()" + "norm_label": "fetch and parse medium rss feed" }, { - "label": ".fetch_news()", - "file_type": "code", + "label": "Extracts the first valid image URL from Medium's HTML content. Medium u", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L375", + "source_location": "L587", "_origin": "ast", - "id": "app_services_news_providers_newsdataprovider_fetch_news", - "community": 57, - "norm_label": ".fetch_news()" + "id": "app_services_news_providers_rationale_587", + "community": 4, + "norm_label": "extracts the first valid image url from medium's html content. medium u" }, { - "label": "._parse_response()", - "file_type": "code", + "label": "Removes HTML tags for a clean description", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L421", + "source_location": "L605", "_origin": "ast", - "id": "app_services_news_providers_newsdataprovider_parse_response", - "community": 57, - "norm_label": "._parse_response()" - }, - { - "label": "GoogleNewsRSSProvider", - "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L442", - "_origin": "ast", - "id": "app_services_news_providers_googlenewsrssprovider", + "id": "app_services_news_providers_rationale_605", "community": 4, - "norm_label": "googlenewsrssprovider" + "norm_label": "removes html tags for a clean description" }, { - "label": ".__init__()", - "file_type": "code", + "label": "Official Cloud Provider RSS Strictly maps categories to specific official b", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L445", + "source_location": "L621", "_origin": "ast", - "id": "app_services_news_providers_googlenewsrssprovider_init", + "id": "app_services_news_providers_rationale_621", "community": 4, - "norm_label": ".__init__()" + "norm_label": "official cloud provider rss strictly maps categories to specific official b" }, { - "label": ".fetch_news()", - "file_type": "code", + "label": "Fetch news specifically for the requested category", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L476", + "source_location": "L652", "_origin": "ast", - "id": "app_services_news_providers_googlenewsrssprovider_fetch_news", + "id": "app_services_news_providers_rationale_652", "community": 57, - "norm_label": ".fetch_news()" + "norm_label": "fetch news specifically for the requested category" }, { - "label": "MediumRSSProvider", - "file_type": "code", + "label": "# NOTE: 'timeframe' is a PAID-tier-only parameter on NewsData.io.", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L510", + "source_location": "L386", "_origin": "ast", - "id": "app_services_news_providers_mediumrssprovider", - "community": 63, - "norm_label": "mediumrssprovider" + "id": "app_services_news_providers_rationale_386", + "community": 4, + "norm_label": "# note: 'timeframe' is a paid-tier-only parameter on newsdata.io." }, { - "label": ".__init__()", - "file_type": "code", + "label": "# NOTE: URLs verified/updated 2026-03-11:", + "file_type": "rationale", "source_file": "app/services/news_providers.py", - "source_location": "L516", + "source_location": "L632", "_origin": "ast", - "id": "app_services_news_providers_mediumrssprovider_init", + "id": "app_services_news_providers_rationale_632", "community": 4, - "norm_label": ".__init__()" + "norm_label": "# note: urls verified/updated 2026-03-11:" }, { - "label": ".fetch_news()", + "label": "newsletter_service.py", "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L532", + "source_file": "app/services/newsletter_service.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_news_providers_mediumrssprovider_fetch_news", - "community": 63, - "norm_label": ".fetch_news()" + "id": "app_services_newsletter_service", + "community": 16, + "norm_label": "newsletter_service.py" }, { - "label": "._extract_medium_image()", + "label": "get_newsletter_content()", "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L586", + "source_file": "app/services/newsletter_service.py", + "source_location": "L56", "_origin": "ast", - "id": "app_services_news_providers_mediumrssprovider_extract_medium_image", - "community": 63, - "norm_label": "._extract_medium_image()" + "id": "app_services_newsletter_service_get_newsletter_content", + "community": 16, + "norm_label": "get_newsletter_content()" }, { - "label": "._clean_html()", + "label": "send_scheduled_newsletter()", "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L604", + "source_file": "app/services/newsletter_service.py", + "source_location": "L187", "_origin": "ast", - "id": "app_services_news_providers_mediumrssprovider_clean_html", - "community": 63, - "norm_label": "._clean_html()" + "id": "app_services_newsletter_service_send_scheduled_newsletter", + "community": 16, + "norm_label": "send_scheduled_newsletter()" }, { - "label": "._parse_pub_date()", + "label": "preview_newsletter_content()", "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L611", + "source_file": "app/services/newsletter_service.py", + "source_location": "L318", "_origin": "ast", - "id": "app_services_news_providers_mediumrssprovider_parse_pub_date", - "community": 63, - "norm_label": "._parse_pub_date()" + "id": "app_services_newsletter_service_preview_newsletter_content", + "community": 16, + "norm_label": "preview_newsletter_content()" }, { - "label": "OfficialCloudProvider", - "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L620", + "label": "Newsletter Service Orchestrates newsletter sending with time-based preferences", + "file_type": "rationale", + "source_file": "app/services/newsletter_service.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_news_providers_officialcloudprovider", - "community": 4, - "norm_label": "officialcloudprovider" + "id": "app_services_newsletter_service_rationale_1", + "community": 16, + "norm_label": "newsletter service orchestrates newsletter sending with time-based preferences" }, { - "label": ".__init__()", - "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L627", + "label": "Fetch articles from Appwrite using precise time-windowed application logic.", + "file_type": "rationale", + "source_file": "app/services/newsletter_service.py", + "source_location": "L57", "_origin": "ast", - "id": "app_services_news_providers_officialcloudprovider_init", - "community": 4, - "norm_label": ".__init__()" + "id": "app_services_newsletter_service_rationale_57", + "community": 16, + "norm_label": "fetch articles from appwrite using precise time-windowed application logic." }, { - "label": ".fetch_news()", - "file_type": "code", - "source_file": "app/services/news_providers.py", - "source_location": "L651", + "label": "Main newsletter orchestrator. CRITICAL SAFETY CHECKS: 1. Validat", + "file_type": "rationale", + "source_file": "app/services/newsletter_service.py", + "source_location": "L188", "_origin": "ast", - "id": "app_services_news_providers_officialcloudprovider_fetch_news", - "community": 4, - "norm_label": ".fetch_news()" + "id": "app_services_newsletter_service_rationale_188", + "community": 16, + "norm_label": "main newsletter orchestrator. critical safety checks: 1. validat" }, { - "label": "Abstract base class for news providers", + "label": "Preview newsletter content without sending emails. Useful for testing and d", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L20", + "source_file": "app/services/newsletter_service.py", + "source_location": "L319", "_origin": "ast", - "id": "app_services_news_providers_rationale_20", - "community": 4, - "norm_label": "abstract base class for news providers" + "id": "app_services_newsletter_service_rationale_319", + "community": 16, + "norm_label": "preview newsletter content without sending emails. useful for testing and d" }, { - "label": "Fetch news articles for a given category", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L33", + "label": "optimized_retrieval.py", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_news_providers_rationale_33", - "community": 27, - "norm_label": "fetch news articles for a given category" + "id": "app_services_optimized_retrieval", + "community": 17, + "norm_label": "optimized_retrieval.py" }, { - "label": "Check if provider is available", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L37", + "label": "OptimizedRetrieval", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L28", "_origin": "ast", - "id": "app_services_news_providers_rationale_37", - "community": 4, - "norm_label": "check if provider is available" + "id": "app_services_optimized_retrieval_optimizedretrieval", + "community": 34, + "norm_label": "optimizedretrieval" }, { - "label": "Implement exponential backoff for 429 Too Many Requests", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L47", + "label": ".__init__()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L33", "_origin": "ast", - "id": "app_services_news_providers_rationale_47", - "community": 57, - "norm_label": "implement exponential backoff for 429 too many requests" + "id": "app_services_optimized_retrieval_optimizedretrieval_init", + "community": 34, + "norm_label": ".__init__()" }, { - "label": "Mark provider as rate limited", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L58", + "label": ".get_articles_for_list_view()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L37", "_origin": "ast", - "id": "app_services_news_providers_rationale_58", - "community": 4, - "norm_label": "mark provider as rate limited" + "id": "app_services_optimized_retrieval_optimizedretrieval_get_articles_for_list_view", + "community": 34, + "norm_label": ".get_articles_for_list_view()" }, { - "label": "GNews.io API provider", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L68", + "label": "._fetch_projected_articles()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L94", "_origin": "ast", - "id": "app_services_news_providers_rationale_68", - "community": 4, - "norm_label": "gnews.io api provider" + "id": "app_services_optimized_retrieval_optimizedretrieval_fetch_projected_articles", + "community": 34, + "norm_label": "._fetch_projected_articles()" }, { - "label": "Fetch news from GNews API. Why no 'from'/'to' date filter here?", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L108", + "label": ".get_article_full_details()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L143", "_origin": "ast", - "id": "app_services_news_providers_rationale_108", - "community": 57, - "norm_label": "fetch news from gnews api. why no 'from'/'to' date filter here?" + "id": "app_services_optimized_retrieval_optimizedretrieval_get_article_full_details", + "community": 34, + "norm_label": ".get_article_full_details()" }, { - "label": "Parse GNews API response", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L180", + "label": "._refresh_cache_background()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L188", "_origin": "ast", - "id": "app_services_news_providers_rationale_180", - "community": 27, - "norm_label": "parse gnews api response" + "id": "app_services_optimized_retrieval_optimizedretrieval_refresh_cache_background", + "community": 34, + "norm_label": "._refresh_cache_background()" }, { - "label": "Fetch news from NewsAPI. Phase 20 upgrade: The query string is now bu", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L242", + "label": "._get_collection_for_category()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L201", "_origin": "ast", - "id": "app_services_news_providers_rationale_242", - "community": 57, - "norm_label": "fetch news from newsapi. phase 20 upgrade: the query string is now bu" + "id": "app_services_optimized_retrieval_optimizedretrieval_get_collection_for_category", + "community": 34, + "norm_label": "._get_collection_for_category()" }, { - "label": "Parse NewsAPI response", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L315", + "label": ".invalidate_category_cache()", + "file_type": "code", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L240", "_origin": "ast", - "id": "app_services_news_providers_rationale_315", - "community": 27, - "norm_label": "parse newsapi response" + "id": "app_services_optimized_retrieval_optimizedretrieval_invalidate_category_cache", + "community": 34, + "norm_label": ".invalidate_category_cache()" }, { - "label": "Fetch news from NewsData.io", + "label": "Optimized Retrieval Service - UI Performance Enhancement ======================", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L376", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_news_providers_rationale_376", - "community": 57, - "norm_label": "fetch news from newsdata.io" + "id": "app_services_optimized_retrieval_rationale_1", + "community": 17, + "norm_label": "optimized retrieval service - ui performance enhancement ======================" }, { - "label": "Parse NewsData.io response", + "label": "Optimized article retrieval with multi-tier caching and field projection.", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L422", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L29", "_origin": "ast", - "id": "app_services_news_providers_rationale_422", - "community": 57, - "norm_label": "parse newsdata.io response" + "id": "app_services_optimized_retrieval_rationale_29", + "community": 34, + "norm_label": "optimized article retrieval with multi-tier caching and field projection." }, { - "label": "Google News RSS provider (no API key needed)", + "label": "Get articles optimized for list view (projected fields only).", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L443", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L44", "_origin": "ast", - "id": "app_services_news_providers_rationale_443", - "community": 4, - "norm_label": "google news rss provider (no api key needed)" + "id": "app_services_optimized_retrieval_rationale_44", + "community": 34, + "norm_label": "get articles optimized for list view (projected fields only)." }, { - "label": "Fetch news from Google News RSS", + "label": "Fetch articles from Appwrite with ONLY the fields needed for list view.", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L477", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L100", "_origin": "ast", - "id": "app_services_news_providers_rationale_477", - "community": 57, - "norm_label": "fetch news from google news rss" + "id": "app_services_optimized_retrieval_rationale_100", + "community": 34, + "norm_label": "fetch articles from appwrite with only the fields needed for list view." }, { - "label": "Medium RSS Provider Fetches latest 10 articles per tag. Handles CDATA image", + "label": "Get full article details for article view page. Includes ALL fields (de", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L511", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L144", "_origin": "ast", - "id": "app_services_news_providers_rationale_511", - "community": 63, - "norm_label": "medium rss provider fetches latest 10 articles per tag. handles cdata image" + "id": "app_services_optimized_retrieval_rationale_144", + "community": 34, + "norm_label": "get full article details for article view page. includes all fields (de" }, { - "label": "Fetch and parse Medium RSS feed", + "label": "Background task to refresh cache (SWR pattern).", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L533", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L189", "_origin": "ast", - "id": "app_services_news_providers_rationale_533", - "community": 63, - "norm_label": "fetch and parse medium rss feed" + "id": "app_services_optimized_retrieval_rationale_189", + "community": 34, + "norm_label": "background task to refresh cache (swr pattern)." }, { - "label": "Extracts the first valid image URL from Medium's HTML content. Medium u", + "label": "Determine which Appwrite collection to query. CRITICAL: Must", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L587", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L202", "_origin": "ast", - "id": "app_services_news_providers_rationale_587", - "community": 63, - "norm_label": "extracts the first valid image url from medium's html content. medium u" + "id": "app_services_optimized_retrieval_rationale_202", + "community": 34, + "norm_label": "determine which appwrite collection to query. critical: must" }, { - "label": "Removes HTML tags for a clean description", + "label": "Invalidate cache for a specific category (call after new articles added).", "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L605", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L241", "_origin": "ast", - "id": "app_services_news_providers_rationale_605", - "community": 63, - "norm_label": "removes html tags for a clean description" + "id": "app_services_optimized_retrieval_rationale_241", + "community": 34, + "norm_label": "invalidate cache for a specific category (call after new articles added)." }, { - "label": "Official Cloud Provider RSS Strictly maps categories to specific official b", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L621", + "label": "professional_logger.py", + "file_type": "code", + "source_file": "app/services/professional_logger.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_news_providers_rationale_621", - "community": 4, - "norm_label": "official cloud provider rss strictly maps categories to specific official b" + "id": "app_services_professional_logger", + "community": 14, + "norm_label": "professional_logger.py" }, { - "label": "Fetch news specifically for the requested category", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L652", + "label": "IngestionStats", + "file_type": "code", + "source_file": "app/services/professional_logger.py", + "source_location": "L17", "_origin": "ast", - "id": "app_services_news_providers_rationale_652", - "community": 4, - "norm_label": "fetch news specifically for the requested category" + "id": "app_services_professional_logger_ingestionstats", + "community": 14, + "norm_label": "ingestionstats" }, { - "label": "# NOTE: 'timeframe' is a PAID-tier-only parameter on NewsData.io.", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L386", + "label": ".__init__()", + "file_type": "code", + "source_file": "app/services/professional_logger.py", + "source_location": "L20", "_origin": "ast", - "id": "app_services_news_providers_rationale_386", - "community": 4, - "norm_label": "# note: 'timeframe' is a paid-tier-only parameter on newsdata.io." + "id": "app_services_professional_logger_ingestionstats_init", + "community": 14, + "norm_label": ".__init__()" }, { - "label": "# NOTE: URLs verified/updated 2026-03-11:", - "file_type": "rationale", - "source_file": "app/services/news_providers.py", - "source_location": "L632", + "label": ".reset()", + "file_type": "code", + "source_file": "app/services/professional_logger.py", + "source_location": "L23", "_origin": "ast", - "id": "app_services_news_providers_rationale_632", - "community": 4, - "norm_label": "# note: urls verified/updated 2026-03-11:" + "id": "app_services_professional_logger_ingestionstats_reset", + "community": 14, + "norm_label": ".reset()" }, { - "label": "newsletter_service.py", + "label": ".get_summary()", "file_type": "code", - "source_file": "app/services/newsletter_service.py", - "source_location": "L1", + "source_file": "app/services/professional_logger.py", + "source_location": "L37", "_origin": "ast", - "id": "app_services_newsletter_service", - "community": 17, - "norm_label": "newsletter_service.py" + "id": "app_services_professional_logger_ingestionstats_get_summary", + "community": 14, + "norm_label": ".get_summary()" }, { - "label": "get_newsletter_content()", + "label": "ProfessionalLogger", "file_type": "code", - "source_file": "app/services/newsletter_service.py", - "source_location": "L56", + "source_file": "app/services/professional_logger.py", + "source_location": "L64", "_origin": "ast", - "id": "app_services_newsletter_service_get_newsletter_content", - "community": 17, - "norm_label": "get_newsletter_content()" + "id": "app_services_professional_logger_professionallogger", + "community": 14, + "norm_label": "professionallogger" }, { - "label": "send_scheduled_newsletter()", + "label": ".__init__()", "file_type": "code", - "source_file": "app/services/newsletter_service.py", - "source_location": "L187", + "source_file": "app/services/professional_logger.py", + "source_location": "L67", "_origin": "ast", - "id": "app_services_newsletter_service_send_scheduled_newsletter", - "community": 17, - "norm_label": "send_scheduled_newsletter()" + "id": "app_services_professional_logger_professionallogger_init", + "community": 14, + "norm_label": ".__init__()" }, { - "label": "preview_newsletter_content()", + "label": ".header()", "file_type": "code", - "source_file": "app/services/newsletter_service.py", - "source_location": "L318", + "source_file": "app/services/professional_logger.py", + "source_location": "L70", "_origin": "ast", - "id": "app_services_newsletter_service_preview_newsletter_content", - "community": 17, - "norm_label": "preview_newsletter_content()" + "id": "app_services_professional_logger_professionallogger_header", + "community": 14, + "norm_label": ".header()" }, { - "label": "Newsletter Service Orchestrates newsletter sending with time-based preferences", - "file_type": "rationale", - "source_file": "app/services/newsletter_service.py", - "source_location": "L1", + "label": ".section()", + "file_type": "code", + "source_file": "app/services/professional_logger.py", + "source_location": "L76", "_origin": "ast", - "id": "app_services_newsletter_service_rationale_1", - "community": 17, - "norm_label": "newsletter service orchestrates newsletter sending with time-based preferences" + "id": "app_services_professional_logger_professionallogger_section", + "community": 14, + "norm_label": ".section()" }, { - "label": "Fetch articles from Appwrite using precise time-windowed application logic.", - "file_type": "rationale", - "source_file": "app/services/newsletter_service.py", - "source_location": "L57", + "label": ".metric()", + "file_type": "code", + "source_file": "app/services/professional_logger.py", + "source_location": "L81", "_origin": "ast", - "id": "app_services_newsletter_service_rationale_57", - "community": 17, - "norm_label": "fetch articles from appwrite using precise time-windowed application logic." + "id": "app_services_professional_logger_professionallogger_metric", + "community": 14, + "norm_label": ".metric()" }, { - "label": "Main newsletter orchestrator. CRITICAL SAFETY CHECKS: 1. Validat", - "file_type": "rationale", - "source_file": "app/services/newsletter_service.py", - "source_location": "L188", - "_origin": "ast", - "id": "app_services_newsletter_service_rationale_188", - "community": 17, - "norm_label": "main newsletter orchestrator. critical safety checks: 1. validat" - }, - { - "label": "Preview newsletter content without sending emails. Useful for testing and d", - "file_type": "rationale", - "source_file": "app/services/newsletter_service.py", - "source_location": "L319", - "_origin": "ast", - "id": "app_services_newsletter_service_rationale_319", - "community": 17, - "norm_label": "preview newsletter content without sending emails. useful for testing and d" - }, - { - "label": "optimized_retrieval.py", - "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_optimized_retrieval", - "community": 17, - "norm_label": "optimized_retrieval.py" - }, - { - "label": "OptimizedRetrieval", + "label": ".success()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L28", + "source_file": "app/services/professional_logger.py", + "source_location": "L85", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval", - "community": 34, - "norm_label": "optimizedretrieval" + "id": "app_services_professional_logger_professionallogger_success", + "community": 14, + "norm_label": ".success()" }, { - "label": ".__init__()", + "label": ".warning()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L33", + "source_file": "app/services/professional_logger.py", + "source_location": "L89", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_init", - "community": 34, - "norm_label": ".__init__()" + "id": "app_services_professional_logger_professionallogger_warning", + "community": 14, + "norm_label": ".warning()" }, { - "label": ".get_articles_for_list_view()", + "label": ".error()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L37", + "source_file": "app/services/professional_logger.py", + "source_location": "L93", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_get_articles_for_list_view", - "community": 34, - "norm_label": ".get_articles_for_list_view()" + "id": "app_services_professional_logger_professionallogger_error", + "community": 14, + "norm_label": ".error()" }, { - "label": "._fetch_projected_articles()", + "label": ".space_b_call()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L94", + "source_file": "app/services/professional_logger.py", + "source_location": "L97", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_fetch_projected_articles", - "community": 34, - "norm_label": "._fetch_projected_articles()" + "id": "app_services_professional_logger_professionallogger_space_b_call", + "community": 14, + "norm_label": ".space_b_call()" }, { - "label": ".get_article_full_details()", + "label": ".scheduler_event()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L143", + "source_file": "app/services/professional_logger.py", + "source_location": "L112", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_get_article_full_details", - "community": 34, - "norm_label": ".get_article_full_details()" + "id": "app_services_professional_logger_professionallogger_scheduler_event", + "community": 14, + "norm_label": ".scheduler_event()" }, { - "label": "._refresh_cache_background()", + "label": ".cleaner_event()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L188", + "source_file": "app/services/professional_logger.py", + "source_location": "L121", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_refresh_cache_background", - "community": 34, - "norm_label": "._refresh_cache_background()" + "id": "app_services_professional_logger_professionallogger_cleaner_event", + "community": 14, + "norm_label": ".cleaner_event()" }, { - "label": "._get_collection_for_category()", + "label": ".print_stats()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L201", + "source_file": "app/services/professional_logger.py", + "source_location": "L127", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_get_collection_for_category", - "community": 34, - "norm_label": "._get_collection_for_category()" + "id": "app_services_professional_logger_professionallogger_print_stats", + "community": 14, + "norm_label": ".print_stats()" }, { - "label": ".invalidate_category_cache()", + "label": "get_professional_logger()", "file_type": "code", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L240", + "source_file": "app/services/professional_logger.py", + "source_location": "L159", "_origin": "ast", - "id": "app_services_optimized_retrieval_optimizedretrieval_invalidate_category_cache", - "community": 34, - "norm_label": ".invalidate_category_cache()" + "id": "app_services_professional_logger_get_professional_logger", + "community": 14, + "norm_label": "get_professional_logger()" }, { - "label": "Optimized Retrieval Service - UI Performance Enhancement ======================", + "label": "Professional Logging Module for Segmento Pulse Provides structured logging with", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", + "source_file": "app/services/professional_logger.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_1", - "community": 17, - "norm_label": "optimized retrieval service - ui performance enhancement ======================" + "id": "app_services_professional_logger_rationale_1", + "community": 14, + "norm_label": "professional logging module for segmento pulse provides structured logging with" }, { - "label": "Optimized article retrieval with multi-tier caching and field projection.", + "label": "Track ingestion pipeline statistics", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L29", + "source_file": "app/services/professional_logger.py", + "source_location": "L18", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_29", - "community": 34, - "norm_label": "optimized article retrieval with multi-tier caching and field projection." + "id": "app_services_professional_logger_rationale_18", + "community": 14, + "norm_label": "track ingestion pipeline statistics" }, { - "label": "Get articles optimized for list view (projected fields only).", + "label": "Get formatted statistics summary", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L44", + "source_file": "app/services/professional_logger.py", + "source_location": "L38", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_44", - "community": 34, - "norm_label": "get articles optimized for list view (projected fields only)." + "id": "app_services_professional_logger_rationale_38", + "community": 14, + "norm_label": "get formatted statistics summary" }, { - "label": "Fetch articles from Appwrite with ONLY the fields needed for list view.", + "label": "Enhanced logger with formatted output", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L100", + "source_file": "app/services/professional_logger.py", + "source_location": "L65", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_100", - "community": 34, - "norm_label": "fetch articles from appwrite with only the fields needed for list view." + "id": "app_services_professional_logger_rationale_65", + "community": 14, + "norm_label": "enhanced logger with formatted output" }, { - "label": "Get full article details for article view page. Includes ALL fields (de", + "label": "Log Space B interaction", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L144", + "source_file": "app/services/professional_logger.py", + "source_location": "L98", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_144", - "community": 34, - "norm_label": "get full article details for article view page. includes all fields (de" + "id": "app_services_professional_logger_rationale_98", + "community": 14, + "norm_label": "log space b interaction" }, { - "label": "Background task to refresh cache (SWR pattern).", + "label": "Log scheduler activity", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L189", + "source_file": "app/services/professional_logger.py", + "source_location": "L113", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_189", - "community": 34, - "norm_label": "background task to refresh cache (swr pattern)." + "id": "app_services_professional_logger_rationale_113", + "community": 14, + "norm_label": "log scheduler activity" }, { - "label": "Determine which Appwrite collection to query. CRITICAL: Must", + "label": "Print comprehensive statistics summary", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L202", + "source_file": "app/services/professional_logger.py", + "source_location": "L128", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_202", - "community": 34, - "norm_label": "determine which appwrite collection to query. critical: must" + "id": "app_services_professional_logger_rationale_128", + "community": 14, + "norm_label": "print comprehensive statistics summary" }, { - "label": "Invalidate cache for a specific category (call after new articles added).", + "label": "Get a professional logger instance", "file_type": "rationale", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L241", + "source_file": "app/services/professional_logger.py", + "source_location": "L160", "_origin": "ast", - "id": "app_services_optimized_retrieval_rationale_241", - "community": 34, - "norm_label": "invalidate cache for a specific category (call after new articles added)." + "id": "app_services_professional_logger_rationale_160", + "community": 14, + "norm_label": "get a professional logger instance" }, { - "label": "professional_logger.py", + "label": "__init__.py", "file_type": "code", - "source_file": "app/services/professional_logger.py", + "source_file": "app/services/providers/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_professional_logger", - "community": 14, - "norm_label": "professional_logger.py" + "id": "app_services_providers_init", + "community": 106, + "norm_label": "__init__.py" }, { - "label": "IngestionStats", + "label": "base.py", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L17", + "source_file": "app/services/providers/base.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_professional_logger_ingestionstats", - "community": 14, - "norm_label": "ingestionstats" + "id": "app_services_providers_base", + "community": 9, + "norm_label": "base.py" }, { - "label": ".__init__()", + "label": "ProviderStatus", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L20", + "source_file": "app/services/providers/base.py", + "source_location": "L69", "_origin": "ast", - "id": "app_services_professional_logger_ingestionstats_init", - "community": 14, - "norm_label": ".__init__()" + "id": "app_services_providers_base_providerstatus", + "community": 24, + "norm_label": "providerstatus" }, { - "label": ".reset()", + "label": "NewsProvider", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L23", + "source_file": "app/services/providers/base.py", + "source_location": "L84", "_origin": "ast", - "id": "app_services_professional_logger_ingestionstats_reset", - "community": 14, - "norm_label": ".reset()" + "id": "app_services_providers_base_newsprovider", + "community": 9, + "norm_label": "newsprovider" }, { - "label": ".get_summary()", + "label": ".__init__()", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L37", + "source_file": "app/services/providers/base.py", + "source_location": "L106", "_origin": "ast", - "id": "app_services_professional_logger_ingestionstats_get_summary", - "community": 14, - "norm_label": ".get_summary()" + "id": "app_services_providers_base_newsprovider_init", + "community": 9, + "norm_label": ".__init__()" }, { - "label": "ProfessionalLogger", + "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L64", + "source_file": "app/services/providers/base.py", + "source_location": "L128", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger", - "community": 14, - "norm_label": "professionallogger" + "id": "app_services_providers_base_newsprovider_fetch_news", + "community": 57, + "norm_label": ".fetch_news()" }, { - "label": ".__init__()", + "label": ".is_available()", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L67", + "source_file": "app/services/providers/base.py", + "source_location": "L151", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_init", - "community": 14, - "norm_label": ".__init__()" + "id": "app_services_providers_base_newsprovider_is_available", + "community": 9, + "norm_label": ".is_available()" }, { - "label": ".header()", + "label": ".handle_429()", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L70", + "source_file": "app/services/providers/base.py", + "source_location": "L169", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_header", - "community": 14, - "norm_label": ".header()" + "id": "app_services_providers_base_newsprovider_handle_429", + "community": 9, + "norm_label": ".handle_429()" }, { - "label": ".section()", + "label": ".mark_rate_limited()", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L76", + "source_file": "app/services/providers/base.py", + "source_location": "L191", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_section", - "community": 14, - "norm_label": ".section()" + "id": "app_services_providers_base_newsprovider_mark_rate_limited", + "community": 9, + "norm_label": ".mark_rate_limited()" }, { - "label": ".metric()", + "label": ".reset_daily_quota()", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L81", + "source_file": "app/services/providers/base.py", + "source_location": "L198", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_metric", - "community": 14, - "norm_label": ".metric()" + "id": "app_services_providers_base_newsprovider_reset_daily_quota", + "community": 9, + "norm_label": ".reset_daily_quota()" }, { - "label": ".success()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L85", + "label": "Represents the health of a provider at any given moment. ACTIVE \u2192 P", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L70", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_success", - "community": 14, - "norm_label": ".success()" + "id": "app_services_providers_base_rationale_70", + "community": 24, + "norm_label": "represents the health of a provider at any given moment. active \u2192 p" }, { - "label": ".warning()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L89", + "label": "The contract that every news provider must follow. Subclass this, impleme", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L85", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_warning", - "community": 14, - "norm_label": ".warning()" + "id": "app_services_providers_base_rationale_85", + "community": 9, + "norm_label": "the contract that every news provider must follow. subclass this, impleme" }, { - "label": ".error()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L93", + "label": "REQUIRED: Fetch news articles for the given category. Args:", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L129", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_error", - "community": 14, - "norm_label": ".error()" + "id": "app_services_providers_base_rationale_129", + "community": 57, + "norm_label": "required: fetch news articles for the given category. args:" }, { - "label": ".space_b_call()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L97", + "label": "Check if this provider is ready to accept a fetch request. Returns Fa", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L152", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_space_b_call", - "community": 14, - "norm_label": ".space_b_call()" + "id": "app_services_providers_base_rationale_152", + "community": 9, + "norm_label": "check if this provider is ready to accept a fetch request. returns fa" }, { - "label": ".scheduler_event()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L112", + "label": "Task 4: Implement exponential backoff for 429 (Too Many Requests). Inst", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L170", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_scheduler_event", - "community": 14, - "norm_label": ".scheduler_event()" + "id": "app_services_providers_base_rationale_170", + "community": 9, + "norm_label": "task 4: implement exponential backoff for 429 (too many requests). inst" }, { - "label": ".cleaner_event()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L121", + "label": "Call this when the API returns a 429 (Too Many Requests). The status ch", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L192", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_cleaner_event", - "community": 14, - "norm_label": ".cleaner_event()" + "id": "app_services_providers_base_rationale_192", + "community": 9, + "norm_label": "call this when the api returns a 429 (too many requests). the status ch" }, { - "label": ".print_stats()", - "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L127", + "label": "Reset this provider's call counter back to zero. Called once per day (m", + "file_type": "rationale", + "source_file": "app/services/providers/base.py", + "source_location": "L199", "_origin": "ast", - "id": "app_services_professional_logger_professionallogger_print_stats", - "community": 14, - "norm_label": ".print_stats()" + "id": "app_services_providers_base_rationale_199", + "community": 9, + "norm_label": "reset this provider's call counter back to zero. called once per day (m" }, { - "label": "get_professional_logger()", + "label": "__init__.py", "file_type": "code", - "source_file": "app/services/professional_logger.py", - "source_location": "L159", + "source_file": "app/services/providers/direct_rss/__init__.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_professional_logger_get_professional_logger", - "community": 14, - "norm_label": "get_professional_logger()" + "id": "app_services_providers_direct_rss_init", + "community": 104, + "norm_label": "__init__.py" }, { - "label": "Professional Logging Module for Segmento Pulse Provides structured logging with", - "file_type": "rationale", - "source_file": "app/services/professional_logger.py", + "label": "client.py", + "file_type": "code", + "source_file": "app/services/providers/direct_rss/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_professional_logger_rationale_1", - "community": 14, - "norm_label": "professional logging module for segmento pulse provides structured logging with" + "id": "app_services_providers_direct_rss_client", + "community": 9, + "norm_label": "client.py" }, { - "label": "Track ingestion pipeline statistics", - "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L18", + "label": "DirectRSSProvider", + "file_type": "code", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L89", "_origin": "ast", - "id": "app_services_professional_logger_rationale_18", - "community": 14, - "norm_label": "track ingestion pipeline statistics" + "id": "app_services_providers_direct_rss_client_directrssprovider", + "community": 9, + "norm_label": "directrssprovider" }, { - "label": "Get formatted statistics summary", - "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L38", + "label": "NewsProvider", + "file_type": "code", + "source_file": "", + "source_location": "", "_origin": "ast", - "id": "app_services_professional_logger_rationale_38", - "community": 14, - "norm_label": "get formatted statistics summary" + "id": "newsprovider", + "community": 77, + "norm_label": "newsprovider" }, { - "label": "Enhanced logger with formatted output", - "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L65", + "label": ".__init__()", + "file_type": "code", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L102", "_origin": "ast", - "id": "app_services_professional_logger_rationale_65", - "community": 14, - "norm_label": "enhanced logger with formatted output" + "id": "app_services_providers_direct_rss_client_directrssprovider_init", + "community": 9, + "norm_label": ".__init__()" }, { - "label": "Log Space B interaction", - "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L98", + "label": ".fetch_news()", + "file_type": "code", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L141", "_origin": "ast", - "id": "app_services_professional_logger_rationale_98", - "community": 14, - "norm_label": "log space b interaction" + "id": "app_services_providers_direct_rss_client_directrssprovider_fetch_news", + "community": 84, + "norm_label": ".fetch_news()" }, { - "label": "Log scheduler activity", + "label": "._fetch_and_parse_feed()", + "file_type": "code", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L242", + "_origin": "ast", + "id": "app_services_providers_direct_rss_client_directrssprovider_fetch_and_parse_feed", + "community": 84, + "norm_label": "._fetch_and_parse_feed()" + }, + { + "label": "AsyncClient", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "id": "app_services_providers_direct_rss_client_py_asyncclient", + "community": 84, + "norm_label": "asyncclient" + }, + { + "label": "._parse_feed_xml()", + "file_type": "code", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L292", + "_origin": "ast", + "id": "app_services_providers_direct_rss_client_directrssprovider_parse_feed_xml", + "community": 84, + "norm_label": "._parse_feed_xml()" + }, + { + "label": "providers/direct_rss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L113", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_professional_logger_rationale_113", - "community": 14, - "norm_label": "log scheduler activity" + "id": "app_services_providers_direct_rss_client_rationale_1", + "community": 9, + "norm_label": "providers/direct_rss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "Print comprehensive statistics summary", + "label": "Fetches articles directly from the RSS feeds of premium tech publications.", "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L128", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L90", "_origin": "ast", - "id": "app_services_professional_logger_rationale_128", - "community": 14, - "norm_label": "print comprehensive statistics summary" + "id": "app_services_providers_direct_rss_client_rationale_90", + "community": 9, + "norm_label": "fetches articles directly from the rss feeds of premium tech publications." }, { - "label": "Get a professional logger instance", + "label": "Fetch articles from all premium tech RSS feeds concurrently. Args:", "file_type": "rationale", - "source_file": "app/services/professional_logger.py", - "source_location": "L160", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L142", "_origin": "ast", - "id": "app_services_professional_logger_rationale_160", - "community": 14, - "norm_label": "get a professional logger instance" + "id": "app_services_providers_direct_rss_client_rationale_142", + "community": 84, + "norm_label": "fetch articles from all premium tech rss feeds concurrently. args:" }, { - "label": "__init__.py", - "file_type": "code", - "source_file": "app/services/providers/__init__.py", - "source_location": "L1", + "label": "Fetch one RSS feed URL and parse it into Article objects. Args:", + "file_type": "rationale", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L249", "_origin": "ast", - "id": "app_services_providers_init", - "community": 106, - "norm_label": "__init__.py" + "id": "app_services_providers_direct_rss_client_rationale_249", + "community": 84, + "norm_label": "fetch one rss feed url and parse it into article objects. args:" }, { - "label": "base.py", + "label": "Parse raw XML text from a feed into a list of Article objects. Uses f", + "file_type": "rationale", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L298", + "_origin": "ast", + "id": "app_services_providers_direct_rss_client_rationale_298", + "community": 84, + "norm_label": "parse raw xml text from a feed into a list of article objects. uses f" + }, + { + "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/base.py", + "source_file": "app/services/providers/hackernews/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_base", - "community": 9, - "norm_label": "base.py" + "id": "app_services_providers_hackernews_init", + "community": 105, + "norm_label": "__init__.py" }, { - "label": "ProviderStatus", + "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L69", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_base_providerstatus", + "id": "app_services_providers_hackernews_client", "community": 9, - "norm_label": "providerstatus" + "norm_label": "client.py" }, { - "label": "NewsProvider", + "label": "HackerNewsProvider", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L84", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L70", "_origin": "ast", - "id": "app_services_providers_base_newsprovider", - "community": 9, - "norm_label": "newsprovider" + "id": "app_services_providers_hackernews_client_hackernewsprovider", + "community": 39, + "norm_label": "hackernewsprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L106", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L81", "_origin": "ast", - "id": "app_services_providers_base_newsprovider_init", - "community": 9, + "id": "app_services_providers_hackernews_client_hackernewsprovider_init", + "community": 39, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L128", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L92", "_origin": "ast", - "id": "app_services_providers_base_newsprovider_fetch_news", - "community": 27, + "id": "app_services_providers_hackernews_client_hackernewsprovider_fetch_news", + "community": 39, "norm_label": ".fetch_news()" }, { - "label": ".is_available()", + "label": "._fetch_top_ids()", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L151", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L159", "_origin": "ast", - "id": "app_services_providers_base_newsprovider_is_available", - "community": 9, - "norm_label": ".is_available()" + "id": "app_services_providers_hackernews_client_hackernewsprovider_fetch_top_ids", + "community": 39, + "norm_label": "._fetch_top_ids()" }, { - "label": ".handle_429()", + "label": "AsyncClient", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L169", + "source_file": "", + "source_location": "", "_origin": "ast", - "id": "app_services_providers_base_newsprovider_handle_429", - "community": 9, - "norm_label": ".handle_429()" + "id": "app_services_providers_hackernews_client_py_asyncclient", + "community": 39, + "norm_label": "asyncclient" }, { - "label": ".mark_rate_limited()", + "label": "._fetch_single_item()", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L191", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L192", "_origin": "ast", - "id": "app_services_providers_base_newsprovider_mark_rate_limited", - "community": 9, - "norm_label": ".mark_rate_limited()" + "id": "app_services_providers_hackernews_client_hackernewsprovider_fetch_single_item", + "community": 39, + "norm_label": "._fetch_single_item()" }, { - "label": ".reset_daily_quota()", + "label": "._map_items_to_articles()", "file_type": "code", - "source_file": "app/services/providers/base.py", - "source_location": "L198", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L228", "_origin": "ast", - "id": "app_services_providers_base_newsprovider_reset_daily_quota", - "community": 9, - "norm_label": ".reset_daily_quota()" + "id": "app_services_providers_hackernews_client_hackernewsprovider_map_items_to_articles", + "community": 39, + "norm_label": "._map_items_to_articles()" }, { - "label": "Represents the health of a provider at any given moment. ACTIVE \u2192 P", - "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L70", + "label": "._enrich_article_images()", + "file_type": "code", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L322", "_origin": "ast", - "id": "app_services_providers_base_rationale_70", - "community": 9, - "norm_label": "represents the health of a provider at any given moment. active \u2192 p" + "id": "app_services_providers_hackernews_client_hackernewsprovider_enrich_article_images", + "community": 39, + "norm_label": "._enrich_article_images()" }, { - "label": "The contract that every news provider must follow. Subclass this, impleme", + "label": "providers/hackernews/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L85", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_base_rationale_85", + "id": "app_services_providers_hackernews_client_rationale_1", "community": 9, - "norm_label": "the contract that every news provider must follow. subclass this, impleme" + "norm_label": "providers/hackernews/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "REQUIRED: Fetch news articles for the given category. Args:", + "label": "Fetches top stories from the Hacker News API. No API key needed. No rate", "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L129", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L71", "_origin": "ast", - "id": "app_services_providers_base_rationale_129", - "community": 27, - "norm_label": "required: fetch news articles for the given category. args:" + "id": "app_services_providers_hackernews_client_rationale_71", + "community": 39, + "norm_label": "fetches top stories from the hacker news api. no api key needed. no rate" }, { - "label": "Check if this provider is ready to accept a fetch request. Returns Fa", + "label": "Fetch the top stories from Hacker News. Args: category (", "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L152", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L93", "_origin": "ast", - "id": "app_services_providers_base_rationale_152", - "community": 9, - "norm_label": "check if this provider is ready to accept a fetch request. returns fa" + "id": "app_services_providers_hackernews_client_rationale_93", + "community": 39, + "norm_label": "fetch the top stories from hacker news. args: category (" }, { - "label": "Task 4: Implement exponential backoff for 429 (Too Many Requests). Inst", + "label": "Step 1: Ask Hacker News for the IDs of its top stories. Returns a lis", "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L170", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L160", "_origin": "ast", - "id": "app_services_providers_base_rationale_170", - "community": 9, - "norm_label": "task 4: implement exponential backoff for 429 (too many requests). inst" + "id": "app_services_providers_hackernews_client_rationale_160", + "community": 39, + "norm_label": "step 1: ask hacker news for the ids of its top stories. returns a lis" }, { - "label": "Call this when the API returns a 429 (Too Many Requests). The status ch", + "label": "Step 2 (single unit): Fetch the details for one Hacker News story. Ar", "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L192", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L195", "_origin": "ast", - "id": "app_services_providers_base_rationale_192", - "community": 9, - "norm_label": "call this when the api returns a 429 (too many requests). the status ch" + "id": "app_services_providers_hackernews_client_rationale_195", + "community": 39, + "norm_label": "step 2 (single unit): fetch the details for one hacker news story. ar" }, { - "label": "Reset this provider's call counter back to zero. Called once per day (m", + "label": "Convert raw Hacker News JSON items into Segmento Pulse Article objects.", "file_type": "rationale", - "source_file": "app/services/providers/base.py", - "source_location": "L199", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L231", "_origin": "ast", - "id": "app_services_providers_base_rationale_199", - "community": 9, - "norm_label": "reset this provider's call counter back to zero. called once per day (m" + "id": "app_services_providers_hackernews_client_rationale_231", + "community": 39, + "norm_label": "convert raw hacker news json items into segmento pulse article objects." + }, + { + "label": "For every article that has an empty image_url, visit its URL and try to", + "file_type": "rationale", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L323", + "_origin": "ast", + "id": "app_services_providers_hackernews_client_rationale_323", + "community": 39, + "norm_label": "for every article that has an empty image_url, visit its url and try to" }, { "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/direct_rss/__init__.py", + "source_file": "app/services/providers/inshorts/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_direct_rss_init", - "community": 104, + "id": "app_services_providers_inshorts_init", + "community": 107, "norm_label": "__init__.py" }, { "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/direct_rss/client.py", + "source_file": "app/services/providers/inshorts/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_direct_rss_client", - "community": 4, + "id": "app_services_providers_inshorts_client", + "community": 9, "norm_label": "client.py" }, { - "label": "DirectRSSProvider", - "file_type": "code", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L89", - "_origin": "ast", - "id": "app_services_providers_direct_rss_client_directrssprovider", - "community": 27, - "norm_label": "directrssprovider" - }, - { - "label": "NewsProvider", + "label": "InshortsProvider", "file_type": "code", - "source_file": "", - "source_location": "", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L71", "_origin": "ast", - "id": "newsprovider", - "community": 24, - "norm_label": "newsprovider" + "id": "app_services_providers_inshorts_client_inshortsprovider", + "community": 77, + "norm_label": "inshortsprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L102", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L83", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_directrssprovider_init", - "community": 27, + "id": "app_services_providers_inshorts_client_inshortsprovider_init", + "community": 77, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L141", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L113", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_directrssprovider_fetch_news", - "community": 27, + "id": "app_services_providers_inshorts_client_inshortsprovider_fetch_news", + "community": 77, "norm_label": ".fetch_news()" }, { - "label": "._fetch_and_parse_feed()", - "file_type": "code", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L242", - "_origin": "ast", - "id": "app_services_providers_direct_rss_client_directrssprovider_fetch_and_parse_feed", - "community": 27, - "norm_label": "._fetch_and_parse_feed()" - }, - { - "label": "AsyncClient", + "label": "._parse_inshorts_date()", "file_type": "code", - "source_file": "", - "source_location": "", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L230", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_py_asyncclient", - "community": 27, - "norm_label": "asyncclient" + "id": "app_services_providers_inshorts_client_inshortsprovider_parse_inshorts_date", + "community": 77, + "norm_label": "._parse_inshorts_date()" }, { - "label": "._parse_feed_xml()", + "label": "._map_articles()", "file_type": "code", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L292", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L288", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_directrssprovider_parse_feed_xml", - "community": 27, - "norm_label": "._parse_feed_xml()" + "id": "app_services_providers_inshorts_client_inshortsprovider_map_articles", + "community": 77, + "norm_label": "._map_articles()" }, { - "label": "providers/direct_rss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", + "label": "providers/inshorts/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "file_type": "rationale", - "source_file": "app/services/providers/direct_rss/client.py", + "source_file": "app/services/providers/inshorts/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_rationale_1", - "community": 4, - "norm_label": "providers/direct_rss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" + "id": "app_services_providers_inshorts_client_rationale_1", + "community": 9, + "norm_label": "providers/inshorts/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "Fetches articles directly from the RSS feeds of premium tech publications.", + "label": "Fetches 60-word technology summaries from the Inshorts community API. Fre", "file_type": "rationale", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L90", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L72", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_rationale_90", - "community": 27, - "norm_label": "fetches articles directly from the rss feeds of premium tech publications." + "id": "app_services_providers_inshorts_client_rationale_72", + "community": 77, + "norm_label": "fetches 60-word technology summaries from the inshorts community api. fre" }, { - "label": "Fetch articles from all premium tech RSS feeds concurrently. Args:", + "label": "Fetch technology articles from the Inshorts community API. Args:", "file_type": "rationale", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L142", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L114", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_rationale_142", - "community": 27, - "norm_label": "fetch articles from all premium tech rss feeds concurrently. args:" + "id": "app_services_providers_inshorts_client_rationale_114", + "community": 77, + "norm_label": "fetch technology articles from the inshorts community api. args:" }, { - "label": "Fetch one RSS feed URL and parse it into Article objects. Args:", + "label": "Solve the split date/time problem. Inshorts gives us date and time as", "file_type": "rationale", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L249", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L231", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_rationale_249", - "community": 27, - "norm_label": "fetch one rss feed url and parse it into article objects. args:" + "id": "app_services_providers_inshorts_client_rationale_231", + "community": 77, + "norm_label": "solve the split date/time problem. inshorts gives us date and time as" }, { - "label": "Parse raw XML text from a feed into a list of Article objects. Uses f", + "label": "Convert raw Inshorts JSON items into Segmento Pulse Article objects.", "file_type": "rationale", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L298", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L289", "_origin": "ast", - "id": "app_services_providers_direct_rss_client_rationale_298", - "community": 27, - "norm_label": "parse raw xml text from a feed into a list of article objects. uses f" + "id": "app_services_providers_inshorts_client_rationale_289", + "community": 77, + "norm_label": "convert raw inshorts json items into segmento pulse article objects." }, { "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/hackernews/__init__.py", + "source_file": "app/services/providers/openrss/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_hackernews_init", - "community": 105, + "id": "app_services_providers_openrss_init", + "community": 108, "norm_label": "__init__.py" }, { "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", + "source_file": "app/services/providers/openrss/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_hackernews_client", + "id": "app_services_providers_openrss_client", "community": 9, "norm_label": "client.py" }, { - "label": "HackerNewsProvider", + "label": "OpenRSSProvider", "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L70", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L116", "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider", - "community": 39, - "norm_label": "hackernewsprovider" + "id": "app_services_providers_openrss_client_openrssprovider", + "community": 77, + "norm_label": "openrssprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L81", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L129", "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider_init", - "community": 39, + "id": "app_services_providers_openrss_client_openrssprovider_init", + "community": 77, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L92", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L149", "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider_fetch_news", - "community": 39, + "id": "app_services_providers_openrss_client_openrssprovider_fetch_news", + "community": 26, "norm_label": ".fetch_news()" }, { - "label": "._fetch_top_ids()", + "label": "._fetch_and_parse_feed()", "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L159", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L247", "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider_fetch_top_ids", - "community": 39, - "norm_label": "._fetch_top_ids()" + "id": "app_services_providers_openrss_client_openrssprovider_fetch_and_parse_feed", + "community": 26, + "norm_label": "._fetch_and_parse_feed()" }, { "label": "AsyncClient", @@ -6319,775 +6269,485 @@ "source_file": "", "source_location": "", "_origin": "ast", - "id": "app_services_providers_hackernews_client_py_asyncclient", - "community": 39, + "id": "app_services_providers_openrss_client_py_asyncclient", + "community": 26, "norm_label": "asyncclient" }, { - "label": "._fetch_single_item()", - "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L192", - "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider_fetch_single_item", - "community": 39, - "norm_label": "._fetch_single_item()" - }, - { - "label": "._map_items_to_articles()", - "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L228", - "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider_map_items_to_articles", - "community": 39, - "norm_label": "._map_items_to_articles()" - }, - { - "label": "._enrich_article_images()", + "label": "._parse_feed_xml()", "file_type": "code", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L322", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L301", "_origin": "ast", - "id": "app_services_providers_hackernews_client_hackernewsprovider_enrich_article_images", - "community": 39, - "norm_label": "._enrich_article_images()" + "id": "app_services_providers_openrss_client_openrssprovider_parse_feed_xml", + "community": 77, + "norm_label": "._parse_feed_xml()" }, { - "label": "providers/hackernews/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", + "label": "providers/openrss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", + "source_file": "app/services/providers/openrss/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_1", + "id": "app_services_providers_openrss_client_rationale_1", "community": 9, - "norm_label": "providers/hackernews/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" - }, - { - "label": "Fetches top stories from the Hacker News API. No API key needed. No rate", - "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L71", - "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_71", - "community": 39, - "norm_label": "fetches top stories from the hacker news api. no api key needed. no rate" - }, - { - "label": "Fetch the top stories from Hacker News. Args: category (", - "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L93", - "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_93", - "community": 39, - "norm_label": "fetch the top stories from hacker news. args: category (" + "norm_label": "providers/openrss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "Step 1: Ask Hacker News for the IDs of its top stories. Returns a lis", + "label": "Fetches RSS feeds from dev.to, Hashnode, and GitHub Blog via OpenRSS.org.", "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L160", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L117", "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_160", - "community": 39, - "norm_label": "step 1: ask hacker news for the ids of its top stories. returns a lis" + "id": "app_services_providers_openrss_client_rationale_117", + "community": 77, + "norm_label": "fetches rss feeds from dev.to, hashnode, and github blog via openrss.org." }, { - "label": "Step 2 (single unit): Fetch the details for one Hacker News story. Ar", + "label": "Fetch articles from all OpenRSS feeds \u2014 but only if 60 minutes have pas", "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L195", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L150", "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_195", - "community": 39, - "norm_label": "step 2 (single unit): fetch the details for one hacker news story. ar" + "id": "app_services_providers_openrss_client_rationale_150", + "community": 26, + "norm_label": "fetch articles from all openrss feeds \u2014 but only if 60 minutes have pas" }, { - "label": "Convert raw Hacker News JSON items into Segmento Pulse Article objects.", + "label": "Fetch one OpenRSS feed URL and parse its XML into Article objects. Ar", "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L231", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L254", "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_231", - "community": 39, - "norm_label": "convert raw hacker news json items into segmento pulse article objects." + "id": "app_services_providers_openrss_client_rationale_254", + "community": 26, + "norm_label": "fetch one openrss feed url and parse its xml into article objects. ar" }, { - "label": "For every article that has an empty image_url, visit its URL and try to", + "label": "Parse raw XML from an OpenRSS feed into Article objects. Uses feedpar", "file_type": "rationale", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L323", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L307", "_origin": "ast", - "id": "app_services_providers_hackernews_client_rationale_323", - "community": 39, - "norm_label": "for every article that has an empty image_url, visit its url and try to" + "id": "app_services_providers_openrss_client_rationale_307", + "community": 77, + "norm_label": "parse raw xml from an openrss feed into article objects. uses feedpar" }, { "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/inshorts/__init__.py", + "source_file": "app/services/providers/sauravkanchan/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_inshorts_init", - "community": 107, + "id": "app_services_providers_sauravkanchan_init", + "community": 109, "norm_label": "__init__.py" }, { "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/inshorts/client.py", + "source_file": "app/services/providers/sauravkanchan/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_inshorts_client", + "id": "app_services_providers_sauravkanchan_client", "community": 9, "norm_label": "client.py" }, { - "label": "InshortsProvider", + "label": "SauravKanchanProvider", "file_type": "code", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L71", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L86", "_origin": "ast", - "id": "app_services_providers_inshorts_client_inshortsprovider", - "community": 77, - "norm_label": "inshortsprovider" + "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider", + "community": 6, + "norm_label": "sauravkanchanprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L83", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L99", "_origin": "ast", - "id": "app_services_providers_inshorts_client_inshortsprovider_init", - "community": 77, + "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_init", + "community": 6, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L113", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L128", "_origin": "ast", - "id": "app_services_providers_inshorts_client_inshortsprovider_fetch_news", - "community": 77, + "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_news", + "community": 6, "norm_label": ".fetch_news()" }, { - "label": "._parse_inshorts_date()", + "label": "._fetch_single_region()", "file_type": "code", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L230", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L214", "_origin": "ast", - "id": "app_services_providers_inshorts_client_inshortsprovider_parse_inshorts_date", - "community": 77, - "norm_label": "._parse_inshorts_date()" + "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_single_region", + "community": 6, + "norm_label": "._fetch_single_region()" + }, + { + "label": "AsyncClient", + "file_type": "code", + "source_file": "", + "source_location": "", + "_origin": "ast", + "id": "app_services_providers_sauravkanchan_client_py_asyncclient", + "community": 6, + "norm_label": "asyncclient" }, { "label": "._map_articles()", "file_type": "code", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L288", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L286", "_origin": "ast", - "id": "app_services_providers_inshorts_client_inshortsprovider_map_articles", - "community": 77, + "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_map_articles", + "community": 6, "norm_label": "._map_articles()" }, { - "label": "providers/inshorts/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", + "label": "providers/sauravkanchan/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "file_type": "rationale", - "source_file": "app/services/providers/inshorts/client.py", + "source_file": "app/services/providers/sauravkanchan/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_inshorts_client_rationale_1", + "id": "app_services_providers_sauravkanchan_client_rationale_1", "community": 9, - "norm_label": "providers/inshorts/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" + "norm_label": "providers/sauravkanchan/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "Fetches 60-word technology summaries from the Inshorts community API. Fre", + "label": "Reads top tech headlines from two static JSON files on GitHub Pages. Cove", "file_type": "rationale", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L72", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L87", "_origin": "ast", - "id": "app_services_providers_inshorts_client_rationale_72", - "community": 77, - "norm_label": "fetches 60-word technology summaries from the inshorts community api. fre" + "id": "app_services_providers_sauravkanchan_client_rationale_87", + "community": 6, + "norm_label": "reads top tech headlines from two static json files on github pages. cove" }, { - "label": "Fetch technology articles from the Inshorts community API. Args:", + "label": "Fetch tech headlines from the India and US static JSON files. Both fi", "file_type": "rationale", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L114", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L129", "_origin": "ast", - "id": "app_services_providers_inshorts_client_rationale_114", - "community": 77, - "norm_label": "fetch technology articles from the inshorts community api. args:" + "id": "app_services_providers_sauravkanchan_client_rationale_129", + "community": 6, + "norm_label": "fetch tech headlines from the india and us static json files. both fi" }, { - "label": "Solve the split date/time problem. Inshorts gives us date and time as", + "label": "Download one regional JSON file and parse its articles. Args:", "file_type": "rationale", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L231", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L221", "_origin": "ast", - "id": "app_services_providers_inshorts_client_rationale_231", - "community": 77, - "norm_label": "solve the split date/time problem. inshorts gives us date and time as" + "id": "app_services_providers_sauravkanchan_client_rationale_221", + "community": 6, + "norm_label": "download one regional json file and parse its articles. args:" }, { - "label": "Convert raw Inshorts JSON items into Segmento Pulse Article objects.", + "label": "Convert raw NewsAPI-format JSON items into Segmento Pulse Article objects.", "file_type": "rationale", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L289", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L292", "_origin": "ast", - "id": "app_services_providers_inshorts_client_rationale_289", - "community": 77, - "norm_label": "convert raw inshorts json items into segmento pulse article objects." + "id": "app_services_providers_sauravkanchan_client_rationale_292", + "community": 6, + "norm_label": "convert raw newsapi-format json items into segmento pulse article objects." }, { "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/openrss/__init__.py", + "source_file": "app/services/providers/thenewsapi/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_openrss_init", - "community": 108, + "id": "app_services_providers_thenewsapi_init", + "community": 111, "norm_label": "__init__.py" }, { "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/openrss/client.py", + "source_file": "app/services/providers/thenewsapi/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_openrss_client", - "community": 4, + "id": "app_services_providers_thenewsapi_client", + "community": 24, "norm_label": "client.py" }, { - "label": "OpenRSSProvider", + "label": "TheNewsAPIProvider", "file_type": "code", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L116", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L77", "_origin": "ast", - "id": "app_services_providers_openrss_client_openrssprovider", - "community": 4, - "norm_label": "openrssprovider" + "id": "app_services_providers_thenewsapi_client_thenewsapiprovider", + "community": 24, + "norm_label": "thenewsapiprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L129", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L90", "_origin": "ast", - "id": "app_services_providers_openrss_client_openrssprovider_init", - "community": 4, + "id": "app_services_providers_thenewsapi_client_thenewsapiprovider_init", + "community": 24, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L149", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L140", "_origin": "ast", - "id": "app_services_providers_openrss_client_openrssprovider_fetch_news", - "community": 26, + "id": "app_services_providers_thenewsapi_client_thenewsapiprovider_fetch_news", + "community": 24, "norm_label": ".fetch_news()" }, { - "label": "._fetch_and_parse_feed()", + "label": "._map_articles()", "file_type": "code", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L247", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L257", "_origin": "ast", - "id": "app_services_providers_openrss_client_openrssprovider_fetch_and_parse_feed", - "community": 26, - "norm_label": "._fetch_and_parse_feed()" + "id": "app_services_providers_thenewsapi_client_thenewsapiprovider_map_articles", + "community": 24, + "norm_label": "._map_articles()" }, { - "label": "AsyncClient", - "file_type": "code", - "source_file": "", - "source_location": "", + "label": "providers/thenewsapi/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", + "file_type": "rationale", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_openrss_client_py_asyncclient", - "community": 26, - "norm_label": "asyncclient" - }, - { - "label": "._parse_feed_xml()", - "file_type": "code", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L301", - "_origin": "ast", - "id": "app_services_providers_openrss_client_openrssprovider_parse_feed_xml", - "community": 26, - "norm_label": "._parse_feed_xml()" - }, - { - "label": "providers/openrss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", - "file_type": "rationale", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_openrss_client_rationale_1", - "community": 4, - "norm_label": "providers/openrss/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" + "id": "app_services_providers_thenewsapi_client_rationale_1", + "community": 24, + "norm_label": "providers/thenewsapi/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "Fetches RSS feeds from dev.to, Hashnode, and GitHub Blog via OpenRSS.org.", + "label": "Fetches technology news from TheNewsAPI.com. Paid provider \u2014 needs THENEW", "file_type": "rationale", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L117", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L78", "_origin": "ast", - "id": "app_services_providers_openrss_client_rationale_117", - "community": 4, - "norm_label": "fetches rss feeds from dev.to, hashnode, and github blog via openrss.org." + "id": "app_services_providers_thenewsapi_client_rationale_78", + "community": 24, + "norm_label": "fetches technology news from thenewsapi.com. paid provider \u2014 needs thenew" }, { - "label": "Fetch articles from all OpenRSS feeds \u2014 but only if 60 minutes have pas", + "label": "Fetch technology articles from TheNewsAPI.com. Args: cat", "file_type": "rationale", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L150", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L141", "_origin": "ast", - "id": "app_services_providers_openrss_client_rationale_150", - "community": 26, - "norm_label": "fetch articles from all openrss feeds \u2014 but only if 60 minutes have pas" + "id": "app_services_providers_thenewsapi_client_rationale_141", + "community": 24, + "norm_label": "fetch technology articles from thenewsapi.com. args: cat" }, { - "label": "Fetch one OpenRSS feed URL and parse its XML into Article objects. Ar", + "label": "Convert TheNewsAPI JSON items into Segmento Pulse Article objects. Th", "file_type": "rationale", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L254", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L258", "_origin": "ast", - "id": "app_services_providers_openrss_client_rationale_254", - "community": 26, - "norm_label": "fetch one openrss feed url and parse its xml into article objects. ar" + "id": "app_services_providers_thenewsapi_client_rationale_258", + "community": 24, + "norm_label": "convert thenewsapi json items into segmento pulse article objects. th" }, { - "label": "Parse raw XML from an OpenRSS feed into Article objects. Uses feedpar", + "label": "# NOTE: We deliberately do NOT add 'published_after' or", "file_type": "rationale", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L307", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L191", "_origin": "ast", - "id": "app_services_providers_openrss_client_rationale_307", - "community": 26, - "norm_label": "parse raw xml from an openrss feed into article objects. uses feedpar" + "id": "app_services_providers_thenewsapi_client_rationale_191", + "community": 24, + "norm_label": "# note: we deliberately do not add 'published_after' or" }, { "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/__init__.py", + "source_file": "app/services/providers/webz/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_init", - "community": 109, + "id": "app_services_providers_webz_init", + "community": 112, "norm_label": "__init__.py" }, { "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/client.py", + "source_file": "app/services/providers/webz/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client", - "community": 9, + "id": "app_services_providers_webz_client", + "community": 24, "norm_label": "client.py" }, { - "label": "SauravKanchanProvider", + "label": "WebzProvider", "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L86", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L139", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider", - "community": 6, - "norm_label": "sauravkanchanprovider" + "id": "app_services_providers_webz_client_webzprovider", + "community": 57, + "norm_label": "webzprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L99", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L153", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_init", - "community": 6, + "id": "app_services_providers_webz_client_webzprovider_init", + "community": 57, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L128", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L165", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_news", - "community": 6, + "id": "app_services_providers_webz_client_webzprovider_fetch_news", + "community": 57, "norm_label": ".fetch_news()" }, - { - "label": "._fetch_single_region()", - "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L214", - "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_single_region", - "community": 6, - "norm_label": "._fetch_single_region()" - }, - { - "label": "AsyncClient", - "file_type": "code", - "source_file": "", - "source_location": "", - "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_py_asyncclient", - "community": 6, - "norm_label": "asyncclient" - }, { "label": "._map_articles()", "file_type": "code", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L286", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L320", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_map_articles", - "community": 6, + "id": "app_services_providers_webz_client_webzprovider_map_articles", + "community": 57, "norm_label": "._map_articles()" }, { - "label": "providers/sauravkanchan/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", + "label": "providers/webz/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", "file_type": "rationale", - "source_file": "app/services/providers/sauravkanchan/client.py", + "source_file": "app/services/providers/webz/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_rationale_1", - "community": 9, - "norm_label": "providers/sauravkanchan/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" + "id": "app_services_providers_webz_client_rationale_1", + "community": 24, + "norm_label": "providers/webz/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { - "label": "Reads top tech headlines from two static JSON files on GitHub Pages. Cove", + "label": "Fetches enterprise-grade news articles from Webz.io News API Lite. Paid p", "file_type": "rationale", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L87", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L140", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_rationale_87", - "community": 6, - "norm_label": "reads top tech headlines from two static json files on github pages. cove" + "id": "app_services_providers_webz_client_rationale_140", + "community": 57, + "norm_label": "fetches enterprise-grade news articles from webz.io news api lite. paid p" }, { - "label": "Fetch tech headlines from the India and US static JSON files. Both fi", + "label": "Fetch news articles from Webz.io for the given category. Args:", "file_type": "rationale", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L129", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L166", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_rationale_129", - "community": 6, - "norm_label": "fetch tech headlines from the india and us static json files. both fi" + "id": "app_services_providers_webz_client_rationale_166", + "community": 57, + "norm_label": "fetch news articles from webz.io for the given category. args:" }, { - "label": "Download one regional JSON file and parse its articles. Args:", + "label": "Convert Webz.io JSON 'posts' items into Segmento Pulse Article objects.", "file_type": "rationale", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L221", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L321", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_rationale_221", - "community": 6, - "norm_label": "download one regional json file and parse its articles. args:" + "id": "app_services_providers_webz_client_rationale_321", + "community": 57, + "norm_label": "convert webz.io json 'posts' items into segmento pulse article objects." }, { - "label": "Convert raw NewsAPI-format JSON items into Segmento Pulse Article objects.", + "label": "# NOTE: No date filters applied here intentionally.", "file_type": "rationale", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L292", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L241", "_origin": "ast", - "id": "app_services_providers_sauravkanchan_client_rationale_292", - "community": 6, - "norm_label": "convert raw newsapi-format json items into segmento pulse article objects." + "id": "app_services_providers_webz_client_rationale_241", + "community": 24, + "norm_label": "# note: no date filters applied here intentionally." }, { "label": "__init__.py", "file_type": "code", - "source_file": "app/services/providers/thenewsapi/__init__.py", + "source_file": "app/services/providers/wikinews/__init__.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_thenewsapi_init", - "community": 111, + "id": "app_services_providers_wikinews_init", + "community": 114, "norm_label": "__init__.py" }, { "label": "client.py", "file_type": "code", - "source_file": "app/services/providers/thenewsapi/client.py", + "source_file": "app/services/providers/wikinews/client.py", "source_location": "L1", "_origin": "ast", - "id": "app_services_providers_thenewsapi_client", + "id": "app_services_providers_wikinews_client", "community": 9, "norm_label": "client.py" }, { - "label": "TheNewsAPIProvider", + "label": "WikinewsProvider", "file_type": "code", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L77", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L101", "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_thenewsapiprovider", - "community": 24, - "norm_label": "thenewsapiprovider" + "id": "app_services_providers_wikinews_client_wikinewsprovider", + "community": 52, + "norm_label": "wikinewsprovider" }, { "label": ".__init__()", "file_type": "code", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L90", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L114", "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_thenewsapiprovider_init", - "community": 24, + "id": "app_services_providers_wikinews_client_wikinewsprovider_init", + "community": 52, "norm_label": ".__init__()" }, { "label": ".fetch_news()", "file_type": "code", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L140", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L123", "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_thenewsapiprovider_fetch_news", - "community": 24, + "id": "app_services_providers_wikinews_client_wikinewsprovider_fetch_news", + "community": 52, "norm_label": ".fetch_news()" }, { - "label": "._map_articles()", + "label": "._query_category()", "file_type": "code", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L257", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L175", "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_thenewsapiprovider_map_articles", - "community": 24, - "norm_label": "._map_articles()" + "id": "app_services_providers_wikinews_client_wikinewsprovider_query_category", + "community": 52, + "norm_label": "._query_category()" }, { - "label": "providers/thenewsapi/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", - "file_type": "rationale", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_rationale_1", - "community": 9, - "norm_label": "providers/thenewsapi/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" - }, - { - "label": "Fetches technology news from TheNewsAPI.com. Paid provider \u2014 needs THENEW", - "file_type": "rationale", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L78", - "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_rationale_78", - "community": 24, - "norm_label": "fetches technology news from thenewsapi.com. paid provider \u2014 needs thenew" - }, - { - "label": "Fetch technology articles from TheNewsAPI.com. Args: cat", - "file_type": "rationale", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L141", - "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_rationale_141", - "community": 24, - "norm_label": "fetch technology articles from thenewsapi.com. args: cat" - }, - { - "label": "Convert TheNewsAPI JSON items into Segmento Pulse Article objects. Th", - "file_type": "rationale", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L258", - "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_rationale_258", - "community": 24, - "norm_label": "convert thenewsapi json items into segmento pulse article objects. th" - }, - { - "label": "# NOTE: We deliberately do NOT add 'published_after' or", - "file_type": "rationale", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L191", - "_origin": "ast", - "id": "app_services_providers_thenewsapi_client_rationale_191", - "community": 9, - "norm_label": "# note: we deliberately do not add 'published_after' or" - }, - { - "label": "__init__.py", - "file_type": "code", - "source_file": "app/services/providers/webz/__init__.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_webz_init", - "community": 112, - "norm_label": "__init__.py" - }, - { - "label": "client.py", - "file_type": "code", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_webz_client", - "community": 9, - "norm_label": "client.py" - }, - { - "label": "WebzProvider", - "file_type": "code", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L139", - "_origin": "ast", - "id": "app_services_providers_webz_client_webzprovider", - "community": 24, - "norm_label": "webzprovider" - }, - { - "label": ".__init__()", - "file_type": "code", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L153", - "_origin": "ast", - "id": "app_services_providers_webz_client_webzprovider_init", - "community": 24, - "norm_label": ".__init__()" - }, - { - "label": ".fetch_news()", - "file_type": "code", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L165", - "_origin": "ast", - "id": "app_services_providers_webz_client_webzprovider_fetch_news", - "community": 24, - "norm_label": ".fetch_news()" - }, - { - "label": "._map_articles()", - "file_type": "code", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L320", - "_origin": "ast", - "id": "app_services_providers_webz_client_webzprovider_map_articles", - "community": 24, - "norm_label": "._map_articles()" - }, - { - "label": "providers/webz/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", - "file_type": "rationale", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_webz_client_rationale_1", - "community": 9, - "norm_label": "providers/webz/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" - }, - { - "label": "Fetches enterprise-grade news articles from Webz.io News API Lite. Paid p", - "file_type": "rationale", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L140", - "_origin": "ast", - "id": "app_services_providers_webz_client_rationale_140", - "community": 24, - "norm_label": "fetches enterprise-grade news articles from webz.io news api lite. paid p" - }, - { - "label": "Fetch news articles from Webz.io for the given category. Args:", - "file_type": "rationale", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L166", - "_origin": "ast", - "id": "app_services_providers_webz_client_rationale_166", - "community": 24, - "norm_label": "fetch news articles from webz.io for the given category. args:" - }, - { - "label": "Convert Webz.io JSON 'posts' items into Segmento Pulse Article objects.", - "file_type": "rationale", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L321", - "_origin": "ast", - "id": "app_services_providers_webz_client_rationale_321", - "community": 24, - "norm_label": "convert webz.io json 'posts' items into segmento pulse article objects." - }, - { - "label": "# NOTE: No date filters applied here intentionally.", - "file_type": "rationale", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L241", - "_origin": "ast", - "id": "app_services_providers_webz_client_rationale_241", - "community": 9, - "norm_label": "# note: no date filters applied here intentionally." - }, - { - "label": "__init__.py", - "file_type": "code", - "source_file": "app/services/providers/wikinews/__init__.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_wikinews_init", - "community": 114, - "norm_label": "__init__.py" - }, - { - "label": "client.py", - "file_type": "code", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L1", - "_origin": "ast", - "id": "app_services_providers_wikinews_client", - "community": 9, - "norm_label": "client.py" - }, - { - "label": "WikinewsProvider", - "file_type": "code", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L101", - "_origin": "ast", - "id": "app_services_providers_wikinews_client_wikinewsprovider", - "community": 52, - "norm_label": "wikinewsprovider" - }, - { - "label": ".__init__()", - "file_type": "code", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L114", - "_origin": "ast", - "id": "app_services_providers_wikinews_client_wikinewsprovider_init", - "community": 52, - "norm_label": ".__init__()" - }, - { - "label": ".fetch_news()", - "file_type": "code", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L123", - "_origin": "ast", - "id": "app_services_providers_wikinews_client_wikinewsprovider_fetch_news", - "community": 52, - "norm_label": ".fetch_news()" - }, - { - "label": "._query_category()", - "file_type": "code", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L175", - "_origin": "ast", - "id": "app_services_providers_wikinews_client_wikinewsprovider_query_category", - "community": 52, - "norm_label": "._query_category()" - }, - { - "label": "AsyncClient", - "file_type": "code", - "source_file": "", - "source_location": "", + "label": "AsyncClient", + "file_type": "code", + "source_file": "", + "source_location": "", "_origin": "ast", "id": "app_services_providers_wikinews_client_py_asyncclient", "community": 52, @@ -7200,7 +6860,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_providers_worldnewsai_client", - "community": 9, + "community": 24, "norm_label": "client.py" }, { @@ -7210,7 +6870,7 @@ "source_location": "L114", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_worldnewsaiprovider", - "community": 80, + "community": 24, "norm_label": "worldnewsaiprovider" }, { @@ -7220,7 +6880,7 @@ "source_location": "L127", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_worldnewsaiprovider_init", - "community": 80, + "community": 24, "norm_label": ".__init__()" }, { @@ -7230,7 +6890,7 @@ "source_location": "L139", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_worldnewsaiprovider_fetch_news", - "community": 80, + "community": 24, "norm_label": ".fetch_news()" }, { @@ -7240,7 +6900,7 @@ "source_location": "L277", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_worldnewsaiprovider_map_articles", - "community": 80, + "community": 24, "norm_label": "._map_articles()" }, { @@ -7250,7 +6910,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_rationale_1", - "community": 9, + "community": 24, "norm_label": "providers/worldnewsai/client.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { @@ -7260,7 +6920,7 @@ "source_location": "L115", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_rationale_115", - "community": 80, + "community": 24, "norm_label": "fetches global technology news from worldnewsai.com. paid provider (point" }, { @@ -7270,7 +6930,7 @@ "source_location": "L140", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_rationale_140", - "community": 80, + "community": 24, "norm_label": "fetch global technology news from worldnewsai. args: cat" }, { @@ -7280,7 +6940,7 @@ "source_location": "L278", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_rationale_278", - "community": 80, + "community": 24, "norm_label": "convert worldnewsai json items into segmento pulse article objects. k" }, { @@ -7290,7 +6950,7 @@ "source_location": "L195", "_origin": "ast", "id": "app_services_providers_worldnewsai_client_rationale_195", - "community": 9, + "community": 24, "norm_label": "# note: no date filters applied here intentionally." }, { @@ -7440,7 +7100,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_rss_parser", - "community": 4, + "community": 9, "norm_label": "rss_parser.py" }, { @@ -7450,7 +7110,7 @@ "source_location": "L10", "_origin": "ast", "id": "app_services_rss_parser_rssparser", - "community": 4, + "community": 9, "norm_label": "rssparser" }, { @@ -7510,7 +7170,7 @@ "source_location": "L139", "_origin": "ast", "id": "app_services_rss_parser_rssparser_parse_provider_rss", - "community": 81, + "community": 9, "norm_label": ".parse_provider_rss()" }, { @@ -7520,7 +7180,7 @@ "source_location": "L175", "_origin": "ast", "id": "app_services_rss_parser_rssparser_extract_image_from_entry", - "community": 81, + "community": 9, "norm_label": "._extract_image_from_entry()" }, { @@ -7530,7 +7190,7 @@ "source_location": "L207", "_origin": "ast", "id": "app_services_rss_parser_rssparser_parse_date", - "community": 81, + "community": 9, "norm_label": "._parse_date()" }, { @@ -7540,7 +7200,7 @@ "source_location": "", "_origin": "ast", "id": "app_services_rss_parser_py_datetime", - "community": 81, + "community": 9, "norm_label": "datetime" }, { @@ -7550,7 +7210,7 @@ "source_location": "L11", "_origin": "ast", "id": "app_services_rss_parser_rationale_11", - "community": 4, + "community": 9, "norm_label": "rss feed parser for news sources" }, { @@ -7610,7 +7270,7 @@ "source_location": "L140", "_origin": "ast", "id": "app_services_rss_parser_rationale_140", - "community": 81, + "community": 9, "norm_label": "parse cloud provider rss feed" }, { @@ -7620,7 +7280,7 @@ "source_location": "L176", "_origin": "ast", "id": "app_services_rss_parser_rationale_176", - "community": 81, + "community": 9, "norm_label": "extract image url from feed entry" }, { @@ -7630,7 +7290,7 @@ "source_location": "L208", "_origin": "ast", "id": "app_services_rss_parser_rationale_208", - "community": 81, + "community": 9, "norm_label": "parse date string to datetime" }, { @@ -7720,7 +7380,7 @@ "source_location": "L286", "_origin": "ast", "id": "app_services_scheduler_enrich_missing_images_in_batch", - "community": 29, + "community": 82, "norm_label": "enrich_missing_images_in_batch()" }, { @@ -7730,7 +7390,7 @@ "source_location": "L402", "_origin": "ast", "id": "app_services_scheduler_fetch_and_validate_category", - "community": 62, + "community": 87, "norm_label": "fetch_and_validate_category()" }, { @@ -7740,7 +7400,7 @@ "source_location": "L550", "_origin": "ast", "id": "app_services_scheduler_cleanup_old_news", - "community": 44, + "community": 29, "norm_label": "cleanup_old_news()" }, { @@ -7750,7 +7410,7 @@ "source_location": "L700", "_origin": "ast", "id": "app_services_scheduler_background_image_enricher_job", - "community": 29, + "community": 10, "norm_label": "background_image_enricher_job()" }, { @@ -7770,7 +7430,7 @@ "source_location": "L967", "_origin": "ast", "id": "app_services_scheduler_shutdown_scheduler", - "community": 29, + "community": 12, "norm_label": "shutdown_scheduler()" }, { @@ -7790,7 +7450,7 @@ "source_location": "L986", "_origin": "ast", "id": "app_services_scheduler_trigger_cleanup_now", - "community": 44, + "community": 32, "norm_label": "trigger_cleanup_now()" }, { @@ -7890,7 +7550,7 @@ "source_location": "L287", "_origin": "ast", "id": "app_services_scheduler_rationale_287", - "community": 29, + "community": 82, "norm_label": "scan a list of fully-vetted articles and fill in any missing images. only" }, { @@ -7900,7 +7560,7 @@ "source_location": "L403", "_origin": "ast", "id": "app_services_scheduler_rationale_403", - "community": 62, + "community": 87, "norm_label": "fetch and validate articles for a single category. args: categor" }, { @@ -7910,7 +7570,7 @@ "source_location": "L551", "_origin": "ast", "id": "app_services_scheduler_rationale_551", - "community": 44, + "community": 29, "norm_label": "background job: delete articles older than 48 hours from all collections" }, { @@ -7920,7 +7580,7 @@ "source_location": "L701", "_origin": "ast", "id": "app_services_scheduler_rationale_701", - "community": 29, + "community": 10, "norm_label": "background job: fetch articles across collections missing images and enrich them" }, { @@ -7940,7 +7600,7 @@ "source_location": "L968", "_origin": "ast", "id": "app_services_scheduler_rationale_968", - "community": 29, + "community": 12, "norm_label": "gracefully shutdown the scheduler" }, { @@ -7960,7 +7620,7 @@ "source_location": "L987", "_origin": "ast", "id": "app_services_scheduler_rationale_987", - "community": 44, + "community": 32, "norm_label": "manually trigger cleanup" }, { @@ -7990,7 +7650,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_upstash_cache", - "community": 28, + "community": 29, "norm_label": "upstash_cache.py" }, { @@ -8200,7 +7860,7 @@ "source_location": "L398", "_origin": "ast", "id": "app_services_upstash_cache_get_upstash_cache", - "community": 28, + "community": 18, "norm_label": "get_upstash_cache()" }, { @@ -8210,7 +7870,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_upstash_cache_rationale_1", - "community": 28, + "community": 29, "norm_label": "upstash redis cache service (rest api) ======================================" }, { @@ -8390,7 +8050,7 @@ "source_location": "L399", "_origin": "ast", "id": "app_services_upstash_cache_rationale_399", - "community": 28, + "community": 18, "norm_label": "get or create global upstash cache instance returns: upstash" }, { @@ -8480,7 +8140,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_utils_provider_state", - "community": 9, + "community": 24, "norm_label": "provider_state.py" }, { @@ -8500,7 +8160,7 @@ "source_location": "L81", "_origin": "ast", "id": "app_services_utils_provider_state_counter_key", - "community": 9, + "community": 24, "norm_label": "_counter_key()" }, { @@ -8530,7 +8190,7 @@ "source_location": "L190", "_origin": "ast", "id": "app_services_utils_provider_state_get_provider_counter", - "community": 9, + "community": 24, "norm_label": "get_provider_counter()" }, { @@ -8540,7 +8200,7 @@ "source_location": "L234", "_origin": "ast", "id": "app_services_utils_provider_state_increment_provider_counter", - "community": 9, + "community": 24, "norm_label": "increment_provider_counter()" }, { @@ -8550,7 +8210,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_services_utils_provider_state_rationale_1", - "community": 9, + "community": 24, "norm_label": "app/services/utils/provider_state.py \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }, { @@ -8570,7 +8230,7 @@ "source_location": "L82", "_origin": "ast", "id": "app_services_utils_provider_state_rationale_82", - "community": 9, + "community": 24, "norm_label": "build the redis key string for a provider's daily call counter. date_key" }, { @@ -8600,7 +8260,7 @@ "source_location": "L191", "_origin": "ast", "id": "app_services_utils_provider_state_rationale_191", - "community": 9, + "community": 24, "norm_label": "read a provider's call counter for a specific date from redis. if redis i" }, { @@ -8610,7 +8270,7 @@ "source_location": "L240", "_origin": "ast", "id": "app_services_utils_provider_state_rationale_240", - "community": 9, + "community": 24, "norm_label": "increment a provider's daily call counter in redis by `amount`. uses redi" }, { @@ -8630,7 +8290,7 @@ "source_location": "L20", "_origin": "ast", "id": "app_services_worker_manager_workermanager", - "community": 28, + "community": 81, "norm_label": "workermanager" }, { @@ -8640,7 +8300,7 @@ "source_location": "L21", "_origin": "ast", "id": "app_services_worker_manager_workermanager_init", - "community": 28, + "community": 81, "norm_label": ".__init__()" }, { @@ -8650,7 +8310,7 @@ "source_location": "L37", "_origin": "ast", "id": "app_services_worker_manager_workermanager_aggregator", - "community": 32, + "community": 81, "norm_label": ".aggregator()" }, { @@ -8660,7 +8320,7 @@ "source_location": "L44", "_origin": "ast", "id": "app_services_worker_manager_workermanager_start", - "community": 28, + "community": 81, "norm_label": ".start()" }, { @@ -8670,7 +8330,7 @@ "source_location": "L116", "_origin": "ast", "id": "app_services_worker_manager_workermanager_stop", - "community": 28, + "community": 81, "norm_label": ".stop()" }, { @@ -8680,7 +8340,7 @@ "source_location": "L120", "_origin": "ast", "id": "app_services_worker_manager_workermanager_cleanup_zombie_tasks", - "community": 28, + "community": 81, "norm_label": ".cleanup_zombie_tasks()" }, { @@ -8690,7 +8350,7 @@ "source_location": "L155", "_origin": "ast", "id": "app_services_worker_manager_run_worker", - "community": 28, + "community": 12, "norm_label": "run_worker()" }, { @@ -8710,7 +8370,7 @@ "source_location": "L38", "_origin": "ast", "id": "app_services_worker_manager_rationale_38", - "community": 32, + "community": 81, "norm_label": "lazy-load the shared aggregator singleton from scheduler." }, { @@ -8720,7 +8380,7 @@ "source_location": "L121", "_origin": "ast", "id": "app_services_worker_manager_rationale_121", - "community": 28, + "community": 81, "norm_label": "the reaper: scans the processing queue for tasks that timed out. if a w" }, { @@ -8730,7 +8390,7 @@ "source_location": "L156", "_origin": "ast", "id": "app_services_worker_manager_rationale_156", - "community": 28, + "community": 12, "norm_label": "main entry point for the worker process" }, { @@ -9120,7 +8780,7 @@ "source_location": "L18", "_origin": "ast", "id": "app_utils_data_validation_is_valid_article", - "community": 62, + "community": 87, "norm_label": "is_valid_article()" }, { @@ -9190,7 +8850,7 @@ "source_location": "L19", "_origin": "ast", "id": "app_utils_data_validation_rationale_19", - "community": 62, + "community": 87, "norm_label": "validate article data quality before database insertion hotfix: now h" }, { @@ -9460,7 +9120,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_utils_id_generator", - "community": 31, + "community": 86, "norm_label": "id_generator.py" }, { @@ -9480,7 +9140,7 @@ "source_location": "L50", "_origin": "ast", "id": "app_utils_id_generator_generate_article_id_uuid", - "community": 31, + "community": 86, "norm_label": "generate_article_id_uuid()" }, { @@ -9490,7 +9150,7 @@ "source_location": "L75", "_origin": "ast", "id": "app_utils_id_generator_validate_appwrite_id", - "community": 31, + "community": 86, "norm_label": "validate_appwrite_id()" }, { @@ -9500,7 +9160,7 @@ "source_location": "L1", "_origin": "ast", "id": "app_utils_id_generator_rationale_1", - "community": 31, + "community": 86, "norm_label": "article id generation utilities ================================ generates a" }, { @@ -9520,7 +9180,7 @@ "source_location": "L51", "_origin": "ast", "id": "app_utils_id_generator_rationale_51", - "community": 31, + "community": 86, "norm_label": "generate appwrite-compatible uuid from url alternative method using u" }, { @@ -9530,7 +9190,7 @@ "source_location": "L76", "_origin": "ast", "id": "app_utils_id_generator_rationale_76", - "community": 31, + "community": 86, "norm_label": "validate that document id meets appwrite requirements appwrite docume" }, { @@ -10030,7 +9690,7 @@ "source_location": "L66", "_origin": "ast", "id": "tests_test_quality_rescue_testnewsprocessormetrics", - "community": 13, + "community": 63, "norm_label": "testnewsprocessormetrics" }, { @@ -10040,7 +9700,7 @@ "source_location": "L68", "_origin": "ast", "id": "tests_test_quality_rescue_testnewsprocessormetrics_test_process_category_records_irrelevant_count", - "community": 13, + "community": 63, "norm_label": ".test_process_category_records_irrelevant_count()" }, { @@ -10826,611 +10486,100 @@ "label": "get_provider_timestamp", "file_type": "code", "source_file": "app/services/utils/provider_state.py", - "source_location": null, - "source_url": null, - "captured_at": null, - "author": null, - "contributor": null, - "community": 122, - "norm_label": "get_provider_timestamp", - "id": "app_services_utils_provider_state_getprovidertimestamp" - }, - { - "label": "get_provider_counter", - "file_type": "code", - "source_file": "app/services/utils/provider_state.py", - "source_location": null, - "source_url": null, - "captured_at": null, - "author": null, - "contributor": null, - "community": 121, - "norm_label": "get_provider_counter", - "id": "app_services_utils_provider_state_getprovidercounter" - }, - { - "label": "increment_provider_counter", - "file_type": "code", - "source_file": "app/services/utils/provider_state.py", - "source_location": null, - "source_url": null, - "captured_at": null, - "author": null, - "contributor": null, - "community": 123, - "norm_label": "increment_provider_counter", - "id": "app_services_utils_provider_state_incrementprovidercounter" - }, - { - "label": "build_dynamic_query", - "file_type": "code", - "source_file": "app/utils/query_builder.py", - "source_location": null, - "source_url": null, - "captured_at": null, - "author": null, - "contributor": null, - "community": 42, - "norm_label": "build_dynamic_query", - "id": "app_utils_query_builder_builddynamicquery" - }, - { - "label": "canonicalize_url", - "file_type": "code", - "source_file": "app/utils/url_canonicalization.py", - "source_location": null, - "source_url": null, - "captured_at": null, - "author": null, - "contributor": null, - "community": 62, - "norm_label": "canonicalize_url", - "id": "app_utils_url_canonicalization_canonicalizeurl" - }, - { - "label": "get_url_hash", - "file_type": "code", - "source_file": "app/utils/url_canonicalization.py", - "source_location": null, - "source_url": null, - "captured_at": null, - "author": null, - "contributor": null, - "community": 130, - "norm_label": "get_url_hash", - "id": "app_utils_url_canonicalization_geturlhash" - } - ], - "links": [ - { - "relation": "rationale_for", - "confidence": "EXTRACTED", - "source_file": "app/__init__.py", - "source_location": "L1", - "weight": 1.0, - "source": "app_init_rationale_1", - "target": "app_init", - "confidence_score": 1.0 - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/config.py", - "source_location": "L5", - "weight": 1.0, - "source": "app_config", - "target": "app_config_settings", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L37", - "weight": 1.0, - "source": "app_main", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L7", - "weight": 1.0, - "source": "app_routes_admin", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L9", - "weight": 1.0, - "source": "app_routes_audio", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L11", - "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/routes/research.py", - "source_location": "L5", - "weight": 1.0, - "source": "app_routes_research", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L9", - "weight": 1.0, - "source": "app_services_alert_service", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L28", - "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L10", - "weight": 1.0, - "source": "app_services_audio_service", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L13", - "weight": 1.0, - "source": "app_services_brevo_email_service", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L18", - "weight": 1.0, - "source": "app_services_cache_service", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L11", - "weight": 1.0, - "source": "app_services_firebase_service", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L18", - "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L17", - "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L13", - "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L20", - "weight": 1.0, - "source": "app_services_optimized_retrieval", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L53", - "weight": 1.0, - "source": "app_services_providers_thenewsapi_client", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L76", - "weight": 1.0, - "source": "app_services_providers_webz_client", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/worldnewsai/client.py", - "source_location": "L55", - "weight": 1.0, - "source": "app_services_providers_worldnewsai_client", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/research_aggregator.py", - "source_location": "L9", - "weight": 1.0, - "source": "app_services_research_aggregator", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L35", - "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/worker_manager.py", - "source_location": "L16", - "weight": 1.0, - "source": "app_services_worker_manager", - "target": "app_config", - "confidence_score": 1.0 - }, - { - "relation": "method", - "confidence": "EXTRACTED", - "source_file": "app/config.py", - "source_location": "L104", - "weight": 1.0, - "source": "app_config_settings", - "target": "app_config_settings_parse_comma_separated", - "confidence_score": 1.0 - }, - { - "relation": "inherits", - "confidence": "EXTRACTED", - "source_file": "app/config.py", - "source_location": "L5", - "weight": 1.0, - "source": "app_config_settings", - "target": "basesettings", - "confidence_score": 1.0 - }, - { - "relation": "rationale_for", - "confidence": "EXTRACTED", - "source_file": "app/config.py", - "source_location": "L105", - "weight": 1.0, - "source": "app_config_rationale_105", - "target": "app_config_settings_parse_comma_separated", - "confidence_score": 1.0 - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L262", - "weight": 1.0, - "source": "app_main", - "target": "app_main_health_check", - "confidence_score": 1.0 - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L66", - "weight": 1.0, - "source": "app_main", - "target": "app_main_lifespan", - "confidence_score": 1.0 - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L160", - "weight": 1.0, - "source": "app_main", - "target": "app_main_root", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L51", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_admin", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L51", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_analytics", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L51", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_audio", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L151", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_engagement", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L156", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_monitoring", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L51", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_news", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L147", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_research", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L51", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_search", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "submodule_import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L51", - "weight": 1.0, - "source": "app_main", - "target": "app_routes_subscription", - "confidence_score": 1.0 - }, - { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L178", - "weight": 1.0, - "source": "app_main", - "target": "app_services_appwrite_db_get_appwrite_db", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L63", - "weight": 1.0, - "source": "app_main", - "target": "app_services_browser_manager", - "confidence_score": 1.0 - }, - { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L60", - "weight": 1.0, - "source": "app_main", - "target": "app_services_circuit_breaker", - "confidence_score": 1.0 - }, - { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L208", - "weight": 1.0, - "source": "app_main", - "target": "app_services_circuit_breaker_providercircuitbreaker", - "confidence_score": 1.0 - }, - { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L60", - "weight": 1.0, - "source": "app_main", - "target": "app_services_circuit_breaker_startup_circuit_breaker", - "confidence_score": 1.0 + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 122, + "norm_label": "get_provider_timestamp", + "id": "app_services_utils_provider_state_getprovidertimestamp" }, { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L54", - "weight": 1.0, - "source": "app_main", - "target": "app_services_scheduler", - "confidence_score": 1.0 + "label": "get_provider_counter", + "file_type": "code", + "source_file": "app/services/utils/provider_state.py", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 121, + "norm_label": "get_provider_counter", + "id": "app_services_utils_provider_state_getprovidercounter" }, { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L54", - "weight": 1.0, - "source": "app_main", - "target": "app_services_scheduler_shutdown_scheduler", - "confidence_score": 1.0 + "label": "increment_provider_counter", + "file_type": "code", + "source_file": "app/services/utils/provider_state.py", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 123, + "norm_label": "increment_provider_counter", + "id": "app_services_utils_provider_state_incrementprovidercounter" }, { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L54", - "weight": 1.0, - "source": "app_main", - "target": "app_services_scheduler_start_scheduler", - "confidence_score": 1.0 + "label": "build_dynamic_query", + "file_type": "code", + "source_file": "app/utils/query_builder.py", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 42, + "norm_label": "build_dynamic_query", + "id": "app_utils_query_builder_builddynamicquery" }, { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L54", - "weight": 1.0, - "source": "app_main", - "target": "app_services_scheduler_update_adaptive_intervals_from_redis", - "confidence_score": 1.0 + "label": "canonicalize_url", + "file_type": "code", + "source_file": "app/utils/url_canonicalization.py", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 87, + "norm_label": "canonicalize_url", + "id": "app_utils_url_canonicalization_canonicalizeurl" }, { - "relation": "imports_from", - "context": "import", + "label": "get_url_hash", + "file_type": "code", + "source_file": "app/utils/url_canonicalization.py", + "source_location": null, + "source_url": null, + "captured_at": null, + "author": null, + "contributor": null, + "community": 130, + "norm_label": "get_url_hash", + "id": "app_utils_url_canonicalization_geturlhash" + } + ], + "links": [ + { + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L57", + "source_file": "app/__init__.py", + "source_location": "L1", "weight": 1.0, - "source": "app_main", - "target": "app_services_worker_manager", + "source": "app_init_rationale_1", + "target": "app_init", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L57", + "source_file": "app/config.py", + "source_location": "L5", "weight": 1.0, - "source": "app_main", - "target": "app_services_worker_manager_run_worker", + "source": "app_config", + "target": "app_config_settings", "confidence_score": 1.0 }, { @@ -11438,1231 +10587,1034 @@ "context": "import", "confidence": "EXTRACTED", "source_file": "app/main.py", - "source_location": "L7", + "source_location": "L37", "weight": 1.0, "source": "app_main", - "target": "app_utils_custom_logger", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/main.py", + "source_file": "app/routes/admin.py", "source_location": "L7", "weight": 1.0, - "source": "app_main", - "target": "app_utils_custom_logger_alignedcolorformatter", + "source": "app_routes_admin", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L4", - "weight": 1.0, - "source": "app_main", - "target": "fastapi", - "confidence_score": 1.0 - }, - { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/main.py", - "source_location": "L96", - "weight": 1.0, - "source": "app_main_lifespan", - "target": "app_services_circuit_breaker_startup_circuit_breaker" - }, - { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/main.py", - "source_location": "L115", - "weight": 1.0, - "source": "app_main_lifespan", - "target": "app_services_scheduler_shutdown_scheduler" - }, - { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/main.py", - "source_location": "L77", - "weight": 1.0, - "source": "app_main_lifespan", - "target": "app_services_scheduler_start_scheduler" - }, - { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/main.py", - "source_location": "L91", - "weight": 1.0, - "source": "app_main_lifespan", - "target": "app_services_worker_manager_run_worker" - }, - { - "relation": "references", - "context": "parameter_type", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L66", - "weight": 1.0, - "source": "app_main_lifespan", - "target": "fastapi", - "confidence_score": 1.0 - }, - { - "relation": "rationale_for", - "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L67", + "source_file": "app/routes/audio.py", + "source_location": "L9", "weight": 1.0, - "source": "app_main_rationale_67", - "target": "app_main_lifespan", + "source": "app_routes_audio", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L1", + "source_file": "app/routes/engagement.py", + "source_location": "L11", "weight": 1.0, - "source": "app_routes_admin", - "target": "fastapi", + "source": "app_routes_engagement", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L1", + "source_file": "app/routes/research.py", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_analytics", - "target": "fastapi", + "source": "app_routes_research", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L1", + "source_file": "app/services/alert_service.py", + "source_location": "L9", "weight": 1.0, - "source": "app_routes_audio", - "target": "fastapi", + "source": "app_services_alert_service", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L6", + "source_file": "app/services/appwrite_db.py", + "source_location": "L28", "weight": 1.0, - "source": "app_routes_engagement", - "target": "fastapi", + "source": "app_services_appwrite_db", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L15", + "source_file": "app/services/audio_service.py", + "source_location": "L10", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "fastapi", + "source": "app_services_audio_service", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L1", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L13", "weight": 1.0, - "source": "app_routes_news", - "target": "fastapi", + "source": "app_services_brevo_email_service", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/research.py", - "source_location": "L2", + "source_file": "app/services/cache_service.py", + "source_location": "L18", "weight": 1.0, - "source": "app_routes_research", - "target": "fastapi", + "source": "app_services_cache_service", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L1", + "source_file": "app/services/news_aggregator.py", + "source_location": "L18", "weight": 1.0, - "source": "app_routes_search", - "target": "fastapi", + "source": "app_services_news_aggregator", + "target": "app_config", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L5", + "source_file": "app/services/news_processor.py", + "source_location": "L17", "weight": 1.0, - "source": "app_routes_subscription", - "target": "fastapi", + "source": "app_services_news_processor", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L161", + "source_file": "app/services/newsletter_service.py", + "source_location": "L13", "weight": 1.0, - "source": "app_main_rationale_161", - "target": "app_main_root", + "source": "app_services_newsletter_service", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/main.py", - "source_location": "L198", - "weight": 1.0, - "source": "app_main_root", - "target": "app_services_appwrite_db_get_appwrite_db" - }, - { - "relation": "rationale_for", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/main.py", - "source_location": "L263", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L20", "weight": 1.0, - "source": "app_main_rationale_263", - "target": "app_main_health_check", + "source": "app_services_optimized_retrieval", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L6", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L53", "weight": 1.0, - "source": "app_models", - "target": "app_models_article", + "source": "app_services_providers_thenewsapi_client", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L85", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L76", "weight": 1.0, - "source": "app_models", - "target": "app_models_errorresponse", + "source": "app_services_providers_webz_client", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L58", + "source_file": "app/services/providers/worldnewsai/client.py", + "source_location": "L55", "weight": 1.0, - "source": "app_models", - "target": "app_models_newsresponse", + "source": "app_services_providers_worldnewsai_client", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L68", + "source_file": "app/services/research_aggregator.py", + "source_location": "L9", "weight": 1.0, - "source": "app_models", - "target": "app_models_searchresponse", + "source": "app_services_research_aggregator", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L75", + "source_file": "app/services/scheduler.py", + "source_location": "L35", "weight": 1.0, - "source": "app_models", - "target": "app_models_viewcountrequest", + "source": "app_services_scheduler", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L79", + "source_file": "app/services/worker_manager.py", + "source_location": "L16", "weight": 1.0, - "source": "app_models", - "target": "app_models_viewcountresponse", + "source": "app_services_worker_manager", + "target": "app_config", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L2", + "source_file": "app/config.py", + "source_location": "L104", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_models", + "source": "app_config_settings", + "target": "app_config_settings_parse_comma_separated", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L2", + "source_file": "app/config.py", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_news", - "target": "app_models", + "source": "app_config_settings", + "target": "basesettings", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L2", + "source_file": "app/config.py", + "source_location": "L105", "weight": 1.0, - "source": "app_routes_search", - "target": "app_models", + "source": "app_config_rationale_105", + "target": "app_config_settings_parse_comma_separated", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L27", + "source_file": "app/main.py", + "source_location": "L262", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_models", + "source": "app_main", + "target": "app_main_health_check", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L19", + "source_file": "app/main.py", + "source_location": "L66", "weight": 1.0, - "source": "app_services_cache_service", - "target": "app_models", + "source": "app_main", + "target": "app_main_lifespan", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L7", + "source_file": "app/main.py", + "source_location": "L160", "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_models", + "source": "app_main", + "target": "app_main_root", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L10", + "source_file": "app/main.py", + "source_location": "L51", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_models", + "source": "app_main", + "target": "app_routes_admin", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", + "source_file": "app/main.py", + "source_location": "L51", "weight": 1.0, - "source": "app_services_news_providers", - "target": "app_models", + "source": "app_main", + "target": "app_routes_audio", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/base.py", - "source_location": "L64", + "source_file": "app/main.py", + "source_location": "L151", "weight": 1.0, - "source": "app_services_providers_base", - "target": "app_models", + "source": "app_main", + "target": "app_routes_engagement", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L58", + "source_file": "app/main.py", + "source_location": "L156", "weight": 1.0, - "source": "app_services_providers_direct_rss_client", - "target": "app_models", + "source": "app_main", + "target": "app_routes_monitoring", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L48", + "source_file": "app/main.py", + "source_location": "L51", "weight": 1.0, - "source": "app_services_providers_hackernews_client", - "target": "app_models", + "source": "app_main", + "target": "app_routes_news", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L53", + "source_file": "app/main.py", + "source_location": "L147", "weight": 1.0, - "source": "app_services_providers_inshorts_client", - "target": "app_models", + "source": "app_main", + "target": "app_routes_research", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L76", + "source_file": "app/main.py", + "source_location": "L51", "weight": 1.0, - "source": "app_services_providers_openrss_client", - "target": "app_models", + "source": "app_main", + "target": "app_routes_search", "confidence_score": 1.0 }, { "relation": "imports_from", - "context": "import", + "context": "submodule_import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L52", + "source_file": "app/main.py", + "source_location": "L51", "weight": 1.0, - "source": "app_services_providers_sauravkanchan_client", - "target": "app_models", + "source": "app_main", + "target": "app_routes_subscription", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L52", + "source_file": "app/main.py", + "source_location": "L178", "weight": 1.0, - "source": "app_services_providers_thenewsapi_client", - "target": "app_models", + "source": "app_main", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L75", + "source_file": "app/main.py", + "source_location": "L63", "weight": 1.0, - "source": "app_services_providers_webz_client", - "target": "app_models", + "source": "app_main", + "target": "app_services_browser_manager", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L70", + "source_file": "app/main.py", + "source_location": "L60", "weight": 1.0, - "source": "app_services_providers_wikinews_client", - "target": "app_models", + "source": "app_main", + "target": "app_services_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/worldnewsai/client.py", - "source_location": "L54", + "source_file": "app/main.py", + "source_location": "L208", "weight": 1.0, - "source": "app_services_providers_worldnewsai_client", - "target": "app_models", + "source": "app_main", + "target": "app_services_circuit_breaker_providercircuitbreaker", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/rss_parser.py", - "source_location": "L4", + "source_file": "app/main.py", + "source_location": "L60", "weight": 1.0, - "source": "app_services_rss_parser", - "target": "app_models", + "source": "app_main", + "target": "app_services_circuit_breaker_startup_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L34", + "source_file": "app/main.py", + "source_location": "L54", "weight": 1.0, - "source": "app_models_article", - "target": "app_models_article_parse_datetime", + "source": "app_main", + "target": "app_services_scheduler", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L6", + "source_file": "app/main.py", + "source_location": "L54", "weight": 1.0, - "source": "app_models_article", - "target": "basemodel", + "source": "app_main", + "target": "app_services_scheduler_shutdown_scheduler", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L27", + "source_file": "app/main.py", + "source_location": "L54", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_models_article", + "source": "app_main", + "target": "app_services_scheduler_start_scheduler", "confidence_score": 1.0 }, - { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L27", - "weight": 0.8, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L27", - "weight": 0.8, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_models_article", - "confidence_score": 0.5 - }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L19", + "source_file": "app/main.py", + "source_location": "L54", "weight": 1.0, - "source": "app_services_cache_service", - "target": "app_models_article", + "source": "app_main", + "target": "app_services_scheduler_update_adaptive_intervals_from_redis", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/cache_service.py", - "source_location": "L19", - "weight": 0.8, - "source": "app_services_cache_service_cacheservice", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L75", + "source_file": "app/main.py", + "source_location": "L57", "weight": 1.0, - "source": "app_services_cache_service_cacheservice_get", - "target": "app_models_article", + "source": "app_main", + "target": "app_services_worker_manager", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L111", + "source_file": "app/main.py", + "source_location": "L57", "weight": 1.0, - "source": "app_services_cache_service_cacheservice_set", - "target": "app_models_article", + "source": "app_main", + "target": "app_services_worker_manager_run_worker", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", + "source_file": "app/main.py", "source_location": "L7", "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_models_article", + "source": "app_main", + "target": "app_utils_custom_logger", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L7", - "weight": 0.8, - "source": "app_services_news_aggregator_newsaggregator", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L203", + "source_file": "app/main.py", + "source_location": "L7", "weight": 1.0, - "source": "app_services_news_aggregator_newsaggregator_fetch_by_category", - "target": "app_models_article", + "source": "app_main", + "target": "app_utils_custom_logger_alignedcolorformatter", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L436", + "source_file": "app/main.py", + "source_location": "L4", "weight": 1.0, - "source": "app_services_news_aggregator_newsaggregator_fetch_from_provider", - "target": "app_models_article", + "source": "app_main", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L448", + "confidence_score": 1.0, + "source_file": "app/main.py", + "source_location": "L96", "weight": 1.0, - "source": "app_services_news_aggregator_newsaggregator_fetch_rss", - "target": "app_models_article", - "confidence_score": 1.0 + "source": "app_main_lifespan", + "target": "app_services_circuit_breaker_startup_circuit_breaker" }, { - "relation": "references", - "context": "generic_arg", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L465", + "confidence_score": 1.0, + "source_file": "app/main.py", + "source_location": "L115", "weight": 1.0, - "source": "app_services_news_aggregator_newsaggregator_search", - "target": "app_models_article", - "confidence_score": 1.0 + "source": "app_main_lifespan", + "target": "app_services_scheduler_shutdown_scheduler" }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L10", + "confidence_score": 1.0, + "source_file": "app/main.py", + "source_location": "L77", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_models_article", - "confidence_score": 1.0 + "source": "app_main_lifespan", + "target": "app_services_scheduler_start_scheduler" }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", + "confidence_score": 1.0, + "source_file": "app/main.py", + "source_location": "L91", "weight": 1.0, - "source": "app_services_news_providers", - "target": "app_models_article", - "confidence_score": 1.0 - }, - { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_gnewsprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "source": "app_main_lifespan", + "target": "app_services_worker_manager_run_worker" }, { "relation": "references", - "context": "generic_arg", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L107", + "source_file": "app/main.py", + "source_location": "L66", "weight": 1.0, - "source": "app_services_news_providers_gnewsprovider_fetch_news", - "target": "app_models_article", + "source": "app_main_lifespan", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L179", + "source_file": "app/main.py", + "source_location": "L67", "weight": 1.0, - "source": "app_services_news_providers_gnewsprovider_parse_response", - "target": "app_models_article", + "source": "app_main_rationale_67", + "target": "app_main_lifespan", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_googlenewsrssprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L476", + "source_file": "app/routes/admin.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_news_providers_googlenewsrssprovider_fetch_news", - "target": "app_models_article", + "source": "app_routes_admin", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_mediumrssprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L532", + "source_file": "app/routes/audio.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_news_providers_mediumrssprovider_fetch_news", - "target": "app_models_article", + "source": "app_routes_audio", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/routes/engagement.py", "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_newsapiprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "weight": 1.0, + "source": "app_routes_engagement", + "target": "fastapi", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L241", + "source_file": "app/routes/monitoring.py", + "source_location": "L15", "weight": 1.0, - "source": "app_services_news_providers_newsapiprovider_fetch_news", - "target": "app_models_article", + "source": "app_routes_monitoring", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L314", + "source_file": "app/routes/news.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_news_providers_newsapiprovider_parse_response", - "target": "app_models_article", + "source": "app_routes_news", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_newsdataprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L375", + "source_file": "app/routes/research.py", + "source_location": "L2", "weight": 1.0, - "source": "app_services_news_providers_newsdataprovider_fetch_news", - "target": "app_models_article", + "source": "app_routes_research", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L421", + "source_file": "app/routes/search.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_news_providers_newsdataprovider_parse_response", - "target": "app_models_article", + "source": "app_routes_search", + "target": "fastapi", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_newsprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/routes/subscription.py", + "source_location": "L5", + "weight": 1.0, + "source": "app_routes_subscription", + "target": "fastapi", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L32", + "source_file": "app/main.py", + "source_location": "L161", "weight": 1.0, - "source": "app_services_news_providers_newsprovider_fetch_news", - "target": "app_models_article", + "source": "app_main_rationale_161", + "target": "app_main_root", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", - "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_officialcloudprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/main.py", + "source_location": "L198", + "weight": 1.0, + "source": "app_main_root", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "references", - "context": "generic_arg", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L651", + "source_file": "app/main.py", + "source_location": "L263", "weight": 1.0, - "source": "app_services_news_providers_officialcloudprovider_fetch_news", - "target": "app_models_article", + "source": "app_main_rationale_263", + "target": "app_main_health_check", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/news_providers.py", + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/models.py", "source_location": "L6", - "weight": 0.8, - "source": "app_services_news_providers_providerstatus", + "weight": 1.0, + "source": "app_models", "target": "app_models_article", - "confidence_score": 0.5 + "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/providers/base.py", - "source_location": "L64", + "source_file": "app/models.py", + "source_location": "L85", "weight": 1.0, - "source": "app_services_providers_base", - "target": "app_models_article", + "source": "app_models", + "target": "app_models_errorresponse", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/base.py", - "source_location": "L64", - "weight": 0.8, - "source": "app_services_providers_base_newsprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/providers/base.py", - "source_location": "L128", + "source_file": "app/models.py", + "source_location": "L58", "weight": 1.0, - "source": "app_services_providers_base_newsprovider_fetch_news", - "target": "app_models_article", + "source": "app_models", + "target": "app_models_newsresponse", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/base.py", - "source_location": "L64", - "weight": 0.8, - "source": "app_services_providers_base_providerstatus", - "target": "app_models_article", - "confidence_score": 0.5 + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/models.py", + "source_location": "L68", + "weight": 1.0, + "source": "app_models", + "target": "app_models_searchresponse", + "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L58", + "source_file": "app/models.py", + "source_location": "L75", "weight": 1.0, - "source": "app_services_providers_direct_rss_client", - "target": "app_models_article", + "source": "app_models", + "target": "app_models_viewcountrequest", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L58", - "weight": 0.8, - "source": "app_services_providers_direct_rss_client_directrssprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L242", + "source_file": "app/models.py", + "source_location": "L79", "weight": 1.0, - "source": "app_services_providers_direct_rss_client_directrssprovider_fetch_and_parse_feed", - "target": "app_models_article", + "source": "app_models", + "target": "app_models_viewcountresponse", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L141", + "source_file": "app/routes/news.py", + "source_location": "L2", "weight": 1.0, - "source": "app_services_providers_direct_rss_client_directrssprovider_fetch_news", - "target": "app_models_article", + "source": "app_routes_news", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/direct_rss/client.py", - "source_location": "L292", + "source_file": "app/routes/search.py", + "source_location": "L2", "weight": 1.0, - "source": "app_services_providers_direct_rss_client_directrssprovider_parse_feed_xml", - "target": "app_models_article", + "source": "app_routes_search", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L48", + "source_file": "app/services/appwrite_db.py", + "source_location": "L27", "weight": 1.0, - "source": "app_services_providers_hackernews_client", - "target": "app_models_article", + "source": "app_services_appwrite_db", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L48", - "weight": 0.8, - "source": "app_services_providers_hackernews_client_hackernewsprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/services/cache_service.py", + "source_location": "L19", + "weight": 1.0, + "source": "app_services_cache_service", + "target": "app_models", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L322", + "source_file": "app/services/news_aggregator.py", + "source_location": "L7", "weight": 1.0, - "source": "app_services_providers_hackernews_client_hackernewsprovider_enrich_article_images", - "target": "app_models_article", + "source": "app_services_news_aggregator", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L92", + "source_file": "app/services/news_processor.py", + "source_location": "L10", "weight": 1.0, - "source": "app_services_providers_hackernews_client_hackernewsprovider_fetch_news", - "target": "app_models_article", + "source": "app_services_news_processor", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/hackernews/client.py", - "source_location": "L228", + "source_file": "app/services/news_providers.py", + "source_location": "L6", "weight": 1.0, - "source": "app_services_providers_hackernews_client_hackernewsprovider_map_items_to_articles", - "target": "app_models_article", + "source": "app_services_news_providers", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L53", + "source_file": "app/services/providers/base.py", + "source_location": "L64", "weight": 1.0, - "source": "app_services_providers_inshorts_client", - "target": "app_models_article", + "source": "app_services_providers_base", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L53", - "weight": 0.8, - "source": "app_services_providers_inshorts_client_inshortsprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L58", + "weight": 1.0, + "source": "app_services_providers_direct_rss_client", + "target": "app_models", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L113", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L48", "weight": 1.0, - "source": "app_services_providers_inshorts_client_inshortsprovider_fetch_news", - "target": "app_models_article", + "source": "app_services_providers_hackernews_client", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/providers/inshorts/client.py", - "source_location": "L288", + "source_location": "L53", "weight": 1.0, - "source": "app_services_providers_inshorts_client_inshortsprovider_map_articles", - "target": "app_models_article", + "source": "app_services_providers_inshorts_client", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/providers/openrss/client.py", "source_location": "L76", "weight": 1.0, "source": "app_services_providers_openrss_client", - "target": "app_models_article", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L76", - "weight": 0.8, - "source": "app_services_providers_openrss_client_openrssprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L247", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L52", "weight": 1.0, - "source": "app_services_providers_openrss_client_openrssprovider_fetch_and_parse_feed", - "target": "app_models_article", + "source": "app_services_providers_sauravkanchan_client", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L149", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L52", "weight": 1.0, - "source": "app_services_providers_openrss_client_openrssprovider_fetch_news", - "target": "app_models_article", + "source": "app_services_providers_thenewsapi_client", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/openrss/client.py", - "source_location": "L301", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L75", "weight": 1.0, - "source": "app_services_providers_openrss_client_openrssprovider_parse_feed_xml", - "target": "app_models_article", + "source": "app_services_providers_webz_client", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L52", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L70", "weight": 1.0, - "source": "app_services_providers_sauravkanchan_client", - "target": "app_models_article", + "source": "app_services_providers_wikinews_client", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L52", - "weight": 0.8, - "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider", - "target": "app_models_article", - "confidence_score": 0.5 + "relation": "imports_from", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/services/providers/worldnewsai/client.py", + "source_location": "L54", + "weight": 1.0, + "source": "app_services_providers_worldnewsai_client", + "target": "app_models", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L128", + "source_file": "app/services/rss_parser.py", + "source_location": "L4", "weight": 1.0, - "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_news", - "target": "app_models_article", + "source": "app_services_rss_parser", + "target": "app_models", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L214", + "source_file": "app/models.py", + "source_location": "L34", "weight": 1.0, - "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_single_region", - "target": "app_models_article", + "source": "app_models_article", + "target": "app_models_article_parse_datetime", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/services/providers/sauravkanchan/client.py", - "source_location": "L286", + "source_file": "app/models.py", + "source_location": "L6", "weight": 1.0, - "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_map_articles", - "target": "app_models_article", + "source": "app_models_article", + "target": "basemodel", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L52", + "source_file": "app/services/appwrite_db.py", + "source_location": "L27", "weight": 1.0, - "source": "app_services_providers_thenewsapi_client", + "source": "app_services_appwrite_db", "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "uses", "confidence": "INFERRED", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L52", + "source_file": "app/services/appwrite_db.py", + "source_location": "L27", "weight": 0.8, - "source": "app_services_providers_thenewsapi_client_thenewsapiprovider", + "source": "app_services_appwrite_db_appwritedatabase", "target": "app_models_article", "confidence_score": 0.5 }, { - "relation": "references", - "context": "generic_arg", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L140", - "weight": 1.0, - "source": "app_services_providers_thenewsapi_client_thenewsapiprovider_fetch_news", - "target": "app_models_article", - "confidence_score": 1.0 - }, - { - "relation": "references", - "context": "generic_arg", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/thenewsapi/client.py", - "source_location": "L257", - "weight": 1.0, - "source": "app_services_providers_thenewsapi_client_thenewsapiprovider_map_articles", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/appwrite_db.py", + "source_location": "L27", + "weight": 0.8, + "source": "app_services_appwrite_db_tablesdbwrapper", "target": "app_models_article", - "confidence_score": 1.0 + "confidence_score": 0.5 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L75", + "source_file": "app/services/cache_service.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_providers_webz_client", + "source": "app_services_cache_service", "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "uses", "confidence": "INFERRED", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L75", + "source_file": "app/services/cache_service.py", + "source_location": "L19", "weight": 0.8, - "source": "app_services_providers_webz_client_webzprovider", + "source": "app_services_cache_service_cacheservice", "target": "app_models_article", "confidence_score": 0.5 }, @@ -12670,10 +11622,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L165", + "source_file": "app/services/cache_service.py", + "source_location": "L75", "weight": 1.0, - "source": "app_services_providers_webz_client_webzprovider_fetch_news", + "source": "app_services_cache_service_cacheservice_get", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12681,10 +11633,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/providers/webz/client.py", - "source_location": "L320", + "source_file": "app/services/cache_service.py", + "source_location": "L111", "weight": 1.0, - "source": "app_services_providers_webz_client_webzprovider_map_articles", + "source": "app_services_cache_service_cacheservice_set", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12692,20 +11644,20 @@ "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L70", + "source_file": "app/services/news_aggregator.py", + "source_location": "L7", "weight": 1.0, - "source": "app_services_providers_wikinews_client", + "source": "app_services_news_aggregator", "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "uses", "confidence": "INFERRED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L70", + "source_file": "app/services/news_aggregator.py", + "source_location": "L7", "weight": 0.8, - "source": "app_services_providers_wikinews_client_wikinewsprovider", + "source": "app_services_news_aggregator_newsaggregator", "target": "app_models_article", "confidence_score": 0.5 }, @@ -12713,10 +11665,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L384", + "source_file": "app/services/news_aggregator.py", + "source_location": "L203", "weight": 1.0, - "source": "app_services_providers_wikinews_client_wikinewsprovider_enrich_article_images", + "source": "app_services_news_aggregator_newsaggregator_fetch_by_category", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12724,10 +11676,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L123", + "source_file": "app/services/news_aggregator.py", + "source_location": "L436", "weight": 1.0, - "source": "app_services_providers_wikinews_client_wikinewsprovider_fetch_news", + "source": "app_services_news_aggregator_newsaggregator_fetch_from_provider", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12735,10 +11687,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L271", + "source_file": "app/services/news_aggregator.py", + "source_location": "L448", "weight": 1.0, - "source": "app_services_providers_wikinews_client_wikinewsprovider_map_search_hits", + "source": "app_services_news_aggregator_newsaggregator_fetch_rss", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12746,10 +11698,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/providers/wikinews/client.py", - "source_location": "L175", + "source_file": "app/services/news_aggregator.py", + "source_location": "L465", "weight": 1.0, - "source": "app_services_providers_wikinews_client_wikinewsprovider_query_category", + "source": "app_services_news_aggregator_newsaggregator_search", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12757,42 +11709,10 @@ "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/providers/worldnewsai/client.py", - "source_location": "L54", - "weight": 1.0, - "source": "app_services_providers_worldnewsai_client", - "target": "app_models_article", - "confidence_score": 1.0 - }, - { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/providers/worldnewsai/client.py", - "source_location": "L54", - "weight": 0.8, - "source": "app_services_providers_worldnewsai_client_worldnewsaiprovider", - "target": "app_models_article", - "confidence_score": 0.5 - }, - { - "relation": "references", - "context": "generic_arg", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/worldnewsai/client.py", - "source_location": "L139", - "weight": 1.0, - "source": "app_services_providers_worldnewsai_client_worldnewsaiprovider_fetch_news", - "target": "app_models_article", - "confidence_score": 1.0 - }, - { - "relation": "references", - "context": "generic_arg", - "confidence": "EXTRACTED", - "source_file": "app/services/providers/worldnewsai/client.py", - "source_location": "L277", + "source_file": "app/services/news_processor.py", + "source_location": "L10", "weight": 1.0, - "source": "app_services_providers_worldnewsai_client_worldnewsaiprovider_map_articles", + "source": "app_services_news_processor", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12800,20 +11720,20 @@ "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/rss_parser.py", - "source_location": "L4", + "source_file": "app/services/news_providers.py", + "source_location": "L6", "weight": 1.0, - "source": "app_services_rss_parser", + "source": "app_services_news_providers", "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "uses", "confidence": "INFERRED", - "source_file": "app/services/rss_parser.py", - "source_location": "L4", + "source_file": "app/services/news_providers.py", + "source_location": "L6", "weight": 0.8, - "source": "app_services_rss_parser_rssparser", + "source": "app_services_news_providers_gnewsprovider", "target": "app_models_article", "confidence_score": 0.5 }, @@ -12821,10 +11741,10 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/rss_parser.py", - "source_location": "L13", + "source_file": "app/services/news_providers.py", + "source_location": "L107", "weight": 1.0, - "source": "app_services_rss_parser_rssparser_parse_google_news", + "source": "app_services_news_providers_gnewsprovider_fetch_news", "target": "app_models_article", "confidence_score": 1.0 }, @@ -12832,765 +11752,891 @@ "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/rss_parser.py", - "source_location": "L139", - "weight": 1.0, - "source": "app_services_rss_parser_rssparser_parse_provider_rss", - "target": "app_models_article", - "confidence_score": 1.0 - }, - { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L418", + "source_file": "app/services/news_providers.py", + "source_location": "L179", "weight": 1.0, - "source": "app_services_scheduler", + "source": "app_services_news_providers_gnewsprovider_parse_response", "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", - "confidence": "INFERRED", - "source_file": "C:/Users/Dell/Desktop/Segmento-app-website-dev/SegmentoPulse-Backend/SegmentoPulse/backend/app/services/scheduler.py", - "source_location": "L706", - "weight": 1.0, - "confidence_score": 0.8, - "source": "app_services_scheduler_background_image_enricher_job", - "target": "app_models_article" - }, - { - "relation": "calls", - "context": "call", + "relation": "uses", "confidence": "INFERRED", - "source_file": "C:/Users/Dell/Desktop/Segmento-app-website-dev/SegmentoPulse-Backend/SegmentoPulse/backend/app/services/scheduler.py", - "source_location": "L455", - "weight": 1.0, - "confidence_score": 0.8, - "source": "app_services_scheduler_fetch_and_validate_category", - "target": "app_models_article" - }, - { - "relation": "inherits", - "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L85", - "weight": 1.0, - "source": "app_models_errorresponse", - "target": "basemodel", - "confidence_score": 1.0 + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_googlenewsrssprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "inherits", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L58", + "source_file": "app/services/news_providers.py", + "source_location": "L476", "weight": 1.0, - "source": "app_models_newsresponse", - "target": "basemodel", + "source": "app_services_news_providers_googlenewsrssprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", - "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L68", - "weight": 1.0, - "source": "app_models_searchresponse", - "target": "basemodel", - "confidence_score": 1.0 + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_mediumrssprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "inherits", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L75", + "source_file": "app/services/news_providers.py", + "source_location": "L532", "weight": 1.0, - "source": "app_models_viewcountrequest", - "target": "basemodel", + "source": "app_services_news_providers_mediumrssprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", - "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L79", - "weight": 1.0, - "source": "app_models_viewcountresponse", - "target": "basemodel", - "confidence_score": 1.0 + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_newsapiprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "inherits", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L13", + "source_file": "app/services/news_providers.py", + "source_location": "L241", "weight": 1.0, - "source": "app_routes_audio_audiogenerationrequest", - "target": "basemodel", + "source": "app_services_news_providers_newsapiprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L20", + "source_file": "app/services/news_providers.py", + "source_location": "L314", "weight": 1.0, - "source": "app_routes_audio_audioresponse", - "target": "basemodel", + "source": "app_services_news_providers_newsapiprovider_parse_response", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_newsdataprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L22", + "source_file": "app/services/news_providers.py", + "source_location": "L375", "weight": 1.0, - "source": "app_routes_engagement_engagementrequest", - "target": "basemodel", + "source": "app_services_news_providers_newsdataprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L17", + "source_file": "app/services/news_providers.py", + "source_location": "L421", "weight": 1.0, - "source": "app_routes_subscription_subscriberequest", - "target": "basemodel", + "source": "app_services_news_providers_newsdataprovider_parse_response", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_newsprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", + "source_file": "app/services/news_providers.py", "source_location": "L32", "weight": 1.0, - "source": "app_routes_subscription_subscriberesponse", - "target": "basemodel", + "source": "app_services_news_providers_newsprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "inherits", - "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L172", - "weight": 1.0, - "source": "app_routes_subscription_unsubscriberequest", - "target": "basemodel", - "confidence_score": 1.0 + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_officialcloudprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "inherits", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L38", + "source_file": "app/services/news_providers.py", + "source_location": "L651", "weight": 1.0, - "source": "app_routes_subscription_unsubscriberesponse", - "target": "basemodel", + "source": "app_services_news_providers_officialcloudprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/news_providers.py", + "source_location": "L6", + "weight": 0.8, + "source": "app_services_news_providers_providerstatus", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L35", + "source_file": "app/services/providers/base.py", + "source_location": "L64", "weight": 1.0, - "source": "app_models_rationale_35", - "target": "app_models_article_parse_datetime", + "source": "app_services_providers_base", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/base.py", + "source_location": "L64", + "weight": 0.8, + "source": "app_services_providers_base_newsprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L59", + "source_file": "app/services/providers/base.py", + "source_location": "L128", "weight": 1.0, - "source": "app_models_rationale_59", - "target": "app_models_newsresponse", + "source": "app_services_providers_base_newsprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, + { + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/base.py", + "source_location": "L64", + "weight": 0.8, + "source": "app_services_providers_base_providerstatus", + "target": "app_models_article", + "confidence_score": 0.5 + }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L2", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L58", "weight": 1.0, - "source": "app_routes_news", - "target": "app_models_newsresponse", + "source": "app_services_providers_direct_rss_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L58", + "weight": 0.8, + "source": "app_services_providers_direct_rss_client_directrssprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/news.py", - "source_location": "L173", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L242", "weight": 1.0, - "source": "app_routes_news_get_news_by_category", - "target": "app_models_newsresponse" + "source": "app_services_providers_direct_rss_client_directrssprovider_fetch_and_parse_feed", + "target": "app_models_article", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/news.py", - "source_location": "L274", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L141", "weight": 1.0, - "source": "app_routes_news_get_rss_feed", - "target": "app_models_newsresponse" + "source": "app_services_providers_direct_rss_client_directrssprovider_fetch_news", + "target": "app_models_article", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/news.py", - "source_location": "L30", + "source_file": "app/services/providers/direct_rss/client.py", + "source_location": "L292", "weight": 1.0, - "source": "app_routes_news_get_umbrella_news", - "target": "app_models_newsresponse" + "source": "app_services_providers_direct_rss_client_directrssprovider_parse_feed_xml", + "target": "app_models_article", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L69", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L48", "weight": 1.0, - "source": "app_models_rationale_69", - "target": "app_models_searchresponse", + "source": "app_services_providers_hackernews_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L48", + "weight": 0.8, + "source": "app_services_providers_hackernews_client_hackernewsprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L2", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L322", "weight": 1.0, - "source": "app_routes_search", - "target": "app_models_searchresponse", + "source": "app_services_providers_hackernews_client_hackernewsprovider_enrich_article_images", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/search.py", - "source_location": "L23", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L92", "weight": 1.0, - "source": "app_routes_search_search_news", - "target": "app_models_searchresponse" + "source": "app_services_providers_hackernews_client_hackernewsprovider_fetch_news", + "target": "app_models_article", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L76", + "source_file": "app/services/providers/hackernews/client.py", + "source_location": "L228", "weight": 1.0, - "source": "app_models_rationale_76", - "target": "app_models_viewcountrequest", + "source": "app_services_providers_hackernews_client_hackernewsprovider_map_items_to_articles", + "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L2", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L53", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_models_viewcountrequest", + "source": "app_services_providers_inshorts_client", + "target": "app_models_article", "confidence_score": 1.0 }, + { + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L53", + "weight": 0.8, + "source": "app_services_providers_inshorts_client_inshortsprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, { "relation": "references", - "context": "parameter_type", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L9", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L113", "weight": 1.0, - "source": "app_routes_analytics_increment_view_count", - "target": "app_models_viewcountrequest", + "source": "app_services_providers_inshorts_client_inshortsprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/models.py", - "source_location": "L80", + "source_file": "app/services/providers/inshorts/client.py", + "source_location": "L288", "weight": 1.0, - "source": "app_models_rationale_80", - "target": "app_models_viewcountresponse", + "source": "app_services_providers_inshorts_client_inshortsprovider_map_articles", + "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L2", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L76", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_models_viewcountresponse", + "source": "app_services_providers_openrss_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/analytics.py", - "source_location": "L31", - "weight": 1.0, - "source": "app_routes_analytics_get_view_count", - "target": "app_models_viewcountresponse" + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L76", + "weight": 0.8, + "source": "app_services_providers_openrss_client_openrssprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/analytics.py", - "source_location": "L15", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L247", "weight": 1.0, - "source": "app_routes_analytics_increment_view_count", - "target": "app_models_viewcountresponse" + "source": "app_services_providers_openrss_client_openrssprovider_fetch_and_parse_feed", + "target": "app_models_article", + "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L2", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L149", "weight": 1.0, - "source": "app_routes_news", - "target": "app_models_errorresponse", + "source": "app_services_providers_openrss_client_openrssprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L659", + "source_file": "app/services/providers/openrss/client.py", + "source_location": "L301", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_bloom_filter_health_check", + "source": "app_services_providers_openrss_client_openrssprovider_parse_feed_xml", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L172", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L52", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_cleanup_old_articles", + "source": "app_services_providers_sauravkanchan_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L116", - "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_clear_cache", - "confidence_score": 1.0 + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L52", + "weight": 0.8, + "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L597", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L128", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_get_bloom_filter_stats", + "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L77", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L214", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_get_cache_stats", + "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_fetch_single_region", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L144", + "source_file": "app/services/providers/sauravkanchan/client.py", + "source_location": "L286", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_get_database_stats", + "source": "app_services_providers_sauravkanchan_client_sauravkanchanprovider_map_articles", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L343", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L52", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_get_scheduler_status", + "source": "app_services_providers_thenewsapi_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L52", + "weight": 0.8, + "source": "app_services_providers_thenewsapi_client_thenewsapiprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L419", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L140", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_get_subscriber_analytics", + "source": "app_services_providers_thenewsapi_client_thenewsapiprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L202", + "source_file": "app/services/providers/thenewsapi/client.py", + "source_location": "L257", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_populate_database", + "source": "app_services_providers_thenewsapi_client_thenewsapiprovider_map_articles", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L490", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L75", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_preview_newsletter_content", + "source": "app_services_providers_webz_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L75", + "weight": 0.8, + "source": "app_services_providers_webz_client_webzprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L535", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L165", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_reset_bloom_filter", + "source": "app_services_providers_webz_client_webzprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L752", + "source_file": "app/services/providers/webz/client.py", + "source_location": "L320", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_reset_circuit_breakers", + "source": "app_services_providers_webz_client_webzprovider_map_articles", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L378", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L70", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_send_newsletter_now", + "source": "app_services_providers_wikinews_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L70", + "weight": 0.8, + "source": "app_services_providers_wikinews_client_wikinewsprovider", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L314", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L384", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_trigger_cleanup_job", + "source": "app_services_providers_wikinews_client_wikinewsprovider_enrich_article_images", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L287", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L123", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_trigger_fetch_job", + "source": "app_services_providers_wikinews_client_wikinewsprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L17", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L271", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_warm_cache", + "source": "app_services_providers_wikinews_client_wikinewsprovider_map_search_hits", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L35", + "source_file": "app/services/providers/wikinews/client.py", + "source_location": "L175", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_routes_admin_warm_cache_background", + "source": "app_services_providers_wikinews_client_wikinewsprovider_query_category", + "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L154", + "source_file": "app/services/providers/worldnewsai/client.py", + "source_location": "L54", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_providers_worldnewsai_client", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L5", - "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_cache_service", - "confidence_score": 1.0 + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/providers/worldnewsai/client.py", + "source_location": "L54", + "weight": 0.8, + "source": "app_services_providers_worldnewsai_client_worldnewsaiprovider", + "target": "app_models_article", + "confidence_score": 0.5 }, { - "relation": "imports", - "context": "import", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L5", + "source_file": "app/services/providers/worldnewsai/client.py", + "source_location": "L139", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_providers_worldnewsai_client_worldnewsaiprovider_fetch_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L6", + "source_file": "app/services/providers/worldnewsai/client.py", + "source_location": "L277", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_circuit_breaker", + "source": "app_services_providers_worldnewsai_client_worldnewsaiprovider_map_articles", + "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L6", + "source_file": "app/services/rss_parser.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_circuit_breaker_get_circuit_breaker", + "source": "app_services_rss_parser", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/rss_parser.py", + "source_location": "L4", + "weight": 0.8, + "source": "app_services_rss_parser_rssparser", + "target": "app_models_article", + "confidence_score": 0.5 + }, + { + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L557", + "source_file": "app/services/rss_parser.py", + "source_location": "L13", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_deduplication_get_url_filter", + "source": "app_services_rss_parser_rssparser_parse_google_news", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L504", + "source_file": "app/services/rss_parser.py", + "source_location": "L139", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_newsletter_service_preview_newsletter_content", + "source": "app_services_rss_parser_rssparser_parse_provider_rss", + "target": "app_models_article", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L40", + "source_file": "app/services/scheduler.py", + "source_location": "L418", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_scheduler_get_shared_aggregator", + "source": "app_services_scheduler", + "target": "app_models_article", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "source_file": "C:/Users/Dell/Desktop/Segmento-app-website-dev/SegmentoPulse-Backend/SegmentoPulse/backend/app/services/scheduler.py", + "source_location": "L706", + "weight": 1.0, + "confidence_score": 0.8, + "source": "app_services_scheduler_background_image_enricher_job", + "target": "app_models_article" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "source_file": "C:/Users/Dell/Desktop/Segmento-app-website-dev/SegmentoPulse-Backend/SegmentoPulse/backend/app/services/scheduler.py", + "source_location": "L455", + "weight": 1.0, + "confidence_score": 0.8, + "source": "app_services_scheduler_fetch_and_validate_category", + "target": "app_models_article" + }, + { + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L325", + "source_file": "app/models.py", + "source_location": "L85", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_scheduler_trigger_cleanup_now", + "source": "app_models_errorresponse", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L296", + "source_file": "app/models.py", + "source_location": "L58", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_scheduler_trigger_fetch_now", + "source": "app_models_newsresponse", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L391", + "source_file": "app/models.py", + "source_location": "L68", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_scheduler_trigger_newsletter_now", + "source": "app_models_searchresponse", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L772", + "source_file": "app/models.py", + "source_location": "L75", "weight": 1.0, - "source": "app_routes_admin", - "target": "app_services_upstash_cache_get_upstash_cache", + "source": "app_models_viewcountrequest", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L18", + "source_file": "app/models.py", + "source_location": "L79", "weight": 1.0, - "source": "app_routes_admin_rationale_18", - "target": "app_routes_admin_warm_cache", + "source": "app_models_viewcountresponse", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "indirect_call", - "context": "argument", - "confidence": "INFERRED", - "source_file": "app/routes/admin.py", - "source_location": "L28", + "relation": "inherits", + "confidence": "EXTRACTED", + "source_file": "app/routes/audio.py", + "source_location": "L13", "weight": 1.0, - "source": "app_routes_admin_warm_cache", - "target": "app_routes_admin_warm_cache_background", - "confidence_score": 0.5 + "source": "app_routes_audio_audiogenerationrequest", + "target": "basemodel", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "parameter_type", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L17", + "source_file": "app/routes/audio.py", + "source_location": "L20", "weight": 1.0, - "source": "app_routes_admin_warm_cache", - "target": "backgroundtasks", + "source": "app_routes_audio_audioresponse", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L36", + "source_file": "app/routes/engagement.py", + "source_location": "L22", "weight": 1.0, - "source": "app_routes_admin_rationale_36", - "target": "app_routes_admin_warm_cache_background", + "source": "app_routes_engagement_engagementrequest", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L44", + "source_file": "app/routes/subscription.py", + "source_location": "L17", "weight": 1.0, - "source": "app_routes_admin_warm_cache_background", - "target": "app_services_cache_service_cacheservice", + "source": "app_routes_subscription_subscriberequest", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L43", + "source_file": "app/routes/subscription.py", + "source_location": "L32", "weight": 1.0, - "source": "app_routes_admin_warm_cache_background", - "target": "app_services_scheduler_get_shared_aggregator", + "source": "app_routes_subscription_subscriberesponse", + "target": "basemodel", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "inherits", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L88", + "source_file": "app/routes/subscription.py", + "source_location": "L172", "weight": 1.0, - "source": "app_routes_admin_get_cache_stats", - "target": "app_services_cache_service_cacheservice" + "source": "app_routes_subscription_unsubscriberequest", + "target": "basemodel", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "inherits", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L91", + "source_file": "app/routes/subscription.py", + "source_location": "L38", "weight": 1.0, - "source": "app_routes_admin_get_cache_stats", - "target": "app_services_scheduler_get_shared_aggregator" + "source": "app_routes_subscription_unsubscriberesponse", + "target": "basemodel", + "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L78", + "source_file": "app/models.py", + "source_location": "L35", "weight": 1.0, - "source": "app_routes_admin_rationale_78", - "target": "app_routes_admin_get_cache_stats", + "source": "app_models_rationale_35", + "target": "app_models_article_parse_datetime", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L122", + "source_file": "app/models.py", + "source_location": "L59", "weight": 1.0, - "source": "app_routes_admin_clear_cache", - "target": "app_services_cache_service_cacheservice" + "source": "app_models_rationale_59", + "target": "app_models_newsresponse", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L117", + "source_file": "app/routes/news.py", + "source_location": "L2", "weight": 1.0, - "source": "app_routes_admin_rationale_117", - "target": "app_routes_admin_clear_cache", + "source": "app_routes_news", + "target": "app_models_newsresponse", "confidence_score": 1.0 }, { @@ -13598,504 +12644,535 @@ "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L157", + "source_file": "app/routes/news.py", + "source_location": "L173", "weight": 1.0, - "source": "app_routes_admin_get_database_stats", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_news_get_news_by_category", + "target": "app_models_newsresponse" }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L145", + "confidence_score": 1.0, + "source_file": "app/routes/news.py", + "source_location": "L274", "weight": 1.0, - "source": "app_routes_admin_rationale_145", - "target": "app_routes_admin_get_database_stats", - "confidence_score": 1.0 + "source": "app_routes_news_get_rss_feed", + "target": "app_models_newsresponse" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L185", + "source_file": "app/routes/news.py", + "source_location": "L30", "weight": 1.0, - "source": "app_routes_admin_cleanup_old_articles", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_news_get_umbrella_news", + "target": "app_models_newsresponse" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L173", + "source_file": "app/models.py", + "source_location": "L69", "weight": 1.0, - "source": "app_routes_admin_rationale_173", - "target": "app_routes_admin_cleanup_old_articles", + "source": "app_models_rationale_69", + "target": "app_models_searchresponse", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L216", + "source_file": "app/routes/search.py", + "source_location": "L2", "weight": 1.0, - "source": "app_routes_admin_populate_database", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_search", + "target": "app_models_searchresponse", + "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/admin.py", - "source_location": "L220", + "source_file": "app/routes/search.py", + "source_location": "L23", "weight": 1.0, - "source": "app_routes_admin_populate_database", - "target": "app_services_scheduler_get_shared_aggregator" + "source": "app_routes_search_search_news", + "target": "app_models_searchresponse" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L203", + "source_file": "app/models.py", + "source_location": "L76", "weight": 1.0, - "source": "app_routes_admin_rationale_203", - "target": "app_routes_admin_populate_database", + "source": "app_models_rationale_76", + "target": "app_models_viewcountrequest", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/admin.py", - "source_location": "L288", + "source_file": "app/models.py", + "source_location": "L80", "weight": 1.0, - "source": "app_routes_admin_rationale_288", - "target": "app_routes_admin_trigger_fetch_job", + "source": "app_models_rationale_80", + "target": "app_models_viewcountresponse", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/routes/news.py", + "source_location": "L2", + "weight": 1.0, + "source": "app_routes_news", + "target": "app_models_errorresponse", + "confidence_score": 1.0 + }, + { + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L299", + "source_location": "L659", "weight": 1.0, - "source": "app_routes_admin_trigger_fetch_job", - "target": "app_services_scheduler_trigger_fetch_now" + "source": "app_routes_admin", + "target": "app_routes_admin_bloom_filter_health_check", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L315", + "source_location": "L172", "weight": 1.0, - "source": "app_routes_admin_rationale_315", - "target": "app_routes_admin_trigger_cleanup_job", + "source": "app_routes_admin", + "target": "app_routes_admin_cleanup_old_articles", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L328", + "source_location": "L116", "weight": 1.0, - "source": "app_routes_admin_trigger_cleanup_job", - "target": "app_services_scheduler_trigger_cleanup_now" + "source": "app_routes_admin", + "target": "app_routes_admin_clear_cache", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L344", + "source_location": "L597", "weight": 1.0, - "source": "app_routes_admin_rationale_344", - "target": "app_routes_admin_get_scheduler_status", + "source": "app_routes_admin", + "target": "app_routes_admin_get_bloom_filter_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L379", + "source_location": "L77", "weight": 1.0, - "source": "app_routes_admin_rationale_379", - "target": "app_routes_admin_send_newsletter_now", + "source": "app_routes_admin", + "target": "app_routes_admin_get_cache_stats", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L402", + "source_location": "L144", "weight": 1.0, - "source": "app_routes_admin_send_newsletter_now", - "target": "app_services_scheduler_trigger_newsletter_now" + "source": "app_routes_admin", + "target": "app_routes_admin_get_database_stats", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L432", + "source_location": "L343", "weight": 1.0, - "source": "app_routes_admin_get_subscriber_analytics", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_admin", + "target": "app_routes_admin_get_scheduler_status", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", - "confidence": "INFERRED", - "confidence_score": 0.8, + "relation": "contains", + "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L455", + "source_location": "L419", "weight": 1.0, - "source": "app_routes_admin_get_subscriber_analytics", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_admin", + "target": "app_routes_admin_get_subscriber_analytics", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L420", + "source_location": "L202", "weight": 1.0, - "source": "app_routes_admin_rationale_420", - "target": "app_routes_admin_get_subscriber_analytics", + "source": "app_routes_admin", + "target": "app_routes_admin_populate_database", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L491", + "source_location": "L490", "weight": 1.0, - "source": "app_routes_admin_rationale_491", + "source": "app_routes_admin", "target": "app_routes_admin_preview_newsletter_content", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L536", + "source_location": "L535", "weight": 1.0, - "source": "app_routes_admin_rationale_536", + "source": "app_routes_admin", "target": "app_routes_admin_reset_bloom_filter", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L560", + "source_location": "L752", "weight": 1.0, - "source": "app_routes_admin_reset_bloom_filter", - "target": "app_services_deduplication_get_url_filter" + "source": "app_routes_admin", + "target": "app_routes_admin_reset_circuit_breakers", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L617", + "source_location": "L378", "weight": 1.0, - "source": "app_routes_admin_get_bloom_filter_stats", - "target": "app_services_deduplication_get_url_filter" + "source": "app_routes_admin", + "target": "app_routes_admin_send_newsletter_now", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L598", + "source_location": "L314", "weight": 1.0, - "source": "app_routes_admin_rationale_598", - "target": "app_routes_admin_get_bloom_filter_stats", + "source": "app_routes_admin", + "target": "app_routes_admin_trigger_cleanup_job", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L678", + "source_location": "L287", "weight": 1.0, - "source": "app_routes_admin_bloom_filter_health_check", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_admin", + "target": "app_routes_admin_trigger_fetch_job", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L676", + "source_location": "L17", "weight": 1.0, - "source": "app_routes_admin_bloom_filter_health_check", - "target": "app_services_deduplication_get_url_filter" + "source": "app_routes_admin", + "target": "app_routes_admin_warm_cache", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L660", + "source_location": "L35", "weight": 1.0, - "source": "app_routes_admin_rationale_660", - "target": "app_routes_admin_bloom_filter_health_check", + "source": "app_routes_admin", + "target": "app_routes_admin_warm_cache_background", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/routes/admin.py", - "source_location": "L753", + "source_location": "L154", "weight": 1.0, - "source": "app_routes_admin_rationale_753", - "target": "app_routes_admin_reset_circuit_breakers", + "source": "app_routes_admin", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L774", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_admin_reset_circuit_breakers", - "target": "app_services_circuit_breaker_get_circuit_breaker" + "source": "app_routes_admin", + "target": "app_services_cache_service", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/admin.py", - "source_location": "L778", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_admin_reset_circuit_breakers", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_routes_admin", + "target": "app_services_cache_service_cacheservice", + "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L25", + "source_file": "app/routes/admin.py", + "source_location": "L6", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_routes_analytics_get_view_count", + "source": "app_routes_admin", + "target": "app_services_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L9", + "source_file": "app/routes/admin.py", + "source_location": "L6", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_routes_analytics_increment_view_count", + "source": "app_routes_admin", + "target": "app_services_circuit_breaker_get_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L3", + "source_file": "app/routes/admin.py", + "source_location": "L557", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_services_firebase_service", + "source": "app_routes_admin", + "target": "app_services_deduplication_get_url_filter", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L3", + "source_file": "app/routes/admin.py", + "source_location": "L504", "weight": 1.0, - "source": "app_routes_analytics", - "target": "app_services_firebase_service_firebaseservice", + "source": "app_routes_admin", + "target": "app_services_newsletter_service_preview_newsletter_content", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L10", + "source_file": "app/routes/admin.py", + "source_location": "L40", "weight": 1.0, - "source": "app_routes_analytics_rationale_10", - "target": "app_routes_analytics_increment_view_count", + "source": "app_routes_admin", + "target": "app_services_scheduler_get_shared_aggregator", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/analytics.py", - "source_location": "L26", + "source_file": "app/routes/admin.py", + "source_location": "L325", "weight": 1.0, - "source": "app_routes_analytics_rationale_26", - "target": "app_routes_analytics_get_view_count", + "source": "app_routes_admin", + "target": "app_services_scheduler_trigger_cleanup_now", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L13", + "source_file": "app/routes/admin.py", + "source_location": "L296", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_routes_audio_audiogenerationrequest", + "source": "app_routes_admin", + "target": "app_services_scheduler_trigger_fetch_now", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L20", + "source_file": "app/routes/admin.py", + "source_location": "L391", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_routes_audio_audioresponse", + "source": "app_routes_admin", + "target": "app_services_scheduler_trigger_newsletter_now", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L27", + "source_file": "app/routes/admin.py", + "source_location": "L772", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_routes_audio_find_article", + "source": "app_routes_admin", + "target": "app_services_upstash_cache_get_upstash_cache", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L107", + "source_file": "app/routes/admin.py", + "source_location": "L18", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_routes_audio_generate_audio_summary", + "source": "app_routes_admin_rationale_18", + "target": "app_routes_admin_warm_cache", "confidence_score": 1.0 }, { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L73", - "weight": 1.0, - "source": "app_routes_audio", - "target": "app_routes_audio_get_audio_status", - "confidence_score": 1.0 + "relation": "indirect_call", + "context": "argument", + "confidence": "INFERRED", + "source_file": "app/routes/admin.py", + "source_location": "L28", + "weight": 1.0, + "source": "app_routes_admin_warm_cache", + "target": "app_routes_admin_warm_cache_background", + "confidence_score": 0.5 }, { - "relation": "imports_from", - "context": "import", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L7", + "source_file": "app/routes/admin.py", + "source_location": "L17", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_services_appwrite_db", + "source": "app_routes_admin_warm_cache", + "target": "backgroundtasks", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L7", + "source_file": "app/routes/admin.py", + "source_location": "L36", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_routes_admin_rationale_36", + "target": "app_routes_admin_warm_cache_background", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L8", + "source_file": "app/routes/admin.py", + "source_location": "L44", "weight": 1.0, - "source": "app_routes_audio", - "target": "app_services_audio_service", + "source": "app_routes_admin_warm_cache_background", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "references", - "context": "parameter_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L107", + "source_file": "app/routes/admin.py", + "source_location": "L43", "weight": 1.0, - "source": "app_routes_audio_generate_audio_summary", - "target": "app_routes_audio_audiogenerationrequest", + "source": "app_routes_admin_warm_cache_background", + "target": "app_services_scheduler_get_shared_aggregator", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L176", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L88", "weight": 1.0, - "source": "app_routes_audio_generate_audio_summary", - "target": "app_routes_audio_audioresponse", - "confidence_score": 1.0 + "source": "app_routes_admin_get_cache_stats", + "target": "app_services_cache_service_cacheservice" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L86", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L91", "weight": 1.0, - "source": "app_routes_audio_get_audio_status", - "target": "app_routes_audio_audioresponse", + "source": "app_routes_admin_get_cache_stats", + "target": "app_services_scheduler_get_shared_aggregator" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/routes/admin.py", + "source_location": "L78", + "weight": 1.0, + "source": "app_routes_admin_rationale_78", + "target": "app_routes_admin_get_cache_stats", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L130", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L122", "weight": 1.0, - "source": "app_routes_audio_generate_audio_summary", - "target": "app_routes_audio_find_article", + "source": "app_routes_admin_clear_cache", + "target": "app_services_cache_service_cacheservice" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/routes/admin.py", + "source_location": "L117", + "weight": 1.0, + "source": "app_routes_admin_rationale_117", + "target": "app_routes_admin_clear_cache", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L83", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L157", "weight": 1.0, - "source": "app_routes_audio_get_audio_status", - "target": "app_routes_audio_find_article", - "confidence_score": 1.0 + "source": "app_routes_admin_get_database_stats", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L28", + "source_file": "app/routes/admin.py", + "source_location": "L145", "weight": 1.0, - "source": "app_routes_audio_rationale_28", - "target": "app_routes_audio_find_article", + "source": "app_routes_admin_rationale_145", + "target": "app_routes_admin_get_database_stats", "confidence_score": 1.0 }, { @@ -14103,20 +13180,20 @@ "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/audio.py", - "source_location": "L78", + "source_file": "app/routes/admin.py", + "source_location": "L185", "weight": 1.0, - "source": "app_routes_audio_get_audio_status", + "source": "app_routes_admin_cleanup_old_articles", "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L74", + "source_file": "app/routes/admin.py", + "source_location": "L173", "weight": 1.0, - "source": "app_routes_audio_rationale_74", - "target": "app_routes_audio_get_audio_status", + "source": "app_routes_admin_rationale_173", + "target": "app_routes_admin_cleanup_old_articles", "confidence_score": 1.0 }, { @@ -14124,369 +13201,400 @@ "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/audio.py", - "source_location": "L120", + "source_file": "app/routes/admin.py", + "source_location": "L216", "weight": 1.0, - "source": "app_routes_audio_generate_audio_summary", + "source": "app_routes_admin_populate_database", "target": "app_services_appwrite_db_get_appwrite_db" }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L220", + "weight": 1.0, + "source": "app_routes_admin_populate_database", + "target": "app_services_scheduler_get_shared_aggregator" + }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/audio.py", - "source_location": "L108", + "source_file": "app/routes/admin.py", + "source_location": "L203", "weight": 1.0, - "source": "app_routes_audio_rationale_108", - "target": "app_routes_audio_generate_audio_summary", + "source": "app_routes_admin_rationale_203", + "target": "app_routes_admin_populate_database", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L190", + "source_file": "app/routes/admin.py", + "source_location": "L288", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_dislike_article", + "source": "app_routes_admin_rationale_288", + "target": "app_routes_admin_trigger_fetch_job", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L22", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L299", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_engagementrequest", - "confidence_score": 1.0 + "source": "app_routes_admin_trigger_fetch_job", + "target": "app_services_scheduler_trigger_fetch_now" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L53", + "source_file": "app/routes/admin.py", + "source_location": "L315", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_get_article_stats", + "source": "app_routes_admin_rationale_315", + "target": "app_routes_admin_trigger_cleanup_job", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L374", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L328", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_get_popular_cloud_articles", - "confidence_score": 1.0 + "source": "app_routes_admin_trigger_cleanup_job", + "target": "app_services_scheduler_trigger_cleanup_now" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L305", + "source_file": "app/routes/admin.py", + "source_location": "L344", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_get_trending_articles", + "source": "app_routes_admin_rationale_344", + "target": "app_routes_admin_get_scheduler_status", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L129", + "source_file": "app/routes/admin.py", + "source_location": "L379", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_like_article", + "source": "app_routes_admin_rationale_379", + "target": "app_routes_admin_send_newsletter_now", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L29", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L402", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_resolve_article_id", - "confidence_score": 1.0 + "source": "app_routes_admin_send_newsletter_now", + "target": "app_services_scheduler_trigger_newsletter_now" }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L249", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L432", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_routes_engagement_track_view", - "confidence_score": 1.0 + "source": "app_routes_admin_get_subscriber_analytics", + "target": "app_services_appwrite_db_get_appwrite_db" + }, + { + "relation": "calls", + "context": "call", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "app/routes/admin.py", + "source_location": "L455", + "weight": 1.0, + "source": "app_routes_admin_get_subscriber_analytics", + "target": "app_services_appwrite_db_safe_get" }, { - "relation": "imports_from", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L10", + "source_file": "app/routes/admin.py", + "source_location": "L420", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_services_appwrite_db", + "source": "app_routes_admin_rationale_420", + "target": "app_routes_admin_get_subscriber_analytics", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L10", + "source_file": "app/routes/admin.py", + "source_location": "L491", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_routes_admin_rationale_491", + "target": "app_routes_admin_preview_newsletter_content", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L10", + "source_file": "app/routes/admin.py", + "source_location": "L536", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_services_appwrite_db_safe_get", + "source": "app_routes_admin_rationale_536", + "target": "app_routes_admin_reset_bloom_filter", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L12", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L560", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_utils_id_generator", - "confidence_score": 1.0 + "source": "app_routes_admin_reset_bloom_filter", + "target": "app_services_deduplication_get_url_filter" }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L12", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L617", "weight": 1.0, - "source": "app_routes_engagement", - "target": "app_utils_id_generator_generate_article_id", - "confidence_score": 1.0 + "source": "app_routes_admin_get_bloom_filter_stats", + "target": "app_services_deduplication_get_url_filter" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L1", + "source_file": "app/routes/admin.py", + "source_location": "L598", "weight": 1.0, - "source": "app_routes_engagement_rationale_1", - "target": "app_routes_engagement", + "source": "app_routes_admin_rationale_598", + "target": "app_routes_admin_get_bloom_filter_stats", "confidence_score": 1.0 }, { - "relation": "references", - "context": "parameter_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L190", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L678", "weight": 1.0, - "source": "app_routes_engagement_dislike_article", - "target": "app_routes_engagement_engagementrequest", - "confidence_score": 1.0 + "source": "app_routes_admin_bloom_filter_health_check", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "references", - "context": "parameter_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L129", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L676", "weight": 1.0, - "source": "app_routes_engagement_like_article", - "target": "app_routes_engagement_engagementrequest", - "confidence_score": 1.0 + "source": "app_routes_admin_bloom_filter_health_check", + "target": "app_services_deduplication_get_url_filter" }, { - "relation": "references", - "context": "parameter_type", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L249", + "source_file": "app/routes/admin.py", + "source_location": "L660", "weight": 1.0, - "source": "app_routes_engagement_track_view", - "target": "app_routes_engagement_engagementrequest", + "source": "app_routes_admin_rationale_660", + "target": "app_routes_admin_bloom_filter_health_check", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L196", + "source_file": "app/routes/admin.py", + "source_location": "L753", "weight": 1.0, - "source": "app_routes_engagement_dislike_article", - "target": "app_routes_engagement_resolve_article_id", + "source": "app_routes_admin_rationale_753", + "target": "app_routes_admin_reset_circuit_breakers", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L59", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L774", "weight": 1.0, - "source": "app_routes_engagement_get_article_stats", - "target": "app_routes_engagement_resolve_article_id", - "confidence_score": 1.0 + "source": "app_routes_admin_reset_circuit_breakers", + "target": "app_services_circuit_breaker_get_circuit_breaker" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L135", + "confidence_score": 1.0, + "source_file": "app/routes/admin.py", + "source_location": "L778", "weight": 1.0, - "source": "app_routes_engagement_like_article", - "target": "app_routes_engagement_resolve_article_id", + "source": "app_routes_admin_reset_circuit_breakers", + "target": "app_services_upstash_cache_get_upstash_cache" + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/routes/audio.py", + "source_location": "L13", + "weight": 1.0, + "source": "app_routes_audio", + "target": "app_routes_audio_audiogenerationrequest", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L30", + "source_file": "app/routes/audio.py", + "source_location": "L20", "weight": 1.0, - "source": "app_routes_engagement_rationale_30", - "target": "app_routes_engagement_resolve_article_id", + "source": "app_routes_audio", + "target": "app_routes_audio_audioresponse", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L47", + "source_file": "app/routes/audio.py", + "source_location": "L27", "weight": 1.0, - "source": "app_routes_engagement_resolve_article_id", - "target": "app_utils_id_generator_generate_article_id", + "source": "app_routes_audio", + "target": "app_routes_audio_find_article", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L255", + "source_file": "app/routes/audio.py", + "source_location": "L107", "weight": 1.0, - "source": "app_routes_engagement_track_view", - "target": "app_routes_engagement_resolve_article_id", + "source": "app_routes_audio", + "target": "app_routes_audio_generate_audio_summary", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L58", + "source_file": "app/routes/audio.py", + "source_location": "L73", "weight": 1.0, - "source": "app_routes_engagement_get_article_stats", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_audio", + "target": "app_routes_audio_get_audio_status", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L111", + "source_file": "app/routes/audio.py", + "source_location": "L7", "weight": 1.0, - "source": "app_routes_engagement_get_article_stats", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_audio", + "target": "app_services_appwrite_db", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L54", + "source_file": "app/routes/audio.py", + "source_location": "L7", "weight": 1.0, - "source": "app_routes_engagement_rationale_54", - "target": "app_routes_engagement_get_article_stats", + "source": "app_routes_audio", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L134", + "source_file": "app/routes/audio.py", + "source_location": "L8", "weight": 1.0, - "source": "app_routes_engagement_like_article", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_audio", + "target": "app_services_audio_service", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L161", + "source_file": "app/routes/audio.py", + "source_location": "L107", "weight": 1.0, - "source": "app_routes_engagement_like_article", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_audio_generate_audio_summary", + "target": "app_routes_audio_audiogenerationrequest", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L130", + "source_file": "app/routes/audio.py", + "source_location": "L176", "weight": 1.0, - "source": "app_routes_engagement_rationale_130", - "target": "app_routes_engagement_like_article", + "source": "app_routes_audio_generate_audio_summary", + "target": "app_routes_audio_audioresponse", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L195", + "source_file": "app/routes/audio.py", + "source_location": "L86", "weight": 1.0, - "source": "app_routes_engagement_dislike_article", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_audio_get_audio_status", + "target": "app_routes_audio_audioresponse", + "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L216", + "source_file": "app/routes/audio.py", + "source_location": "L130", "weight": 1.0, - "source": "app_routes_engagement_dislike_article", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_audio_generate_audio_summary", + "target": "app_routes_audio_find_article", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L191", + "source_file": "app/routes/audio.py", + "source_location": "L83", "weight": 1.0, - "source": "app_routes_engagement_rationale_191", - "target": "app_routes_engagement_dislike_article", + "source": "app_routes_audio_get_audio_status", + "target": "app_routes_audio_find_article", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/engagement.py", - "source_location": "L250", + "source_file": "app/routes/audio.py", + "source_location": "L28", "weight": 1.0, - "source": "app_routes_engagement_rationale_250", - "target": "app_routes_engagement_track_view", + "source": "app_routes_audio_rationale_28", + "target": "app_routes_audio_find_article", "confidence_score": 1.0 }, { @@ -14494,314 +13602,316 @@ "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L254", + "source_file": "app/routes/audio.py", + "source_location": "L78", "weight": 1.0, - "source": "app_routes_engagement_track_view", + "source": "app_routes_audio_get_audio_status", "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L275", + "source_file": "app/routes/audio.py", + "source_location": "L74", "weight": 1.0, - "source": "app_routes_engagement_track_view", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_audio_rationale_74", + "target": "app_routes_audio_get_audio_status", + "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L326", + "source_file": "app/routes/audio.py", + "source_location": "L120", "weight": 1.0, - "source": "app_routes_engagement_get_trending_articles", + "source": "app_routes_audio_generate_audio_summary", "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/engagement.py", - "source_location": "L346", + "source_file": "app/routes/audio.py", + "source_location": "L108", "weight": 1.0, - "source": "app_routes_engagement_get_trending_articles", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_audio_rationale_108", + "target": "app_routes_audio_generate_audio_summary", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/engagement.py", - "source_location": "L310", + "source_location": "L190", "weight": 1.0, - "source": "app_routes_engagement_rationale_310", - "target": "app_routes_engagement_get_trending_articles", + "source": "app_routes_engagement", + "target": "app_routes_engagement_dislike_article", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/engagement.py", - "source_location": "L393", + "source_location": "L22", "weight": 1.0, - "source": "app_routes_engagement_get_popular_cloud_articles", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_engagement", + "target": "app_routes_engagement_engagementrequest", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/routes/engagement.py", - "source_location": "L410", + "source_location": "L53", "weight": 1.0, - "source": "app_routes_engagement_get_popular_cloud_articles", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_engagement", + "target": "app_routes_engagement_get_article_stats", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/routes/engagement.py", - "source_location": "L375", + "source_location": "L374", "weight": 1.0, - "source": "app_routes_engagement_rationale_375", + "source": "app_routes_engagement", "target": "app_routes_engagement_get_popular_cloud_articles", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L121", + "source_file": "app/routes/engagement.py", + "source_location": "L305", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_cache_health_check", + "source": "app_routes_engagement", + "target": "app_routes_engagement_get_trending_articles", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L86", + "source_file": "app/routes/engagement.py", + "source_location": "L129", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_clear_cache", + "source": "app_routes_engagement", + "target": "app_routes_engagement_like_article", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L26", + "source_file": "app/routes/engagement.py", + "source_location": "L29", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_get_cache_stats", + "source": "app_routes_engagement", + "target": "app_routes_engagement_resolve_article_id", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L237", + "source_file": "app/routes/engagement.py", + "source_location": "L249", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_get_ingestion_alerts", + "source": "app_routes_engagement", + "target": "app_routes_engagement_track_view", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L188", + "source_file": "app/routes/engagement.py", + "source_location": "L10", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_get_ingestion_stats", + "source": "app_routes_engagement", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L289", + "source_file": "app/routes/engagement.py", + "source_location": "L10", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_get_quota_stats", + "source": "app_routes_engagement", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L166", + "source_file": "app/routes/engagement.py", + "source_location": "L10", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_routes_monitoring_get_recommendations", + "source": "app_routes_engagement", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L321", + "source_file": "app/routes/engagement.py", + "source_location": "L12", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_services_api_quota_get_quota_tracker", + "source": "app_routes_engagement", + "target": "app_utils_id_generator", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L220", + "source_file": "app/routes/engagement.py", + "source_location": "L12", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_services_ingestion_metrics_get_ingestion_metrics", + "source": "app_routes_engagement", + "target": "app_utils_id_generator_generate_article_id", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L16", + "source_file": "app/routes/engagement.py", + "source_location": "L1", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_services_upstash_cache", + "source": "app_routes_engagement_rationale_1", + "target": "app_routes_engagement", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L16", + "source_file": "app/routes/engagement.py", + "source_location": "L190", "weight": 1.0, - "source": "app_routes_monitoring", - "target": "app_services_upstash_cache_get_upstash_cache", + "source": "app_routes_engagement_dislike_article", + "target": "app_routes_engagement_engagementrequest", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L1", + "source_file": "app/routes/engagement.py", + "source_location": "L129", "weight": 1.0, - "source": "app_routes_monitoring_rationale_1", - "target": "app_routes_monitoring", + "source": "app_routes_engagement_like_article", + "target": "app_routes_engagement_engagementrequest", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L77", + "source_file": "app/routes/engagement.py", + "source_location": "L249", "weight": 1.0, - "source": "app_routes_monitoring_get_cache_stats", - "target": "app_routes_monitoring_get_recommendations", + "source": "app_routes_engagement_track_view", + "target": "app_routes_engagement_engagementrequest", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/monitoring.py", - "source_location": "L46", + "source_file": "app/routes/engagement.py", + "source_location": "L196", "weight": 1.0, - "source": "app_routes_monitoring_get_cache_stats", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_routes_engagement_dislike_article", + "target": "app_routes_engagement_resolve_article_id", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L27", + "source_file": "app/routes/engagement.py", + "source_location": "L59", "weight": 1.0, - "source": "app_routes_monitoring_rationale_27", - "target": "app_routes_monitoring_get_cache_stats", + "source": "app_routes_engagement_get_article_stats", + "target": "app_routes_engagement_resolve_article_id", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/monitoring.py", - "source_location": "L96", + "source_file": "app/routes/engagement.py", + "source_location": "L135", "weight": 1.0, - "source": "app_routes_monitoring_clear_cache", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_routes_engagement_like_article", + "target": "app_routes_engagement_resolve_article_id", + "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L87", + "source_file": "app/routes/engagement.py", + "source_location": "L30", "weight": 1.0, - "source": "app_routes_monitoring_rationale_87", - "target": "app_routes_monitoring_clear_cache", + "source": "app_routes_engagement_rationale_30", + "target": "app_routes_engagement_resolve_article_id", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/monitoring.py", - "source_location": "L129", + "source_file": "app/routes/engagement.py", + "source_location": "L47", "weight": 1.0, - "source": "app_routes_monitoring_cache_health_check", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_routes_engagement_resolve_article_id", + "target": "app_utils_id_generator_generate_article_id", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L122", + "source_file": "app/routes/engagement.py", + "source_location": "L255", "weight": 1.0, - "source": "app_routes_monitoring_rationale_122", - "target": "app_routes_monitoring_cache_health_check", + "source": "app_routes_engagement_track_view", + "target": "app_routes_engagement_resolve_article_id", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L167", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L58", "weight": 1.0, - "source": "app_routes_monitoring_rationale_167", - "target": "app_routes_monitoring_get_recommendations", - "confidence_score": 1.0 + "source": "app_routes_engagement_get_article_stats", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/monitoring.py", - "source_location": "L222", + "source_file": "app/routes/engagement.py", + "source_location": "L111", "weight": 1.0, - "source": "app_routes_monitoring_get_ingestion_stats", - "target": "app_services_ingestion_metrics_get_ingestion_metrics" + "source": "app_routes_engagement_get_article_stats", + "target": "app_services_appwrite_db_safe_get" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L189", + "source_file": "app/routes/engagement.py", + "source_location": "L54", "weight": 1.0, - "source": "app_routes_monitoring_rationale_189", - "target": "app_routes_monitoring_get_ingestion_stats", + "source": "app_routes_engagement_rationale_54", + "target": "app_routes_engagement_get_article_stats", "confidence_score": 1.0 }, { @@ -14809,469 +13919,480 @@ "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/monitoring.py", - "source_location": "L269", - "weight": 1.0, - "source": "app_routes_monitoring_get_ingestion_alerts", - "target": "app_services_ingestion_metrics_get_ingestion_metrics" - }, - { - "relation": "rationale_for", - "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L238", + "source_file": "app/routes/engagement.py", + "source_location": "L134", "weight": 1.0, - "source": "app_routes_monitoring_rationale_238", - "target": "app_routes_monitoring_get_ingestion_alerts", - "confidence_score": 1.0 + "source": "app_routes_engagement_like_article", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/monitoring.py", - "source_location": "L323", + "source_file": "app/routes/engagement.py", + "source_location": "L161", "weight": 1.0, - "source": "app_routes_monitoring_get_quota_stats", - "target": "app_services_api_quota_get_quota_tracker" + "source": "app_routes_engagement_like_article", + "target": "app_services_appwrite_db_safe_get" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/monitoring.py", - "source_location": "L290", + "source_file": "app/routes/engagement.py", + "source_location": "L130", "weight": 1.0, - "source": "app_routes_monitoring_rationale_290", - "target": "app_routes_monitoring_get_quota_stats", + "source": "app_routes_engagement_rationale_130", + "target": "app_routes_engagement_like_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L127", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L195", "weight": 1.0, - "source": "app_routes_news", - "target": "app_routes_news_get_news_by_category", - "confidence_score": 1.0 + "source": "app_routes_engagement_dislike_article", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L303", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L216", "weight": 1.0, - "source": "app_routes_news", - "target": "app_routes_news_get_provider_stats", - "confidence_score": 1.0 + "source": "app_routes_engagement_dislike_article", + "target": "app_services_appwrite_db_safe_get" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L262", + "source_file": "app/routes/engagement.py", + "source_location": "L191", "weight": 1.0, - "source": "app_routes_news", - "target": "app_routes_news_get_rss_feed", + "source": "app_routes_engagement_rationale_191", + "target": "app_routes_engagement_dislike_article", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L18", + "source_file": "app/routes/engagement.py", + "source_location": "L250", "weight": 1.0, - "source": "app_routes_news", - "target": "app_routes_news_get_umbrella_news", + "source": "app_routes_engagement_rationale_250", + "target": "app_routes_engagement_track_view", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L5", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L254", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_appwrite_db", - "confidence_score": 1.0 + "source": "app_routes_engagement_track_view", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L5", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L275", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_appwrite_db_get_appwrite_db", - "confidence_score": 1.0 + "source": "app_routes_engagement_track_view", + "target": "app_services_appwrite_db_safe_get" }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L5", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L326", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_appwrite_db_safe_get", - "confidence_score": 1.0 + "source": "app_routes_engagement_get_trending_articles", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L3", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L346", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_news_aggregator", - "confidence_score": 1.0 + "source": "app_routes_engagement_get_trending_articles", + "target": "app_services_appwrite_db_safe_get" }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L3", + "source_file": "app/routes/engagement.py", + "source_location": "L310", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_news_aggregator_newsaggregator", + "source": "app_routes_engagement_rationale_310", + "target": "app_routes_engagement_get_trending_articles", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L4", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L393", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_upstash_cache", - "confidence_score": 1.0 + "source": "app_routes_engagement_get_popular_cloud_articles", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L4", + "confidence_score": 1.0, + "source_file": "app/routes/engagement.py", + "source_location": "L410", "weight": 1.0, - "source": "app_routes_news", - "target": "app_services_upstash_cache_get_upstash_cache", + "source": "app_routes_engagement_get_popular_cloud_articles", + "target": "app_services_appwrite_db_safe_get" + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/routes/engagement.py", + "source_location": "L375", + "weight": 1.0, + "source": "app_routes_engagement_rationale_375", + "target": "app_routes_engagement_get_popular_cloud_articles", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L157", + "source_file": "app/routes/monitoring.py", + "source_location": "L121", "weight": 1.0, - "source": "app_routes_news", - "target": "app_utils_cursor_pagination_cursorpagination", + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_cache_health_check", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L19", + "source_file": "app/routes/monitoring.py", + "source_location": "L86", "weight": 1.0, - "source": "app_routes_news_rationale_19", - "target": "app_routes_news_get_umbrella_news", + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_clear_cache", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/news.py", - "source_location": "L231", + "source_file": "app/routes/monitoring.py", + "source_location": "L26", "weight": 1.0, - "source": "app_routes_news_get_news_by_category", - "target": "app_services_appwrite_db_safe_get" + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_get_cache_stats", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/news.py", - "source_location": "L207", + "source_file": "app/routes/monitoring.py", + "source_location": "L237", "weight": 1.0, - "source": "app_routes_news_get_news_by_category", - "target": "app_utils_cursor_pagination_cursorpagination_build_query_filters" + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_get_ingestion_alerts", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/news.py", - "source_location": "L230", + "source_file": "app/routes/monitoring.py", + "source_location": "L188", "weight": 1.0, - "source": "app_routes_news_get_news_by_category", - "target": "app_utils_cursor_pagination_cursorpagination_encode_cursor" + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_get_ingestion_stats", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L133", + "source_file": "app/routes/monitoring.py", + "source_location": "L289", "weight": 1.0, - "source": "app_routes_news_rationale_133", - "target": "app_routes_news_get_news_by_category", + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_get_quota_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L263", + "source_file": "app/routes/monitoring.py", + "source_location": "L166", "weight": 1.0, - "source": "app_routes_news_rationale_263", - "target": "app_routes_news_get_rss_feed", + "source": "app_routes_monitoring", + "target": "app_routes_monitoring_get_recommendations", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/news.py", - "source_location": "L304", + "source_file": "app/routes/monitoring.py", + "source_location": "L321", "weight": 1.0, - "source": "app_routes_news_rationale_304", - "target": "app_routes_news_get_provider_stats", + "source": "app_routes_monitoring", + "target": "app_services_api_quota_get_quota_tracker", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/research.py", - "source_location": "L12", + "source_file": "app/routes/monitoring.py", + "source_location": "L220", "weight": 1.0, - "source": "app_routes_research", - "target": "app_routes_research_get_research_paper", + "source": "app_routes_monitoring", + "target": "app_services_ingestion_metrics_get_ingestion_metrics", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/research.py", - "source_location": "L4", + "source_file": "app/routes/monitoring.py", + "source_location": "L16", "weight": 1.0, - "source": "app_routes_research", - "target": "app_services_appwrite_db", + "source": "app_routes_monitoring", + "target": "app_services_upstash_cache", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/research.py", - "source_location": "L4", + "source_file": "app/routes/monitoring.py", + "source_location": "L16", "weight": 1.0, - "source": "app_routes_research", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_routes_monitoring", + "target": "app_services_upstash_cache_get_upstash_cache", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/routes/monitoring.py", + "source_location": "L1", + "weight": 1.0, + "source": "app_routes_monitoring_rationale_1", + "target": "app_routes_monitoring", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/research.py", - "source_location": "L17", + "source_file": "app/routes/monitoring.py", + "source_location": "L77", "weight": 1.0, - "source": "app_routes_research_get_research_paper", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_monitoring_get_cache_stats", + "target": "app_routes_monitoring_get_recommendations", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/research.py", - "source_location": "L13", + "confidence_score": 1.0, + "source_file": "app/routes/monitoring.py", + "source_location": "L46", "weight": 1.0, - "source": "app_routes_research_rationale_13", - "target": "app_routes_research_get_research_paper", - "confidence_score": 1.0 + "source": "app_routes_monitoring_get_cache_stats", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L14", + "source_file": "app/routes/monitoring.py", + "source_location": "L27", "weight": 1.0, - "source": "app_routes_search", - "target": "app_routes_search_search_news", + "source": "app_routes_monitoring_rationale_27", + "target": "app_routes_monitoring_get_cache_stats", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L4", + "confidence_score": 1.0, + "source_file": "app/routes/monitoring.py", + "source_location": "L96", "weight": 1.0, - "source": "app_routes_search", - "target": "app_services_cache_service", - "confidence_score": 1.0 + "source": "app_routes_monitoring_clear_cache", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L4", + "source_file": "app/routes/monitoring.py", + "source_location": "L87", "weight": 1.0, - "source": "app_routes_search", - "target": "app_services_cache_service_cacheservice", + "source": "app_routes_monitoring_rationale_87", + "target": "app_routes_monitoring_clear_cache", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L3", + "confidence_score": 1.0, + "source_file": "app/routes/monitoring.py", + "source_location": "L129", "weight": 1.0, - "source": "app_routes_search", - "target": "app_services_news_aggregator", - "confidence_score": 1.0 + "source": "app_routes_monitoring_cache_health_check", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L3", + "source_file": "app/routes/monitoring.py", + "source_location": "L122", "weight": 1.0, - "source": "app_routes_search", - "target": "app_services_news_aggregator_newsaggregator", + "source": "app_routes_monitoring_rationale_122", + "target": "app_routes_monitoring_cache_health_check", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/search.py", - "source_location": "L15", + "source_file": "app/routes/monitoring.py", + "source_location": "L167", "weight": 1.0, - "source": "app_routes_search_rationale_15", - "target": "app_routes_search_search_news", + "source": "app_routes_monitoring_rationale_167", + "target": "app_routes_monitoring_get_recommendations", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L240", + "confidence_score": 1.0, + "source_file": "app/routes/monitoring.py", + "source_location": "L222", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_get_subscriber_count", - "confidence_score": 1.0 + "source": "app_routes_monitoring_get_ingestion_stats", + "target": "app_services_ingestion_metrics_get_ingestion_metrics" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L315", + "source_file": "app/routes/monitoring.py", + "source_location": "L189", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_get_subscription_status", + "source": "app_routes_monitoring_rationale_189", + "target": "app_routes_monitoring_get_ingestion_stats", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L263", + "confidence_score": 1.0, + "source_file": "app/routes/monitoring.py", + "source_location": "L269", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_send_newsletter", - "confidence_score": 1.0 + "source": "app_routes_monitoring_get_ingestion_alerts", + "target": "app_services_ingestion_metrics_get_ingestion_metrics" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L45", + "source_file": "app/routes/monitoring.py", + "source_location": "L238", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_subscribe", + "source": "app_routes_monitoring_rationale_238", + "target": "app_routes_monitoring_get_ingestion_alerts", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L17", + "confidence_score": 1.0, + "source_file": "app/routes/monitoring.py", + "source_location": "L323", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_subscriberequest", - "confidence_score": 1.0 + "source": "app_routes_monitoring_get_quota_stats", + "target": "app_services_api_quota_get_quota_tracker" }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L32", + "source_file": "app/routes/monitoring.py", + "source_location": "L290", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_subscriberesponse", + "source": "app_routes_monitoring_rationale_290", + "target": "app_routes_monitoring_get_quota_stats", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L108", + "source_file": "app/routes/news.py", + "source_location": "L127", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_unsubscribe", + "source": "app_routes_news", + "target": "app_routes_news_get_news_by_category", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L177", + "source_file": "app/routes/news.py", + "source_location": "L303", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_unsubscribe_post", + "source": "app_routes_news", + "target": "app_routes_news_get_provider_stats", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L172", + "source_file": "app/routes/news.py", + "source_location": "L262", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_unsubscriberequest", + "source": "app_routes_news", + "target": "app_routes_news_get_rss_feed", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L38", + "source_file": "app/routes/news.py", + "source_location": "L18", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_routes_subscription_unsubscriberesponse", + "source": "app_routes_news", + "target": "app_routes_news_get_umbrella_news", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L11", + "source_file": "app/routes/news.py", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_subscription", + "source": "app_routes_news", "target": "app_services_appwrite_db", "confidence_score": 1.0 }, @@ -15279,1570 +14400,1573 @@ "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L11", + "source_file": "app/routes/news.py", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_subscription", + "source": "app_routes_news", "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L10", + "source_file": "app/routes/news.py", + "source_location": "L5", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_services_brevo_email_service", + "source": "app_routes_news", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L10", + "source_file": "app/routes/news.py", + "source_location": "L3", "weight": 1.0, - "source": "app_routes_subscription", - "target": "app_services_brevo_email_service_get_brevo_service", + "source": "app_routes_news", + "target": "app_services_news_aggregator", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L1", + "source_file": "app/routes/news.py", + "source_location": "L3", "weight": 1.0, - "source": "app_routes_subscription_rationale_1", - "target": "app_routes_subscription", + "source": "app_routes_news", + "target": "app_services_news_aggregator_newsaggregator", "confidence_score": 1.0 }, { - "relation": "references", - "context": "parameter_type", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L45", + "source_file": "app/routes/news.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_subscription_subscribe", - "target": "app_routes_subscription_subscriberequest", + "source": "app_routes_news", + "target": "app_services_upstash_cache", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L25", + "source_file": "app/routes/news.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_subscription_subscriberequest", - "target": "app_routes_subscription_subscriberequest_validate_preference", + "source": "app_routes_news", + "target": "app_services_upstash_cache_get_upstash_cache", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L85", + "source_file": "app/routes/news.py", + "source_location": "L157", "weight": 1.0, - "source": "app_routes_subscription_subscribe", - "target": "app_routes_subscription_subscriberesponse", + "source": "app_routes_news", + "target": "app_utils_cursor_pagination_cursorpagination", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L156", + "source_file": "app/routes/news.py", + "source_location": "L19", "weight": 1.0, - "source": "app_routes_subscription_unsubscribe", - "target": "app_routes_subscription_unsubscriberesponse", + "source": "app_routes_news_rationale_19", + "target": "app_routes_news_get_umbrella_news", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L223", - "weight": 1.0, - "source": "app_routes_subscription_unsubscribe_post", - "target": "app_routes_subscription_unsubscriberesponse", - "confidence_score": 1.0 - }, - { - "relation": "rationale_for", - "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L46", + "confidence_score": 1.0, + "source_file": "app/routes/news.py", + "source_location": "L231", "weight": 1.0, - "source": "app_routes_subscription_rationale_46", - "target": "app_routes_subscription_subscribe", - "confidence_score": 1.0 + "source": "app_routes_news_get_news_by_category", + "target": "app_services_appwrite_db_safe_get" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L55", + "source_file": "app/routes/news.py", + "source_location": "L207", "weight": 1.0, - "source": "app_routes_subscription_subscribe", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_news_get_news_by_category", + "target": "app_utils_cursor_pagination_cursorpagination_build_query_filters" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L54", + "source_file": "app/routes/news.py", + "source_location": "L230", "weight": 1.0, - "source": "app_routes_subscription_subscribe", - "target": "app_services_brevo_email_service_get_brevo_service" + "source": "app_routes_news_get_news_by_category", + "target": "app_utils_cursor_pagination_cursorpagination_encode_cursor" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L112", + "source_file": "app/routes/news.py", + "source_location": "L133", "weight": 1.0, - "source": "app_routes_subscription_rationale_112", - "target": "app_routes_subscription_unsubscribe", + "source": "app_routes_news_rationale_133", + "target": "app_routes_news_get_news_by_category", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L117", - "weight": 1.0, - "source": "app_routes_subscription_unsubscribe", - "target": "app_services_appwrite_db_get_appwrite_db" - }, - { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L118", + "source_file": "app/routes/news.py", + "source_location": "L263", "weight": 1.0, - "source": "app_routes_subscription_unsubscribe", - "target": "app_services_brevo_email_service_get_brevo_service" + "source": "app_routes_news_rationale_263", + "target": "app_routes_news_get_rss_feed", + "confidence_score": 1.0 }, { - "relation": "references", - "context": "parameter_type", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L177", + "source_file": "app/routes/news.py", + "source_location": "L304", "weight": 1.0, - "source": "app_routes_subscription_unsubscribe_post", - "target": "app_routes_subscription_unsubscriberequest", + "source": "app_routes_news_rationale_304", + "target": "app_routes_news_get_provider_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L178", + "source_file": "app/routes/research.py", + "source_location": "L12", "weight": 1.0, - "source": "app_routes_subscription_rationale_178", - "target": "app_routes_subscription_unsubscribe_post", + "source": "app_routes_research", + "target": "app_routes_research_get_research_paper", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L183", + "source_file": "app/routes/research.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_subscription_unsubscribe_post", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_research", + "target": "app_services_appwrite_db", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L184", + "source_file": "app/routes/research.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_subscription_unsubscribe_post", - "target": "app_services_brevo_email_service_get_brevo_service" + "source": "app_routes_research", + "target": "app_services_appwrite_db_get_appwrite_db", + "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L243", + "source_file": "app/routes/research.py", + "source_location": "L17", "weight": 1.0, - "source": "app_routes_subscription_get_subscriber_count", + "source": "app_routes_research_get_research_paper", "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L241", + "source_file": "app/routes/research.py", + "source_location": "L13", "weight": 1.0, - "source": "app_routes_subscription_rationale_241", - "target": "app_routes_subscription_get_subscriber_count", + "source": "app_routes_research_rationale_13", + "target": "app_routes_research_get_research_paper", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L267", + "source_file": "app/routes/search.py", + "source_location": "L14", "weight": 1.0, - "source": "app_routes_subscription_rationale_267", - "target": "app_routes_subscription_send_newsletter", + "source": "app_routes_search", + "target": "app_routes_search_search_news", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L275", + "source_file": "app/routes/search.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_subscription_send_newsletter", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_search", + "target": "app_services_cache_service", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L276", + "source_file": "app/routes/search.py", + "source_location": "L4", "weight": 1.0, - "source": "app_routes_subscription_send_newsletter", - "target": "app_services_brevo_email_service_get_brevo_service" + "source": "app_routes_search", + "target": "app_services_cache_service_cacheservice", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/routes/subscription.py", - "source_location": "L322", + "source_file": "app/routes/search.py", + "source_location": "L3", "weight": 1.0, - "source": "app_routes_subscription_get_subscription_status", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_routes_search", + "target": "app_services_news_aggregator", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/routes/subscription.py", - "source_location": "L316", + "source_file": "app/routes/search.py", + "source_location": "L3", "weight": 1.0, - "source": "app_routes_subscription_rationale_316", - "target": "app_routes_subscription_get_subscription_status", + "source": "app_routes_search", + "target": "app_services_news_aggregator_newsaggregator", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L24", + "source_file": "app/routes/search.py", + "source_location": "L15", "weight": 1.0, - "source": "app_services_adaptive_scheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler", + "source": "app_routes_search_rationale_15", + "target": "app_routes_search_search_news", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L285", + "source_file": "app/routes/subscription.py", + "source_location": "L240", "weight": 1.0, - "source": "app_services_adaptive_scheduler", - "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "source": "app_routes_subscription", + "target": "app_routes_subscription_get_subscriber_count", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L1", + "source_file": "app/routes/subscription.py", + "source_location": "L315", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_1", - "target": "app_services_adaptive_scheduler", + "source": "app_routes_subscription", + "target": "app_routes_subscription_get_subscription_status", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L167", + "source_file": "app/routes/subscription.py", + "source_location": "L263", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_167", - "target": "app_services_adaptive_scheduler", + "source": "app_routes_subscription", + "target": "app_routes_subscription_send_newsletter", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L15", + "source_file": "app/routes/subscription.py", + "source_location": "L45", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_services_adaptive_scheduler", + "source": "app_routes_subscription", + "target": "app_routes_subscription_subscribe", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", + "source_file": "app/routes/subscription.py", "source_location": "L17", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_adaptive_scheduler", + "source": "app_routes_subscription", + "target": "app_routes_subscription_subscriberequest", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L177", + "source_file": "app/routes/subscription.py", + "source_location": "L32", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", + "source": "app_routes_subscription", + "target": "app_routes_subscription_subscriberesponse", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L216", + "source_file": "app/routes/subscription.py", + "source_location": "L108", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_get_interval", + "source": "app_routes_subscription", + "target": "app_routes_subscription_unsubscribe", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L220", + "source_file": "app/routes/subscription.py", + "source_location": "L177", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_get_statistics", + "source": "app_routes_subscription", + "target": "app_routes_subscription_unsubscribe_post", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L31", + "source_file": "app/routes/subscription.py", + "source_location": "L172", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_init", + "source": "app_routes_subscription", + "target": "app_routes_subscription_unsubscriberequest", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L64", + "source_file": "app/routes/subscription.py", + "source_location": "L38", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", + "source": "app_routes_subscription", + "target": "app_routes_subscription_unsubscriberesponse", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L240", + "source_file": "app/routes/subscription.py", + "source_location": "L11", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_print_summary", + "source": "app_routes_subscription", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L56", + "source_file": "app/routes/subscription.py", + "source_location": "L11", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", + "source": "app_routes_subscription", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L52", + "source_file": "app/routes/subscription.py", + "source_location": "L11", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", + "source": "app_routes_subscription", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L60", + "source_file": "app/routes/subscription.py", + "source_location": "L10", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", + "source": "app_routes_subscription", + "target": "app_services_brevo_email_service", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L95", + "source_file": "app/routes/subscription.py", + "source_location": "L10", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", + "source": "app_routes_subscription", + "target": "app_services_brevo_email_service_get_brevo_service", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L123", + "source_file": "app/routes/subscription.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler_update_category_velocity", + "source": "app_routes_subscription_rationale_1", + "target": "app_routes_subscription", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L290", + "source_file": "app/routes/subscription.py", + "source_location": "L45", "weight": 1.0, - "source": "app_services_adaptive_scheduler_get_adaptive_scheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler", + "source": "app_routes_subscription_subscribe", + "target": "app_routes_subscription_subscriberequest", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", + "source_file": "app/routes/subscription.py", "source_location": "L25", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_25", - "target": "app_services_adaptive_scheduler_adaptivescheduler", + "source": "app_routes_subscription_subscriberequest", + "target": "app_routes_subscription_subscriberequest_validate_preference", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L17", + "source_file": "app/routes/subscription.py", + "source_location": "L85", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_adaptive_scheduler_adaptivescheduler", + "source": "app_routes_subscription_subscribe", + "target": "app_routes_subscription_subscriberesponse", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L39", + "source_file": "app/routes/subscription.py", + "source_location": "L156", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_init", - "target": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", + "source": "app_routes_subscription_unsubscribe", + "target": "app_routes_subscription_unsubscriberesponse", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L32", + "source_file": "app/routes/subscription.py", + "source_location": "L223", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_32", - "target": "app_services_adaptive_scheduler_adaptivescheduler_init", + "source": "app_routes_subscription_unsubscribe_post", + "target": "app_routes_subscription_unsubscriberesponse", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L200", + "source_file": "app/routes/subscription.py", + "source_location": "L46", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", + "source": "app_routes_subscription_rationale_46", + "target": "app_routes_subscription_subscribe", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L82", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L55", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", - "confidence_score": 1.0 + "source": "app_routes_subscription_subscribe", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L113", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L54", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", - "confidence_score": 1.0 + "source": "app_routes_subscription_subscribe", + "target": "app_services_brevo_email_service_get_brevo_service" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L53", + "source_file": "app/routes/subscription.py", + "source_location": "L112", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_53", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", + "source": "app_routes_subscription_rationale_112", + "target": "app_routes_subscription_unsubscribe", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L207", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L117", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", - "confidence_score": 1.0 + "source": "app_routes_subscription_unsubscribe", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L84", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L118", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", - "confidence_score": 1.0 + "source": "app_routes_subscription_unsubscribe", + "target": "app_services_brevo_email_service_get_brevo_service" }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "parameter_type", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L117", + "source_file": "app/routes/subscription.py", + "source_location": "L177", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", + "source": "app_routes_subscription_unsubscribe_post", + "target": "app_routes_subscription_unsubscriberequest", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L57", + "source_file": "app/routes/subscription.py", + "source_location": "L178", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_57", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", + "source": "app_routes_subscription_rationale_178", + "target": "app_routes_subscription_unsubscribe_post", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L194", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L183", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", - "confidence_score": 1.0 + "source": "app_routes_subscription_unsubscribe_post", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L76", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L184", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", - "confidence_score": 1.0 + "source": "app_routes_subscription_unsubscribe_post", + "target": "app_services_brevo_email_service_get_brevo_service" }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L102", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L243", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", - "confidence_score": 1.0 + "source": "app_routes_subscription_get_subscriber_count", + "target": "app_services_appwrite_db_get_appwrite_db" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L61", + "source_file": "app/routes/subscription.py", + "source_location": "L241", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_61", - "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", + "source": "app_routes_subscription_rationale_241", + "target": "app_routes_subscription_get_subscriber_count", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L65", + "source_file": "app/routes/subscription.py", + "source_location": "L267", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_65", - "target": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", + "source": "app_routes_subscription_rationale_267", + "target": "app_routes_subscription_send_newsletter", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L96", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L275", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_96", - "target": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", - "confidence_score": 1.0 + "source": "app_routes_subscription_send_newsletter", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L124", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L276", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_124", - "target": "app_services_adaptive_scheduler_adaptivescheduler_update_category_velocity", - "confidence_score": 1.0 + "source": "app_routes_subscription_send_newsletter", + "target": "app_services_brevo_email_service_get_brevo_service" }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L178", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L322", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_178", - "target": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", - "confidence_score": 1.0 + "source": "app_routes_subscription_get_subscription_status", + "target": "app_services_appwrite_db_get_appwrite_db" + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/routes/subscription.py", + "source_location": "L335", + "weight": 1.0, + "source": "app_routes_subscription_get_subscription_status", + "target": "app_services_appwrite_db_safe_get" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L217", + "source_file": "app/routes/subscription.py", + "source_location": "L316", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_217", - "target": "app_services_adaptive_scheduler_adaptivescheduler_get_interval", + "source": "app_routes_subscription_rationale_316", + "target": "app_routes_subscription_get_subscription_status", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L246", + "source_location": "L24", "weight": 1.0, - "source": "app_services_adaptive_scheduler_adaptivescheduler_print_summary", - "target": "app_services_adaptive_scheduler_adaptivescheduler_get_statistics", + "source": "app_services_adaptive_scheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L221", + "source_location": "L285", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_221", - "target": "app_services_adaptive_scheduler_adaptivescheduler_get_statistics", + "source": "app_services_adaptive_scheduler", + "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L241", + "source_location": "L1", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_241", - "target": "app_services_adaptive_scheduler_adaptivescheduler_print_summary", + "source": "app_services_adaptive_scheduler_rationale_1", + "target": "app_services_adaptive_scheduler", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/adaptive_scheduler.py", - "source_location": "L286", + "source_location": "L167", "weight": 1.0, - "source": "app_services_adaptive_scheduler_rationale_286", - "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "source": "app_services_adaptive_scheduler_rationale_167", + "target": "app_services_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/news_processor.py", "source_location": "L15", "weight": 1.0, "source": "app_services_news_processor", - "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "target": "app_services_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L28", + "source_file": "app/services/scheduler.py", + "source_location": "L17", "weight": 1.0, - "source": "app_services_news_processor_process_category", - "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "source": "app_services_scheduler", + "target": "app_services_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L17", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L177", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L88", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L216", "weight": 1.0, - "source": "app_services_scheduler_get_adaptive", - "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_get_interval", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L132", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L220", "weight": 1.0, - "source": "app_services_alert_service", - "target": "app_services_alert_service_alert_high_failure_rate", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_get_statistics", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L112", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L31", "weight": 1.0, - "source": "app_services_alert_service", - "target": "app_services_alert_service_alert_quota_exhausted", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_init", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L97", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L64", "weight": 1.0, - "source": "app_services_alert_service", - "target": "app_services_alert_service_alert_zero_articles", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L12", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L240", "weight": 1.0, - "source": "app_services_alert_service", - "target": "app_services_alert_service_send_admin_alert", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_print_summary", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L1", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L56", "weight": 1.0, - "source": "app_services_alert_service_rationale_1", - "target": "app_services_alert_service", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L12", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L52", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_alert_service", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L140", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L60", "weight": 1.0, - "source": "app_services_alert_service_alert_high_failure_rate", - "target": "app_services_alert_service_send_admin_alert", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L119", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L95", "weight": 1.0, - "source": "app_services_alert_service_alert_quota_exhausted", - "target": "app_services_alert_service_send_admin_alert", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L99", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L123", "weight": 1.0, - "source": "app_services_alert_service_alert_zero_articles", - "target": "app_services_alert_service_send_admin_alert", + "source": "app_services_adaptive_scheduler_adaptivescheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler_update_category_velocity", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L18", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L290", "weight": 1.0, - "source": "app_services_alert_service_rationale_18", - "target": "app_services_alert_service_send_admin_alert", + "source": "app_services_adaptive_scheduler_get_adaptive_scheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L98", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L25", "weight": 1.0, - "source": "app_services_alert_service_rationale_98", - "target": "app_services_alert_service_alert_zero_articles", + "source": "app_services_adaptive_scheduler_rationale_25", + "target": "app_services_adaptive_scheduler_adaptivescheduler", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L12", + "source_file": "app/services/scheduler.py", + "source_location": "L17", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_alert_service_alert_zero_articles", + "source": "app_services_scheduler", + "target": "app_services_adaptive_scheduler_adaptivescheduler", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L234", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L39", "weight": 1.0, - "source": "app_services_newsletter_service_send_scheduled_newsletter", - "target": "app_services_alert_service_alert_zero_articles", + "source": "app_services_adaptive_scheduler_adaptivescheduler_init", + "target": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L118", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L32", "weight": 1.0, - "source": "app_services_alert_service_rationale_118", - "target": "app_services_alert_service_alert_quota_exhausted", + "source": "app_services_adaptive_scheduler_rationale_32", + "target": "app_services_adaptive_scheduler_adaptivescheduler_init", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L12", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L200", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_alert_service_alert_quota_exhausted", + "source": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L276", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L82", "weight": 1.0, - "source": "app_services_newsletter_service_send_scheduled_newsletter", - "target": "app_services_alert_service_alert_quota_exhausted", + "source": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/alert_service.py", - "source_location": "L138", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L113", "weight": 1.0, - "source": "app_services_alert_service_rationale_138", - "target": "app_services_alert_service_alert_high_failure_rate", + "source": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L12", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L53", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_alert_service_alert_high_failure_rate", + "source": "app_services_adaptive_scheduler_rationale_53", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_key", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L287", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L207", "weight": 1.0, - "source": "app_services_newsletter_service_send_scheduled_newsletter", - "target": "app_services_alert_service_alert_high_failure_rate", + "source": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L13", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L84", "weight": 1.0, - "source": "app_services_api_quota", - "target": "app_services_api_quota_apiquotatracker", + "source": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L243", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L117", "weight": 1.0, - "source": "app_services_api_quota", - "target": "app_services_api_quota_get_quota_tracker", + "source": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L173", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L57", "weight": 1.0, - "source": "app_services_api_quota", - "target": "app_services_upstash_cache_get_upstash_cache", + "source": "app_services_adaptive_scheduler_rationale_57", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_headers", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L1", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L194", "weight": 1.0, - "source": "app_services_api_quota_rationale_1", - "target": "app_services_api_quota", + "source": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L19", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L76", "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_services_api_quota", + "source": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L159", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L102", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_async_can_make_call", + "source": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L197", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L61", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_async_record_call", + "source": "app_services_adaptive_scheduler_rationale_61", + "target": "app_services_adaptive_scheduler_adaptivescheduler_redis_url", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L97", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L65", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_can_make_call", + "source": "app_services_adaptive_scheduler_rationale_65", + "target": "app_services_adaptive_scheduler_adaptivescheduler_load_velocity_data", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L78", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L96", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_check_limits", + "source": "app_services_adaptive_scheduler_rationale_96", + "target": "app_services_adaptive_scheduler_adaptivescheduler_save_velocity_data", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L119", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L124", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_get_stats", + "source": "app_services_adaptive_scheduler_rationale_124", + "target": "app_services_adaptive_scheduler_adaptivescheduler_update_category_velocity", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L16", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L178", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_init", + "source": "app_services_adaptive_scheduler_rationale_178", + "target": "app_services_adaptive_scheduler_adaptivescheduler_async_persist", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L44", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L217", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker", - "target": "app_services_api_quota_apiquotatracker_record_call", + "source": "app_services_adaptive_scheduler_rationale_217", + "target": "app_services_adaptive_scheduler_adaptivescheduler_get_interval", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L243", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L246", "weight": 1.0, - "source": "app_services_api_quota_get_quota_tracker", - "target": "app_services_api_quota_apiquotatracker", + "source": "app_services_adaptive_scheduler_adaptivescheduler_print_summary", + "target": "app_services_adaptive_scheduler_adaptivescheduler_get_statistics", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L14", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L221", "weight": 1.0, - "source": "app_services_api_quota_rationale_14", - "target": "app_services_api_quota_apiquotatracker", + "source": "app_services_adaptive_scheduler_rationale_221", + "target": "app_services_adaptive_scheduler_adaptivescheduler_get_statistics", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L208", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L241", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker_async_record_call", - "target": "app_services_api_quota_apiquotatracker_record_call", + "source": "app_services_adaptive_scheduler_rationale_241", + "target": "app_services_adaptive_scheduler_adaptivescheduler_print_summary", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L76", + "source_file": "app/services/adaptive_scheduler.py", + "source_location": "L286", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker_record_call", - "target": "app_services_api_quota_apiquotatracker_check_limits", + "source": "app_services_adaptive_scheduler_rationale_286", + "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L79", + "source_file": "app/services/news_processor.py", + "source_location": "L15", "weight": 1.0, - "source": "app_services_api_quota_rationale_79", - "target": "app_services_api_quota_apiquotatracker_check_limits", + "source": "app_services_news_processor", + "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L195", + "source_file": "app/services/news_processor.py", + "source_location": "L28", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker_async_can_make_call", - "target": "app_services_api_quota_apiquotatracker_can_make_call", + "source": "app_services_news_processor_process_category", + "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L98", + "source_file": "app/services/scheduler.py", + "source_location": "L17", "weight": 1.0, - "source": "app_services_api_quota_rationale_98", - "target": "app_services_api_quota_apiquotatracker_can_make_call", + "source": "app_services_scheduler", + "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L120", + "source_file": "app/services/scheduler.py", + "source_location": "L88", "weight": 1.0, - "source": "app_services_api_quota_rationale_120", - "target": "app_services_api_quota_apiquotatracker_get_stats", + "source": "app_services_scheduler_get_adaptive", + "target": "app_services_adaptive_scheduler_get_adaptive_scheduler", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/api_quota.py", - "source_location": "L174", + "source_file": "app/services/alert_service.py", + "source_location": "L132", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker_async_can_make_call", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_services_alert_service", + "target": "app_services_alert_service_alert_high_failure_rate", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L160", + "source_file": "app/services/alert_service.py", + "source_location": "L112", "weight": 1.0, - "source": "app_services_api_quota_rationale_160", - "target": "app_services_api_quota_apiquotatracker_async_can_make_call", + "source": "app_services_alert_service", + "target": "app_services_alert_service_alert_quota_exhausted", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/api_quota.py", - "source_location": "L213", + "source_file": "app/services/alert_service.py", + "source_location": "L97", "weight": 1.0, - "source": "app_services_api_quota_apiquotatracker_async_record_call", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_services_alert_service", + "target": "app_services_alert_service_alert_zero_articles", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L198", + "source_file": "app/services/alert_service.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_api_quota_rationale_198", - "target": "app_services_api_quota_apiquotatracker_async_record_call", + "source": "app_services_alert_service", + "target": "app_services_alert_service_send_admin_alert", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/api_quota.py", - "source_location": "L244", + "source_file": "app/services/alert_service.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_api_quota_rationale_244", - "target": "app_services_api_quota_get_quota_tracker", + "source": "app_services_alert_service_rationale_1", + "target": "app_services_alert_service", "confidence_score": 1.0 }, { - "relation": "imports", + "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L19", + "source_file": "app/services/newsletter_service.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_services_api_quota_get_quota_tracker", + "source": "app_services_newsletter_service", + "target": "app_services_alert_service", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/news_aggregator.py", - "source_location": "L195", + "source_file": "app/services/alert_service.py", + "source_location": "L140", "weight": 1.0, - "source": "app_services_news_aggregator_newsaggregator_init", - "target": "app_services_api_quota_get_quota_tracker" + "source": "app_services_alert_service_alert_high_failure_rate", + "target": "app_services_alert_service_send_admin_alert", + "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L135", + "source_file": "app/services/alert_service.py", + "source_location": "L119", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_services_appwrite_db_appwritedatabase", + "source": "app_services_alert_service_alert_quota_exhausted", + "target": "app_services_alert_service_send_admin_alert", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L1090", + "source_file": "app/services/alert_service.py", + "source_location": "L99", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_alert_service_alert_zero_articles", + "target": "app_services_alert_service_send_admin_alert", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L38", + "source_file": "app/services/alert_service.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_alert_service_rationale_18", + "target": "app_services_alert_service_send_admin_alert", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L106", + "source_file": "app/services/alert_service.py", + "source_location": "L98", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_services_appwrite_db_tablesdbwrapper", + "source": "app_services_alert_service_rationale_98", + "target": "app_services_alert_service_alert_zero_articles", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L444", + "source_file": "app/services/newsletter_service.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_services_deduplication_get_url_filter", + "source": "app_services_newsletter_service", + "target": "app_services_alert_service_alert_zero_articles", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L34", + "source_file": "app/services/newsletter_service.py", + "source_location": "L234", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_utils_custom_logger", + "source": "app_services_newsletter_service_send_scheduled_newsletter", + "target": "app_services_alert_service_alert_zero_articles", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L34", + "source_file": "app/services/alert_service.py", + "source_location": "L118", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_utils_custom_logger_get_logger", + "source": "app_services_alert_service_rationale_118", + "target": "app_services_alert_service_alert_quota_exhausted", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L251", + "source_file": "app/services/newsletter_service.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_appwrite_db", - "target": "app_utils_url_canonicalization_canonicalize_url", + "source": "app_services_newsletter_service", + "target": "app_services_alert_service_alert_quota_exhausted", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L1", + "source_file": "app/services/newsletter_service.py", + "source_location": "L276", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_1", - "target": "app_services_appwrite_db", + "source": "app_services_newsletter_service_send_scheduled_newsletter", + "target": "app_services_alert_service_alert_quota_exhausted", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L531", + "source_file": "app/services/alert_service.py", + "source_location": "L138", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_531", - "target": "app_services_appwrite_db", + "source": "app_services_alert_service_rationale_138", + "target": "app_services_alert_service_alert_high_failure_rate", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L9", + "source_file": "app/services/newsletter_service.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_audio_service", - "target": "app_services_appwrite_db", + "source": "app_services_newsletter_service", + "target": "app_services_alert_service_alert_high_failure_rate", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L12", + "source_file": "app/services/newsletter_service.py", + "source_location": "L287", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_services_appwrite_db", + "source": "app_services_newsletter_service_send_scheduled_newsletter", + "target": "app_services_alert_service_alert_high_failure_rate", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L9", + "source_file": "app/services/api_quota.py", + "source_location": "L13", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_appwrite_db", + "source": "app_services_api_quota", + "target": "app_services_api_quota_apiquotatracker", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L18", + "source_file": "app/services/api_quota.py", + "source_location": "L243", "weight": 1.0, - "source": "app_services_optimized_retrieval", - "target": "app_services_appwrite_db", + "source": "app_services_api_quota", + "target": "app_services_api_quota_get_quota_tracker", "confidence_score": 1.0 }, { - "relation": "imports_from", + "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/research_aggregator.py", - "source_location": "L10", + "source_file": "app/services/api_quota.py", + "source_location": "L173", "weight": 1.0, - "source": "app_services_research_aggregator", - "target": "app_services_appwrite_db", + "source": "app_services_api_quota", + "target": "app_services_upstash_cache_get_upstash_cache", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/services/api_quota.py", + "source_location": "L1", + "weight": 1.0, + "source": "app_services_api_quota_rationale_1", + "target": "app_services_api_quota", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L14", + "source_file": "app/services/news_aggregator.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_appwrite_db", + "source": "app_services_news_aggregator", + "target": "app_services_api_quota", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L635", + "source_file": "app/services/api_quota.py", + "source_location": "L159", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_delete_old_articles", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_async_can_make_call", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L1028", + "source_file": "app/services/api_quota.py", + "source_location": "L197", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_all_subscribers", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_async_record_call", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L309", + "source_file": "app/services/api_quota.py", + "source_location": "L97", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_articles", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_can_make_call", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L404", + "source_file": "app/services/api_quota.py", + "source_location": "L78", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_check_limits", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L1051", + "source_file": "app/services/api_quota.py", + "source_location": "L119", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_database_stats", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_get_stats", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L778", + "source_file": "app/services/api_quota.py", + "source_location": "L16", + "weight": 1.0, + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_init", + "confidence_score": 1.0 + }, + { + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/services/api_quota.py", + "source_location": "L44", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_subscriber", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker", + "target": "app_services_api_quota_apiquotatracker_record_call", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L832", + "source_file": "app/services/api_quota.py", + "source_location": "L243", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_subscriber_by_token", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_get_quota_tracker", + "target": "app_services_api_quota_apiquotatracker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L1006", + "source_file": "app/services/api_quota.py", + "source_location": "L14", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_subscribers_by_preference", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_rationale_14", + "target": "app_services_api_quota_apiquotatracker", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L954", + "source_file": "app/services/api_quota.py", + "source_location": "L208", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_last_sent", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker_async_record_call", + "target": "app_services_api_quota_apiquotatracker_record_call", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L797", + "source_file": "app/services/api_quota.py", + "source_location": "L76", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_subscriber", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker_record_call", + "target": "app_services_api_quota_apiquotatracker_check_limits", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L922", + "source_file": "app/services/api_quota.py", + "source_location": "L79", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_rationale_79", + "target": "app_services_api_quota_apiquotatracker_check_limits", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L894", + "source_file": "app/services/api_quota.py", + "source_location": "L195", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_subscription_status", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_apiquotatracker_async_can_make_call", + "target": "app_services_api_quota_apiquotatracker_can_make_call", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L39", + "source_file": "app/services/api_quota.py", + "source_location": "L98", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_39", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_rationale_98", + "target": "app_services_api_quota_apiquotatracker_can_make_call", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L18", + "source_file": "app/services/api_quota.py", + "source_location": "L120", "weight": 1.0, - "source": "app_services_optimized_retrieval", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_rationale_120", + "target": "app_services_api_quota_apiquotatracker_get_stats", "confidence_score": 1.0 }, { @@ -16850,354 +15974,353 @@ "context": "call", "confidence": "EXTRACTED", "confidence_score": 1.0, - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L122", - "weight": 1.0, - "source": "app_services_optimized_retrieval_optimizedretrieval_fetch_projected_articles", - "target": "app_services_appwrite_db_safe_get" - }, - { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L14", + "source_file": "app/services/api_quota.py", + "source_location": "L174", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_appwrite_db_safe_get", - "confidence_score": 1.0 + "source": "app_services_api_quota_apiquotatracker_async_can_make_call", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L740", + "source_file": "app/services/api_quota.py", + "source_location": "L160", "weight": 1.0, - "source": "app_services_scheduler_background_image_enricher_job", - "target": "app_services_appwrite_db_safe_get", + "source": "app_services_api_quota_rationale_160", + "target": "app_services_api_quota_apiquotatracker_async_can_make_call", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L611", + "confidence_score": 1.0, + "source_file": "app/services/api_quota.py", + "source_location": "L213", "weight": 1.0, - "source": "app_services_scheduler_cleanup_old_news", - "target": "app_services_appwrite_db_safe_get", - "confidence_score": 1.0 + "source": "app_services_api_quota_apiquotatracker_async_record_call", + "target": "app_services_upstash_cache_get_upstash_cache" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L107", - "weight": 1.0, - "source": "app_services_appwrite_db_rationale_107", - "target": "app_services_appwrite_db_tablesdbwrapper", - "confidence_score": 1.0 - }, - { - "relation": "method", - "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L114", + "source_file": "app/services/api_quota.py", + "source_location": "L198", "weight": 1.0, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_services_appwrite_db_tablesdbwrapper_create_row", + "source": "app_services_api_quota_rationale_198", + "target": "app_services_api_quota_apiquotatracker_async_record_call", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L126", + "source_file": "app/services/api_quota.py", + "source_location": "L244", "weight": 1.0, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_services_appwrite_db_tablesdbwrapper_delete_row", + "source": "app_services_api_quota_rationale_244", + "target": "app_services_api_quota_get_quota_tracker", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L118", + "source_file": "app/services/news_aggregator.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_services_appwrite_db_tablesdbwrapper_get_row", + "source": "app_services_news_aggregator", + "target": "app_services_api_quota_get_quota_tracker", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L111", + "confidence_score": 1.0, + "source_file": "app/services/news_aggregator.py", + "source_location": "L195", "weight": 1.0, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_services_appwrite_db_tablesdbwrapper_init", - "confidence_score": 1.0 + "source": "app_services_news_aggregator_newsaggregator_init", + "target": "app_services_api_quota_get_quota_tracker" }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L122", + "source_location": "L135", "weight": 1.0, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_services_appwrite_db_tablesdbwrapper_list_rows", + "source": "app_services_appwrite_db", + "target": "app_services_appwrite_db_appwritedatabase", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L130", + "source_location": "L1090", "weight": 1.0, - "source": "app_services_appwrite_db_tablesdbwrapper", - "target": "app_services_appwrite_db_tablesdbwrapper_update_row", + "source": "app_services_appwrite_db", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L713", + "source_location": "L38", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_create_subscriber", + "source": "app_services_appwrite_db", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L607", + "source_location": "L106", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_delete_old_articles", + "source": "app_services_appwrite_db", + "target": "app_services_appwrite_db_tablesdbwrapper", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L676", + "source_location": "L444", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_delete_row", + "source": "app_services_appwrite_db", + "target": "app_services_deduplication_get_url_filter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L235", + "source_location": "L34", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_generate_url_hash", + "source": "app_services_appwrite_db", + "target": "app_utils_custom_logger", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L1014", + "source_location": "L34", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_all_subscribers", + "source": "app_services_appwrite_db", + "target": "app_utils_custom_logger_get_logger", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L260", + "source_location": "L251", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_articles", + "source": "app_services_appwrite_db", + "target": "app_utils_url_canonicalization_canonicalize_url", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L354", + "source_location": "L1", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", + "source": "app_services_appwrite_db_rationale_1", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L195", + "source_location": "L531", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", + "source": "app_services_appwrite_db_rationale_531", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L1033", + "source_file": "app/services/audio_service.py", + "source_location": "L9", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_database_stats", + "source": "app_services_audio_service", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L765", + "source_file": "app/services/news_processor.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "source": "app_services_news_processor", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L822", + "source_file": "app/services/newsletter_service.py", + "source_location": "L9", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber_by_token", + "source": "app_services_newsletter_service", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L964", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_get_subscribers_by_preference", + "source": "app_services_optimized_retrieval", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L138", + "source_file": "app/services/research_aggregator.py", + "source_location": "L10", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_init", + "source": "app_services_research_aggregator", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L160", + "source_file": "app/services/scheduler.py", + "source_location": "L14", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_initialize", + "source": "app_services_scheduler", + "target": "app_services_appwrite_db", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L661", + "source_location": "L635", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_list_rows", + "source": "app_services_appwrite_db_appwritedatabase_delete_old_articles", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L430", + "source_location": "L1028", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_save_articles", + "source": "app_services_appwrite_db_appwritedatabase_get_all_subscribers", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L840", + "source_location": "L309", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_update_article_audio", + "source": "app_services_appwrite_db_appwritedatabase_get_articles", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L932", + "source_location": "L404", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_update_last_sent", + "source": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L692", + "source_location": "L1051", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_update_row", + "source": "app_services_appwrite_db_appwritedatabase_get_database_stats", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L786", + "source_location": "L778", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_update_subscriber", + "source": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L904", + "source_location": "L832", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", + "source": "app_services_appwrite_db_appwritedatabase_get_subscriber_by_token", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L862", + "source_location": "L1006", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase", - "target": "app_services_appwrite_db_appwritedatabase_update_subscription_status", + "source": "app_services_appwrite_db_appwritedatabase_get_subscribers_by_preference", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L1090", + "source_location": "L954", "weight": 1.0, - "source": "app_services_appwrite_db_get_appwrite_db", - "target": "app_services_appwrite_db_appwritedatabase", + "source": "app_services_appwrite_db_appwritedatabase_update_last_sent", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L136", + "source_location": "L797", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_136", - "target": "app_services_appwrite_db_appwritedatabase", + "source": "app_services_appwrite_db_appwritedatabase_update_subscriber", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { @@ -17205,10 +16328,10 @@ "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L158", + "source_location": "L922", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_init", - "target": "app_services_appwrite_db_appwritedatabase_initialize", + "source": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { @@ -17216,3055 +16339,3087 @@ "context": "call", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L1101", + "source_location": "L894", "weight": 1.0, - "source": "app_services_appwrite_db_get_appwrite_db", - "target": "app_services_appwrite_db_appwritedatabase_initialize", + "source": "app_services_appwrite_db_appwritedatabase_update_subscription_status", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L161", + "source_location": "L39", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_161", - "target": "app_services_appwrite_db_appwritedatabase_initialize", + "source": "app_services_appwrite_db_rationale_39", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L269", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_articles", - "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", + "source": "app_services_optimized_retrieval", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L371", + "confidence_score": 1.0, + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L122", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", - "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", - "confidence_score": 1.0 + "source": "app_services_optimized_retrieval_optimizedretrieval_fetch_projected_articles", + "target": "app_services_appwrite_db_safe_get" }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L196", + "source_file": "app/services/scheduler.py", + "source_location": "L14", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_196", - "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", + "source": "app_services_scheduler", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/appwrite_db.py", - "source_location": "L254", + "source_file": "app/services/scheduler.py", + "source_location": "L740", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_generate_url_hash", - "target": "app_utils_url_canonicalization_canonicalize_url" + "source": "app_services_scheduler_background_image_enricher_job", + "target": "app_services_appwrite_db_safe_get", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/appwrite_db.py", - "source_location": "L236", + "source_file": "app/services/scheduler.py", + "source_location": "L611", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_236", - "target": "app_services_appwrite_db_appwritedatabase_generate_url_hash", + "source": "app_services_scheduler_cleanup_old_news", + "target": "app_services_appwrite_db_safe_get", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L261", + "source_location": "L107", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_261", - "target": "app_services_appwrite_db_appwritedatabase_get_articles", + "source": "app_services_appwrite_db_rationale_107", + "target": "app_services_appwrite_db_tablesdbwrapper", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L355", + "source_location": "L114", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_355", - "target": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", + "source": "app_services_appwrite_db_tablesdbwrapper", + "target": "app_services_appwrite_db_tablesdbwrapper_create_row", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/services/appwrite_db.py", - "source_location": "L445", - "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_save_articles", - "target": "app_services_deduplication_get_url_filter" + "source_location": "L126", + "weight": 1.0, + "source": "app_services_appwrite_db_tablesdbwrapper", + "target": "app_services_appwrite_db_tablesdbwrapper_delete_row", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L431", + "source_location": "L118", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_431", - "target": "app_services_appwrite_db_appwritedatabase_save_articles", + "source": "app_services_appwrite_db_tablesdbwrapper", + "target": "app_services_appwrite_db_tablesdbwrapper_get_row", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L608", + "source_location": "L111", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_608", - "target": "app_services_appwrite_db_appwritedatabase_delete_old_articles", + "source": "app_services_appwrite_db_tablesdbwrapper", + "target": "app_services_appwrite_db_tablesdbwrapper_init", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L661", + "source_location": "L122", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_list_rows", - "target": "app_services_appwrite_db_py_any", + "source": "app_services_appwrite_db_tablesdbwrapper", + "target": "app_services_appwrite_db_tablesdbwrapper_list_rows", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L662", + "source_location": "L130", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_662", - "target": "app_services_appwrite_db_appwritedatabase_list_rows", + "source": "app_services_appwrite_db_tablesdbwrapper", + "target": "app_services_appwrite_db_tablesdbwrapper_update_row", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L677", + "source_location": "L713", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_677", - "target": "app_services_appwrite_db_appwritedatabase_delete_row", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_create_subscriber", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L693", + "source_location": "L607", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_693", - "target": "app_services_appwrite_db_appwritedatabase_update_row", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_delete_old_articles", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L757", + "source_location": "L676", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_create_subscriber", - "target": "app_services_appwrite_db_appwritedatabase_update_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_delete_row", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L714", + "source_location": "L235", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_714", - "target": "app_services_appwrite_db_appwritedatabase_create_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_generate_url_hash", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L940", + "source_location": "L1014", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_last_sent", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_all_subscribers", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L793", + "source_location": "L260", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_subscriber", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_articles", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L912", + "source_location": "L354", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L870", + "source_location": "L195", "weight": 1.0, - "source": "app_services_appwrite_db_appwritedatabase_update_subscription_status", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L766", + "source_location": "L1033", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_766", - "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_database_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L787", + "source_location": "L765", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_787", - "target": "app_services_appwrite_db_appwritedatabase_update_subscriber", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L823", + "source_location": "L822", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_823", + "source": "app_services_appwrite_db_appwritedatabase", "target": "app_services_appwrite_db_appwritedatabase_get_subscriber_by_token", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L841", + "source_location": "L964", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_841", - "target": "app_services_appwrite_db_appwritedatabase_update_article_audio", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_get_subscribers_by_preference", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L863", + "source_location": "L138", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_863", - "target": "app_services_appwrite_db_appwritedatabase_update_subscription_status", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_init", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L905", + "source_location": "L160", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_905", - "target": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_initialize", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L933", + "source_location": "L661", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_933", - "target": "app_services_appwrite_db_appwritedatabase_update_last_sent", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_list_rows", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L965", + "source_location": "L430", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_965", - "target": "app_services_appwrite_db_appwritedatabase_get_subscribers_by_preference", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_save_articles", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L1015", + "source_location": "L840", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_1015", - "target": "app_services_appwrite_db_appwritedatabase_get_all_subscribers", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_update_article_audio", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L1034", + "source_location": "L932", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_1034", - "target": "app_services_appwrite_db_appwritedatabase_get_database_stats", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_update_last_sent", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/appwrite_db.py", - "source_location": "L1091", + "source_location": "L692", "weight": 1.0, - "source": "app_services_appwrite_db_rationale_1091", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_update_row", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L9", + "source_file": "app/services/appwrite_db.py", + "source_location": "L786", "weight": 1.0, - "source": "app_services_audio_service", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_update_subscriber", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/audio_service.py", - "source_location": "L101", + "source_file": "app/services/appwrite_db.py", + "source_location": "L904", "weight": 1.0, - "source": "app_services_audio_service_audioservice_upload_audio", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", + "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L12", + "source_file": "app/services/appwrite_db.py", + "source_location": "L862", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_appwritedatabase", + "target": "app_services_appwrite_db_appwritedatabase_update_subscription_status", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L48", + "source_file": "app/services/appwrite_db.py", + "source_location": "L1090", "weight": 1.0, - "source": "app_services_news_processor_process_category", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_get_appwrite_db", + "target": "app_services_appwrite_db_appwritedatabase", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L9", + "source_file": "app/services/appwrite_db.py", + "source_location": "L136", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_rationale_136", + "target": "app_services_appwrite_db_appwritedatabase", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L75", + "source_file": "app/services/appwrite_db.py", + "source_location": "L158", "weight": 1.0, - "source": "app_services_newsletter_service_get_newsletter_content", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_appwritedatabase_init", + "target": "app_services_appwrite_db_appwritedatabase_initialize", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L239", + "source_file": "app/services/appwrite_db.py", + "source_location": "L1101", "weight": 1.0, - "source": "app_services_newsletter_service_send_scheduled_newsletter", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_get_appwrite_db", + "target": "app_services_appwrite_db_appwritedatabase_initialize", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L18", + "source_file": "app/services/appwrite_db.py", + "source_location": "L161", "weight": 1.0, - "source": "app_services_optimized_retrieval", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_rationale_161", + "target": "app_services_appwrite_db_appwritedatabase_initialize", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L34", - "weight": 1.0, - "source": "app_services_optimized_retrieval_optimizedretrieval_init", - "target": "app_services_appwrite_db_get_appwrite_db" - }, - { - "relation": "imports", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/research_aggregator.py", - "source_location": "L10", + "source_file": "app/services/appwrite_db.py", + "source_location": "L269", "weight": 1.0, - "source": "app_services_research_aggregator", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_appwritedatabase_get_articles", + "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/research_aggregator.py", - "source_location": "L162", + "source_file": "app/services/appwrite_db.py", + "source_location": "L371", "weight": 1.0, - "source": "app_services_research_aggregator_researchaggregator_save_paper", - "target": "app_services_appwrite_db_get_appwrite_db" + "source": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", + "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", + "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L14", + "source_file": "app/services/appwrite_db.py", + "source_location": "L196", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_rationale_196", + "target": "app_services_appwrite_db_appwritedatabase_get_collection_id", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L710", + "confidence_score": 1.0, + "source_file": "app/services/appwrite_db.py", + "source_location": "L254", "weight": 1.0, - "source": "app_services_scheduler_background_image_enricher_job", - "target": "app_services_appwrite_db_get_appwrite_db", - "confidence_score": 1.0 + "source": "app_services_appwrite_db_appwritedatabase_generate_url_hash", + "target": "app_utils_url_canonicalization_canonicalize_url" }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L563", + "source_file": "app/services/appwrite_db.py", + "source_location": "L236", "weight": 1.0, - "source": "app_services_scheduler_cleanup_old_news", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_rationale_236", + "target": "app_services_appwrite_db_appwritedatabase_generate_url_hash", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L222", + "source_file": "app/services/appwrite_db.py", + "source_location": "L261", "weight": 1.0, - "source": "app_services_scheduler_keepalive_job", - "target": "app_services_appwrite_db_get_appwrite_db", + "source": "app_services_appwrite_db_rationale_261", + "target": "app_services_appwrite_db_appwritedatabase_get_articles", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L12", + "source_file": "app/services/appwrite_db.py", + "source_location": "L355", "weight": 1.0, - "source": "app_services_audio_service", - "target": "app_services_audio_service_audioservice", + "source": "app_services_appwrite_db_rationale_355", + "target": "app_services_appwrite_db_appwritedatabase_get_articles_with_queries", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L89", + "confidence_score": 1.0, + "source_file": "app/services/appwrite_db.py", + "source_location": "L445", "weight": 1.0, - "source": "app_services_audio_service_audioservice", - "target": "app_services_audio_service_audioservice_generate_audio", - "confidence_score": 1.0 + "source": "app_services_appwrite_db_appwritedatabase_save_articles", + "target": "app_services_deduplication_get_url_filter" }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L50", + "source_file": "app/services/appwrite_db.py", + "source_location": "L431", "weight": 1.0, - "source": "app_services_audio_service_audioservice", - "target": "app_services_audio_service_audioservice_generate_audio_subprocess", + "source": "app_services_appwrite_db_rationale_431", + "target": "app_services_appwrite_db_appwritedatabase_save_articles", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L41", + "source_file": "app/services/appwrite_db.py", + "source_location": "L608", "weight": 1.0, - "source": "app_services_audio_service_audioservice", - "target": "app_services_audio_service_audioservice_generate_summary", + "source": "app_services_appwrite_db_rationale_608", + "target": "app_services_appwrite_db_appwritedatabase_delete_old_articles", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L18", + "source_file": "app/services/appwrite_db.py", + "source_location": "L661", "weight": 1.0, - "source": "app_services_audio_service_audioservice", - "target": "app_services_audio_service_audioservice_generate_summary_sync", + "source": "app_services_appwrite_db_appwritedatabase_list_rows", + "target": "app_services_appwrite_db_py_any", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L13", + "source_file": "app/services/appwrite_db.py", + "source_location": "L662", "weight": 1.0, - "source": "app_services_audio_service_audioservice", - "target": "app_services_audio_service_audioservice_init", + "source": "app_services_appwrite_db_rationale_662", + "target": "app_services_appwrite_db_appwritedatabase_list_rows", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L98", + "source_file": "app/services/appwrite_db.py", + "source_location": "L677", "weight": 1.0, - "source": "app_services_audio_service_audioservice", - "target": "app_services_audio_service_audioservice_upload_audio", + "source": "app_services_appwrite_db_rationale_677", + "target": "app_services_appwrite_db_appwritedatabase_delete_row", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L19", + "source_file": "app/services/appwrite_db.py", + "source_location": "L693", "weight": 1.0, - "source": "app_services_audio_service_rationale_19", - "target": "app_services_audio_service_audioservice_generate_summary_sync", + "source": "app_services_appwrite_db_rationale_693", + "target": "app_services_appwrite_db_appwritedatabase_update_row", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L42", + "source_file": "app/services/appwrite_db.py", + "source_location": "L757", "weight": 1.0, - "source": "app_services_audio_service_rationale_42", - "target": "app_services_audio_service_audioservice_generate_summary", + "source": "app_services_appwrite_db_appwritedatabase_create_subscriber", + "target": "app_services_appwrite_db_appwritedatabase_update_subscriber", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L51", + "source_file": "app/services/appwrite_db.py", + "source_location": "L714", "weight": 1.0, - "source": "app_services_audio_service_rationale_51", - "target": "app_services_audio_service_audioservice_generate_audio_subprocess", + "source": "app_services_appwrite_db_rationale_714", + "target": "app_services_appwrite_db_appwritedatabase_create_subscriber", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L90", + "source_file": "app/services/appwrite_db.py", + "source_location": "L940", "weight": 1.0, - "source": "app_services_audio_service_rationale_90", - "target": "app_services_audio_service_audioservice_generate_audio", + "source": "app_services_appwrite_db_appwritedatabase_update_last_sent", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/audio_service.py", - "source_location": "L99", + "source_file": "app/services/appwrite_db.py", + "source_location": "L793", "weight": 1.0, - "source": "app_services_audio_service_rationale_99", - "target": "app_services_audio_service_audioservice_upload_audio", + "source": "app_services_appwrite_db_appwritedatabase_update_subscriber", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L16", + "source_file": "app/services/appwrite_db.py", + "source_location": "L912", "weight": 1.0, - "source": "app_services_brevo_email_service", - "target": "app_services_brevo_email_service_brevoemailservice", + "source": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L454", + "source_file": "app/services/appwrite_db.py", + "source_location": "L870", "weight": 1.0, - "source": "app_services_brevo_email_service", - "target": "app_services_brevo_email_service_get_brevo_service", + "source": "app_services_appwrite_db_appwritedatabase_update_subscription_status", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L1", + "source_file": "app/services/appwrite_db.py", + "source_location": "L766", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_1", - "target": "app_services_brevo_email_service", + "source": "app_services_appwrite_db_rationale_766", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L11", - "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_brevo_email_service", + "source_file": "app/services/appwrite_db.py", + "source_location": "L787", + "weight": 1.0, + "source": "app_services_appwrite_db_rationale_787", + "target": "app_services_appwrite_db_appwritedatabase_update_subscriber", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L66", + "source_file": "app/services/appwrite_db.py", + "source_location": "L823", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_check_quota", + "source": "app_services_appwrite_db_rationale_823", + "target": "app_services_appwrite_db_appwritedatabase_get_subscriber_by_token", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L111", + "source_file": "app/services/appwrite_db.py", + "source_location": "L841", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", + "source": "app_services_appwrite_db_rationale_841", + "target": "app_services_appwrite_db_appwritedatabase_update_article_audio", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L104", + "source_file": "app/services/appwrite_db.py", + "source_location": "L863", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_token", + "source": "app_services_appwrite_db_rationale_863", + "target": "app_services_appwrite_db_appwritedatabase_update_subscription_status", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L34", + "source_file": "app/services/appwrite_db.py", + "source_location": "L905", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_get_account_info", + "source": "app_services_appwrite_db_rationale_905", + "target": "app_services_appwrite_db_appwritedatabase_update_subscriber_status", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L19", + "source_file": "app/services/appwrite_db.py", + "source_location": "L933", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_init", + "source": "app_services_appwrite_db_rationale_933", + "target": "app_services_appwrite_db_appwritedatabase_update_last_sent", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L203", + "source_file": "app/services/appwrite_db.py", + "source_location": "L965", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_send_newsletter", + "source": "app_services_appwrite_db_rationale_965", + "target": "app_services_appwrite_db_appwritedatabase_get_subscribers_by_preference", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L404", + "source_file": "app/services/appwrite_db.py", + "source_location": "L1015", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_send_unsubscribe_confirmation", + "source": "app_services_appwrite_db_rationale_1015", + "target": "app_services_appwrite_db_appwritedatabase_get_all_subscribers", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L119", + "source_file": "app/services/appwrite_db.py", + "source_location": "L1034", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice", - "target": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", + "source": "app_services_appwrite_db_rationale_1034", + "target": "app_services_appwrite_db_appwritedatabase_get_database_stats", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L454", + "source_file": "app/services/appwrite_db.py", + "source_location": "L1091", "weight": 1.0, - "source": "app_services_brevo_email_service_get_brevo_service", - "target": "app_services_brevo_email_service_brevoemailservice", + "source": "app_services_appwrite_db_rationale_1091", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L17", + "source_file": "app/services/audio_service.py", + "source_location": "L9", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_17", - "target": "app_services_brevo_email_service_brevoemailservice", + "source": "app_services_audio_service", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L80", + "confidence_score": 1.0, + "source_file": "app/services/audio_service.py", + "source_location": "L101", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice_check_quota", - "target": "app_services_brevo_email_service_brevoemailservice_get_account_info", + "source": "app_services_audio_service_audioservice_upload_audio", + "target": "app_services_appwrite_db_get_appwrite_db" + }, + { + "relation": "imports", + "context": "import", + "confidence": "EXTRACTED", + "source_file": "app/services/news_processor.py", + "source_location": "L12", + "weight": 1.0, + "source": "app_services_news_processor", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L35", + "source_file": "app/services/news_processor.py", + "source_location": "L48", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_35", - "target": "app_services_brevo_email_service_brevoemailservice_get_account_info", + "source": "app_services_news_processor_process_category", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "references", - "context": "generic_arg", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L66", + "source_file": "app/services/newsletter_service.py", + "source_location": "L9", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice_check_quota", - "target": "app_services_brevo_email_service_py_any", + "source": "app_services_newsletter_service", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L236", + "source_file": "app/services/newsletter_service.py", + "source_location": "L75", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice_send_newsletter", - "target": "app_services_brevo_email_service_brevoemailservice_check_quota", + "source": "app_services_newsletter_service_get_newsletter_content", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L67", + "source_file": "app/services/newsletter_service.py", + "source_location": "L239", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_67", - "target": "app_services_brevo_email_service_brevoemailservice_check_quota", + "source": "app_services_newsletter_service_send_scheduled_newsletter", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L105", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_105", - "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_token", + "source": "app_services_optimized_retrieval", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L269", + "confidence_score": 1.0, + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L34", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice_send_newsletter", - "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", - "confidence_score": 1.0 + "source": "app_services_optimized_retrieval_optimizedretrieval_init", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L122", + "source_file": "app/services/research_aggregator.py", + "source_location": "L10", "weight": 1.0, - "source": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", - "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", + "source": "app_services_research_aggregator", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L112", + "confidence_score": 1.0, + "source_file": "app/services/research_aggregator.py", + "source_location": "L162", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_112", - "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", - "confidence_score": 1.0 + "source": "app_services_research_aggregator_researchaggregator_save_paper", + "target": "app_services_appwrite_db_get_appwrite_db" }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L120", + "source_file": "app/services/scheduler.py", + "source_location": "L14", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_120", - "target": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", + "source": "app_services_scheduler", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L212", + "source_file": "app/services/scheduler.py", + "source_location": "L710", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_212", - "target": "app_services_brevo_email_service_brevoemailservice_send_newsletter", + "source": "app_services_scheduler_background_image_enricher_job", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L405", + "source_file": "app/services/scheduler.py", + "source_location": "L563", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_405", - "target": "app_services_brevo_email_service_brevoemailservice_send_unsubscribe_confirmation", + "source": "app_services_scheduler_cleanup_old_news", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/brevo_email_service.py", - "source_location": "L455", + "source_file": "app/services/scheduler.py", + "source_location": "L222", "weight": 1.0, - "source": "app_services_brevo_email_service_rationale_455", - "target": "app_services_brevo_email_service_get_brevo_service", + "source": "app_services_scheduler_keepalive_job", + "target": "app_services_appwrite_db_get_appwrite_db", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L11", + "source_file": "app/services/audio_service.py", + "source_location": "L12", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_brevo_email_service_get_brevo_service", + "source": "app_services_audio_service", + "target": "app_services_audio_service_audioservice", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L252", + "source_file": "app/services/audio_service.py", + "source_location": "L89", "weight": 1.0, - "source": "app_services_newsletter_service_send_scheduled_newsletter", - "target": "app_services_brevo_email_service_get_brevo_service", + "source": "app_services_audio_service_audioservice", + "target": "app_services_audio_service_audioservice_generate_audio", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L22", + "source_file": "app/services/audio_service.py", + "source_location": "L50", "weight": 1.0, - "source": "app_services_browser_manager", - "target": "app_services_browser_manager_browsermanager", + "source": "app_services_audio_service_audioservice", + "target": "app_services_audio_service_audioservice_generate_audio_subprocess", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L80", + "source_file": "app/services/audio_service.py", + "source_location": "L41", "weight": 1.0, - "source": "app_services_browser_manager_browsermanager", - "target": "app_services_browser_manager_browsermanager_get_content", + "source": "app_services_audio_service_audioservice", + "target": "app_services_audio_service_audioservice_generate_summary", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L31", + "source_file": "app/services/audio_service.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_browser_manager_browsermanager", - "target": "app_services_browser_manager_browsermanager_init", + "source": "app_services_audio_service_audioservice", + "target": "app_services_audio_service_audioservice_generate_summary_sync", "confidence_score": 1.0 }, { - "relation": "indirect_call", - "confidence": "INFERRED", - "source_file": "app/services/browser_manager.py", - "source_location": "L27", + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/services/audio_service.py", + "source_location": "L13", "weight": 1.0, - "context": "argument", - "source": "app_services_browser_manager_browsermanager_new", - "target": "app_services_browser_manager_browsermanager", - "confidence_score": 0.5 + "source": "app_services_audio_service_audioservice", + "target": "app_services_audio_service_audioservice_init", + "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L67", + "source_file": "app/services/audio_service.py", + "source_location": "L98", "weight": 1.0, - "source": "app_services_browser_manager_browsermanager", - "target": "app_services_browser_manager_browsermanager_shutdown", + "source": "app_services_audio_service_audioservice", + "target": "app_services_audio_service_audioservice_upload_audio", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L43", + "source_file": "app/services/audio_service.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_browser_manager_browsermanager", - "target": "app_services_browser_manager_browsermanager_start", + "source": "app_services_audio_service_rationale_19", + "target": "app_services_audio_service_audioservice_generate_summary_sync", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L44", + "source_file": "app/services/audio_service.py", + "source_location": "L42", "weight": 1.0, - "source": "app_services_browser_manager_rationale_44", - "target": "app_services_browser_manager_browsermanager_start", + "source": "app_services_audio_service_rationale_42", + "target": "app_services_audio_service_audioservice_generate_summary", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L68", + "source_file": "app/services/audio_service.py", + "source_location": "L51", "weight": 1.0, - "source": "app_services_browser_manager_rationale_68", - "target": "app_services_browser_manager_browsermanager_shutdown", + "source": "app_services_audio_service_rationale_51", + "target": "app_services_audio_service_audioservice_generate_audio_subprocess", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/browser_manager.py", - "source_location": "L81", + "source_file": "app/services/audio_service.py", + "source_location": "L90", "weight": 1.0, - "source": "app_services_browser_manager_rationale_81", - "target": "app_services_browser_manager_browsermanager_get_content", + "source": "app_services_audio_service_rationale_90", + "target": "app_services_audio_service_audioservice_generate_audio", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L24", + "source_file": "app/services/audio_service.py", + "source_location": "L99", "weight": 1.0, - "source": "app_services_cache_service", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_audio_service_rationale_99", + "target": "app_services_audio_service_audioservice_upload_audio", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L20", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L16", "weight": 1.0, - "source": "app_services_cache_service", - "target": "app_services_upstash_cache", + "source": "app_services_brevo_email_service", + "target": "app_services_brevo_email_service_brevoemailservice", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L20", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L454", "weight": 1.0, - "source": "app_services_cache_service", - "target": "app_services_upstash_cache_get_upstash_cache", + "source": "app_services_brevo_email_service", + "target": "app_services_brevo_email_service_get_brevo_service", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", + "source_file": "app/services/brevo_email_service.py", "source_location": "L1", "weight": 1.0, - "source": "app_services_cache_service_rationale_1", - "target": "app_services_cache_service", + "source": "app_services_brevo_email_service_rationale_1", + "target": "app_services_brevo_email_service", "confidence_score": 1.0 }, { "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L13", + "source_file": "app/services/newsletter_service.py", + "source_location": "L11", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_services_cache_service", + "source": "app_services_newsletter_service", + "target": "app_services_brevo_email_service", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L19", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L66", "weight": 1.0, - "source": "app_services_optimized_retrieval", - "target": "app_services_cache_service", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_check_quota", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L15", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L111", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_cache_service", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", - "confidence": "INFERRED", - "confidence_score": 0.8, - "source_file": "C:/Users/Dell/Desktop/Segmento-app-website-dev/SegmentoPulse-Backend/SegmentoPulse/backend/app/services/scheduler.py", - "source_location": "L615", + "relation": "method", + "confidence": "EXTRACTED", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L104", "weight": 1.0, - "source": "app_services_scheduler_cleanup_old_news", - "target": "app_services_cache_service" + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_token", + "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L172", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L34", "weight": 1.0, - "source": "app_services_cache_service_cacheservice", - "target": "app_services_cache_service_cacheservice_clear_all", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_get_account_info", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L59", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_cache_service_cacheservice", - "target": "app_services_cache_service_cacheservice_connect", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_init", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L153", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L203", "weight": 1.0, - "source": "app_services_cache_service_cacheservice", - "target": "app_services_cache_service_cacheservice_delete", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_send_newsletter", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L75", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L404", "weight": 1.0, - "source": "app_services_cache_service_cacheservice", - "target": "app_services_cache_service_cacheservice_get", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_send_unsubscribe_confirmation", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L30", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L119", "weight": 1.0, - "source": "app_services_cache_service_cacheservice", - "target": "app_services_cache_service_cacheservice_init", + "source": "app_services_brevo_email_service_brevoemailservice", + "target": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L111", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L454", + "weight": 1.0, + "source": "app_services_brevo_email_service_get_brevo_service", + "target": "app_services_brevo_email_service_brevoemailservice", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L17", + "weight": 1.0, + "source": "app_services_brevo_email_service_rationale_17", + "target": "app_services_brevo_email_service_brevoemailservice", + "confidence_score": 1.0 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L80", "weight": 1.0, - "source": "app_services_cache_service_cacheservice", - "target": "app_services_cache_service_cacheservice_set", + "source": "app_services_brevo_email_service_brevoemailservice_check_quota", + "target": "app_services_brevo_email_service_brevoemailservice_get_account_info", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L25", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L35", "weight": 1.0, - "source": "app_services_cache_service_rationale_25", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_brevo_email_service_rationale_35", + "target": "app_services_brevo_email_service_brevoemailservice_get_account_info", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "references", + "context": "generic_arg", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L13", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L66", "weight": 1.0, - "source": "app_services_news_processor", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_brevo_email_service_brevoemailservice_check_quota", + "target": "app_services_brevo_email_service_py_any", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_processor.py", - "source_location": "L49", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L236", "weight": 1.0, - "source": "app_services_news_processor_process_category", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_brevo_email_service_brevoemailservice_send_newsletter", + "target": "app_services_brevo_email_service_brevoemailservice_check_quota", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L19", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L67", "weight": 1.0, - "source": "app_services_optimized_retrieval", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_brevo_email_service_rationale_67", + "target": "app_services_brevo_email_service_brevoemailservice_check_quota", "confidence_score": 1.0 }, { - "relation": "uses", - "confidence": "INFERRED", - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L19", - "weight": 0.8, - "source": "app_services_optimized_retrieval_optimizedretrieval", - "target": "app_services_cache_service_cacheservice", - "confidence_score": 0.5 - }, - { - "relation": "calls", - "context": "call", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/optimized_retrieval.py", - "source_location": "L35", - "weight": 1.0, - "source": "app_services_optimized_retrieval_optimizedretrieval_init", - "target": "app_services_cache_service_cacheservice" - }, - { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L15", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L105", "weight": 1.0, - "source": "app_services_scheduler", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_brevo_email_service_rationale_105", + "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_token", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/scheduler.py", - "source_location": "L669", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L269", "weight": 1.0, - "source": "app_services_scheduler_cleanup_old_news", - "target": "app_services_cache_service_cacheservice", + "source": "app_services_brevo_email_service_brevoemailservice_send_newsletter", + "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/cache_service.py", - "source_location": "L36", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L122", "weight": 1.0, - "source": "app_services_cache_service_cacheservice_init", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", + "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L164", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L112", "weight": 1.0, - "source": "app_services_cache_service_cacheservice_delete", - "target": "app_services_cache_service_cacheservice_connect", + "source": "app_services_brevo_email_service_rationale_112", + "target": "app_services_brevo_email_service_brevoemailservice_generate_unsubscribe_link", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L98", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L120", "weight": 1.0, - "source": "app_services_cache_service_cacheservice_get", - "target": "app_services_cache_service_cacheservice_connect", + "source": "app_services_brevo_email_service_rationale_120", + "target": "app_services_brevo_email_service_brevoemailservice_send_welcome_email", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L137", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L212", "weight": 1.0, - "source": "app_services_cache_service_cacheservice_set", - "target": "app_services_cache_service_cacheservice_connect", + "source": "app_services_brevo_email_service_rationale_212", + "target": "app_services_brevo_email_service_brevoemailservice_send_newsletter", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L60", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L405", "weight": 1.0, - "source": "app_services_cache_service_rationale_60", - "target": "app_services_cache_service_cacheservice_connect", + "source": "app_services_brevo_email_service_rationale_405", + "target": "app_services_brevo_email_service_brevoemailservice_send_unsubscribe_confirmation", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L76", + "source_file": "app/services/brevo_email_service.py", + "source_location": "L455", "weight": 1.0, - "source": "app_services_cache_service_rationale_76", - "target": "app_services_cache_service_cacheservice_get", + "source": "app_services_brevo_email_service_rationale_455", + "target": "app_services_brevo_email_service_get_brevo_service", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/cache_service.py", - "source_location": "L112", + "source_file": "app/services/newsletter_service.py", + "source_location": "L11", "weight": 1.0, - "source": "app_services_cache_service_rationale_112", - "target": "app_services_cache_service_cacheservice_set", + "source": "app_services_newsletter_service", + "target": "app_services_brevo_email_service_get_brevo_service", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L187", + "source_file": "app/services/newsletter_service.py", + "source_location": "L252", "weight": 1.0, - "source": "app_services_chunker", - "target": "app_services_chunker_estimate_tokens", + "source": "app_services_newsletter_service_send_scheduled_newsletter", + "target": "app_services_brevo_email_service_get_brevo_service", "confidence_score": 1.0 }, { "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L17", + "source_file": "app/services/browser_manager.py", + "source_location": "L22", "weight": 1.0, - "source": "app_services_chunker", - "target": "app_services_chunker_sentencesplitter", + "source": "app_services_browser_manager", + "target": "app_services_browser_manager_browsermanager", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L1", + "source_file": "app/services/browser_manager.py", + "source_location": "L80", "weight": 1.0, - "source": "app_services_chunker_rationale_1", - "target": "app_services_chunker", + "source": "app_services_browser_manager_browsermanager", + "target": "app_services_browser_manager_browsermanager_get_content", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L18", + "source_file": "app/services/browser_manager.py", + "source_location": "L31", "weight": 1.0, - "source": "app_services_chunker_rationale_18", - "target": "app_services_chunker_sentencesplitter", + "source": "app_services_browser_manager_browsermanager", + "target": "app_services_browser_manager_browsermanager_init", "confidence_score": 1.0 }, + { + "relation": "indirect_call", + "confidence": "INFERRED", + "source_file": "app/services/browser_manager.py", + "source_location": "L27", + "weight": 1.0, + "context": "argument", + "source": "app_services_browser_manager_browsermanager_new", + "target": "app_services_browser_manager_browsermanager", + "confidence_score": 0.5 + }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L96", + "source_file": "app/services/browser_manager.py", + "source_location": "L67", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter", - "target": "app_services_chunker_sentencesplitter_combine_sentences", + "source": "app_services_browser_manager_browsermanager", + "target": "app_services_browser_manager_browsermanager_shutdown", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L133", + "source_file": "app/services/browser_manager.py", + "source_location": "L43", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter", - "target": "app_services_chunker_sentencesplitter_get_overlap", + "source": "app_services_browser_manager_browsermanager", + "target": "app_services_browser_manager_browsermanager_start", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L27", + "source_file": "app/services/browser_manager.py", + "source_location": "L44", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter", - "target": "app_services_chunker_sentencesplitter_init", + "source": "app_services_browser_manager_rationale_44", + "target": "app_services_browser_manager_browsermanager_start", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L69", + "source_file": "app/services/browser_manager.py", + "source_location": "L68", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter", - "target": "app_services_chunker_sentencesplitter_split_sentences", + "source": "app_services_browser_manager_rationale_68", + "target": "app_services_browser_manager_browsermanager_shutdown", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/services/browser_manager.py", + "source_location": "L81", + "weight": 1.0, + "source": "app_services_browser_manager_rationale_81", + "target": "app_services_browser_manager_browsermanager_get_content", + "confidence_score": 1.0 + }, + { + "relation": "contains", + "confidence": "EXTRACTED", + "source_file": "app/services/cache_service.py", + "source_location": "L24", + "weight": 1.0, + "source": "app_services_cache_service", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L48", + "source_file": "app/services/cache_service.py", + "source_location": "L20", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter", - "target": "app_services_chunker_sentencesplitter_split_text", + "source": "app_services_cache_service", + "target": "app_services_upstash_cache", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L156", + "source_file": "app/services/cache_service.py", + "source_location": "L20", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter", - "target": "app_services_chunker_sentencesplitter_split_text_with_metadata", + "source": "app_services_cache_service", + "target": "app_services_upstash_cache_get_upstash_cache", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L33", + "source_file": "app/services/cache_service.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_chunker_rationale_33", - "target": "app_services_chunker_sentencesplitter_init", + "source": "app_services_cache_service_rationale_1", + "target": "app_services_cache_service", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L49", + "source_file": "app/services/news_processor.py", + "source_location": "L13", "weight": 1.0, - "source": "app_services_chunker_rationale_49", - "target": "app_services_chunker_sentencesplitter_split_text", + "source": "app_services_news_processor", + "target": "app_services_cache_service", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L65", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter_split_text", - "target": "app_services_chunker_sentencesplitter_combine_sentences", + "source": "app_services_optimized_retrieval", + "target": "app_services_cache_service", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L62", + "source_file": "app/services/scheduler.py", + "source_location": "L15", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter_split_text", - "target": "app_services_chunker_sentencesplitter_split_sentences", + "source": "app_services_scheduler", + "target": "app_services_cache_service", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", - "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L171", + "confidence": "INFERRED", + "confidence_score": 0.8, + "source_file": "C:/Users/Dell/Desktop/Segmento-app-website-dev/SegmentoPulse-Backend/SegmentoPulse/backend/app/services/scheduler.py", + "source_location": "L615", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter_split_text_with_metadata", - "target": "app_services_chunker_sentencesplitter_split_text", - "confidence_score": 1.0 + "source": "app_services_scheduler_cleanup_old_news", + "target": "app_services_cache_service" }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L70", + "source_file": "app/services/cache_service.py", + "source_location": "L172", "weight": 1.0, - "source": "app_services_chunker_rationale_70", - "target": "app_services_chunker_sentencesplitter_split_sentences", + "source": "app_services_cache_service_cacheservice", + "target": "app_services_cache_service_cacheservice_clear_all", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L97", + "source_file": "app/services/cache_service.py", + "source_location": "L59", "weight": 1.0, - "source": "app_services_chunker_rationale_97", - "target": "app_services_chunker_sentencesplitter_combine_sentences", + "source": "app_services_cache_service_cacheservice", + "target": "app_services_cache_service_cacheservice_connect", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L119", + "source_file": "app/services/cache_service.py", + "source_location": "L153", "weight": 1.0, - "source": "app_services_chunker_sentencesplitter_combine_sentences", - "target": "app_services_chunker_sentencesplitter_get_overlap", + "source": "app_services_cache_service_cacheservice", + "target": "app_services_cache_service_cacheservice_delete", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L134", + "source_file": "app/services/cache_service.py", + "source_location": "L75", "weight": 1.0, - "source": "app_services_chunker_rationale_134", - "target": "app_services_chunker_sentencesplitter_get_overlap", + "source": "app_services_cache_service_cacheservice", + "target": "app_services_cache_service_cacheservice_get", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L161", + "source_file": "app/services/cache_service.py", + "source_location": "L30", "weight": 1.0, - "source": "app_services_chunker_rationale_161", - "target": "app_services_chunker_sentencesplitter_split_text_with_metadata", + "source": "app_services_cache_service_cacheservice", + "target": "app_services_cache_service_cacheservice_init", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/chunker.py", - "source_location": "L188", + "source_file": "app/services/cache_service.py", + "source_location": "L111", "weight": 1.0, - "source": "app_services_chunker_rationale_188", - "target": "app_services_chunker_estimate_tokens", + "source": "app_services_cache_service_cacheservice", + "target": "app_services_cache_service_cacheservice_set", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", + "source_file": "app/services/cache_service.py", "source_location": "L25", "weight": 1.0, - "source": "app_services_circuit_breaker", - "target": "app_services_circuit_breaker_circuitstate", - "confidence_score": 1.0 - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L464", - "weight": 1.0, - "source": "app_services_circuit_breaker", - "target": "app_services_circuit_breaker_get_circuit_breaker", + "source": "app_services_cache_service_rationale_25", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L32", + "source_file": "app/services/news_processor.py", + "source_location": "L13", "weight": 1.0, - "source": "app_services_circuit_breaker", - "target": "app_services_circuit_breaker_providercircuitbreaker", + "source": "app_services_news_processor", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L485", + "source_file": "app/services/news_processor.py", + "source_location": "L49", "weight": 1.0, - "source": "app_services_circuit_breaker", - "target": "app_services_circuit_breaker_startup_circuit_breaker", + "source": "app_services_news_processor_process_category", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { "relation": "imports", "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L134", + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_circuit_breaker", - "target": "app_services_upstash_cache_get_upstash_cache", + "source": "app_services_optimized_retrieval", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", - "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", + "relation": "uses", + "confidence": "INFERRED", + "source_file": "app/services/optimized_retrieval.py", "source_location": "L19", + "weight": 0.8, + "source": "app_services_optimized_retrieval_optimizedretrieval", + "target": "app_services_cache_service_cacheservice", + "confidence_score": 0.5 + }, + { + "relation": "calls", + "context": "call", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "app/services/optimized_retrieval.py", + "source_location": "L35", "weight": 1.0, - "source": "app_services_circuit_breaker", - "target": "enum", - "confidence_score": 1.0 + "source": "app_services_optimized_retrieval_optimizedretrieval_init", + "target": "app_services_cache_service_cacheservice" }, { - "relation": "rationale_for", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L1", + "source_file": "app/services/scheduler.py", + "source_location": "L15", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_1", - "target": "app_services_circuit_breaker", + "source": "app_services_scheduler", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L109", + "source_file": "app/services/scheduler.py", + "source_location": "L669", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_109", - "target": "app_services_circuit_breaker", + "source": "app_services_scheduler_cleanup_old_news", + "target": "app_services_cache_service_cacheservice", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L83", + "confidence_score": 1.0, + "source_file": "app/services/cache_service.py", + "source_location": "L36", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_83", - "target": "app_services_circuit_breaker", - "confidence_score": 1.0 + "source": "app_services_cache_service_cacheservice_init", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L20", + "source_file": "app/services/cache_service.py", + "source_location": "L164", "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_services_circuit_breaker", + "source": "app_services_cache_service_cacheservice_delete", + "target": "app_services_cache_service_cacheservice_connect", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L25", + "source_file": "app/services/cache_service.py", + "source_location": "L98", "weight": 1.0, - "source": "app_services_circuit_breaker_circuitstate", - "target": "enum", + "source": "app_services_cache_service_cacheservice_get", + "target": "app_services_cache_service_cacheservice_connect", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L25", + "source_file": "app/services/cache_service.py", + "source_location": "L137", "weight": 1.0, - "source": "app_services_circuit_breaker_circuitstate", - "target": "str", + "source": "app_services_cache_service_cacheservice_set", + "target": "app_services_cache_service_cacheservice_connect", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L26", + "source_file": "app/services/cache_service.py", + "source_location": "L60", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_26", - "target": "app_services_circuit_breaker_circuitstate", + "source": "app_services_cache_service_rationale_60", + "target": "app_services_cache_service_cacheservice_connect", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L8", + "source_file": "app/services/cache_service.py", + "source_location": "L76", "weight": 1.0, - "source": "app_services_news_providers", - "target": "enum", + "source": "app_services_cache_service_rationale_76", + "target": "app_services_cache_service_cacheservice_get", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/news_providers.py", - "source_location": "L13", + "source_file": "app/services/cache_service.py", + "source_location": "L112", "weight": 1.0, - "source": "app_services_news_providers_providerstatus", - "target": "enum", + "source": "app_services_cache_service_rationale_112", + "target": "app_services_cache_service_cacheservice_set", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/providers/base.py", - "source_location": "L58", + "source_file": "app/services/chunker.py", + "source_location": "L187", "weight": 1.0, - "source": "app_services_providers_base", - "target": "enum", + "source": "app_services_chunker", + "target": "app_services_chunker_estimate_tokens", "confidence_score": 1.0 }, { - "relation": "inherits", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/providers/base.py", - "source_location": "L69", + "source_file": "app/services/chunker.py", + "source_location": "L17", "weight": 1.0, - "source": "app_services_providers_base_providerstatus", - "target": "enum", + "source": "app_services_chunker", + "target": "app_services_chunker_sentencesplitter", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L464", + "source_file": "app/services/chunker.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_circuit_breaker_get_circuit_breaker", - "target": "app_services_circuit_breaker_providercircuitbreaker", + "source": "app_services_chunker_rationale_1", + "target": "app_services_chunker", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L173", + "source_file": "app/services/chunker.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "source": "app_services_chunker_rationale_18", + "target": "app_services_chunker_sentencesplitter", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L406", + "source_file": "app/services/chunker.py", + "source_location": "L96", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_get_stats", + "source": "app_services_chunker_sentencesplitter", + "target": "app_services_chunker_sentencesplitter_combine_sentences", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L54", + "source_file": "app/services/chunker.py", + "source_location": "L133", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_init", + "source": "app_services_chunker_sentencesplitter", + "target": "app_services_chunker_sentencesplitter_get_overlap", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L127", + "source_file": "app/services/chunker.py", + "source_location": "L27", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", + "source": "app_services_chunker_sentencesplitter", + "target": "app_services_chunker_sentencesplitter_init", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L157", + "source_file": "app/services/chunker.py", + "source_location": "L69", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", + "source": "app_services_chunker_sentencesplitter", + "target": "app_services_chunker_sentencesplitter_split_sentences", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L430", + "source_file": "app/services/chunker.py", + "source_location": "L48", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_print_stats", + "source": "app_services_chunker_sentencesplitter", + "target": "app_services_chunker_sentencesplitter_split_text", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L292", + "source_file": "app/services/chunker.py", + "source_location": "L156", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_record_failure", + "source": "app_services_chunker_sentencesplitter", + "target": "app_services_chunker_sentencesplitter_split_text_with_metadata", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L268", + "source_file": "app/services/chunker.py", + "source_location": "L33", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_record_success", + "source": "app_services_chunker_rationale_33", + "target": "app_services_chunker_sentencesplitter_init", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L123", + "source_file": "app/services/chunker.py", + "source_location": "L49", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", + "source": "app_services_chunker_rationale_49", + "target": "app_services_chunker_sentencesplitter_split_text", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L365", + "source_file": "app/services/chunker.py", + "source_location": "L65", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_reset", + "source": "app_services_chunker_sentencesplitter_split_text", + "target": "app_services_chunker_sentencesplitter_combine_sentences", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L400", + "source_file": "app/services/chunker.py", + "source_location": "L62", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", + "source": "app_services_chunker_sentencesplitter_split_text", + "target": "app_services_chunker_sentencesplitter_split_sentences", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L191", + "source_file": "app/services/chunker.py", + "source_location": "L171", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_should_skip", + "source": "app_services_chunker_sentencesplitter_split_text_with_metadata", + "target": "app_services_chunker_sentencesplitter_split_text", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L33", + "source_file": "app/services/chunker.py", + "source_location": "L70", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_33", - "target": "app_services_circuit_breaker_providercircuitbreaker", + "source": "app_services_chunker_rationale_70", + "target": "app_services_chunker_sentencesplitter_split_sentences", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L61", + "source_file": "app/services/chunker.py", + "source_location": "L97", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_61", - "target": "app_services_circuit_breaker_providercircuitbreaker_init", + "source": "app_services_chunker_rationale_97", + "target": "app_services_chunker_sentencesplitter_combine_sentences", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L181", + "source_file": "app/services/chunker.py", + "source_location": "L119", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", - "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", + "source": "app_services_chunker_sentencesplitter_combine_sentences", + "target": "app_services_chunker_sentencesplitter_get_overlap", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L138", + "source_file": "app/services/chunker.py", + "source_location": "L134", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", - "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", + "source": "app_services_chunker_rationale_134", + "target": "app_services_chunker_sentencesplitter_get_overlap", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L166", + "source_file": "app/services/chunker.py", + "source_location": "L161", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", - "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", + "source": "app_services_chunker_rationale_161", + "target": "app_services_chunker_sentencesplitter_split_text_with_metadata", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L124", + "source_file": "app/services/chunker.py", + "source_location": "L188", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_124", - "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", + "source": "app_services_chunker_rationale_188", + "target": "app_services_chunker_estimate_tokens", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/services/circuit_breaker.py", - "source_location": "L135", + "source_location": "L25", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_services_circuit_breaker", + "target": "app_services_circuit_breaker_circuitstate", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L128", + "source_location": "L464", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_128", - "target": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", + "source": "app_services_circuit_breaker", + "target": "app_services_circuit_breaker_get_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L499", + "source_location": "L32", "weight": 1.0, - "source": "app_services_circuit_breaker_startup_circuit_breaker", - "target": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", + "source": "app_services_circuit_breaker", + "target": "app_services_circuit_breaker_providercircuitbreaker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/services/circuit_breaker.py", - "source_location": "L165", + "source_location": "L485", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_services_circuit_breaker", + "target": "app_services_circuit_breaker_startup_circuit_breaker", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L344", + "source_location": "L134", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_record_failure", - "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", + "source": "app_services_circuit_breaker", + "target": "app_services_upstash_cache_get_upstash_cache", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L259", + "source_location": "L19", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_should_skip", - "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", + "source": "app_services_circuit_breaker", + "target": "enum", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L158", + "source_location": "L1", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_158", - "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", + "source": "app_services_circuit_breaker_rationale_1", + "target": "app_services_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "confidence_score": 1.0, "source_file": "app/services/circuit_breaker.py", - "source_location": "L180", + "source_location": "L109", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", - "target": "app_services_upstash_cache_get_upstash_cache" + "source": "app_services_circuit_breaker_rationale_109", + "target": "app_services_circuit_breaker", + "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L288", + "source_location": "L83", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_record_success", - "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "source": "app_services_circuit_breaker_rationale_83", + "target": "app_services_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L382", + "source_file": "app/services/news_aggregator.py", + "source_location": "L20", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_reset", - "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "source": "app_services_news_aggregator", + "target": "app_services_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L403", + "source_location": "L25", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", - "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "source": "app_services_circuit_breaker_circuitstate", + "target": "enum", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "inherits", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L174", + "source_location": "L25", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_174", - "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "source": "app_services_circuit_breaker_circuitstate", + "target": "str", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L192", + "source_location": "L26", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_192", - "target": "app_services_circuit_breaker_providercircuitbreaker_should_skip", + "source": "app_services_circuit_breaker_rationale_26", + "target": "app_services_circuit_breaker_circuitstate", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L269", + "source_file": "app/services/news_providers.py", + "source_location": "L8", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_269", - "target": "app_services_circuit_breaker_providercircuitbreaker_record_success", + "source": "app_services_news_providers", + "target": "enum", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L298", + "source_file": "app/services/news_providers.py", + "source_location": "L13", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_298", - "target": "app_services_circuit_breaker_providercircuitbreaker_record_failure", + "source": "app_services_news_providers_providerstatus", + "target": "enum", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "imports_from", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L396", + "source_file": "app/services/providers/base.py", + "source_location": "L58", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_reset", - "target": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", + "source": "app_services_providers_base", + "target": "enum", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "inherits", "confidence": "EXTRACTED", - "source_file": "app/services/circuit_breaker.py", - "source_location": "L366", + "source_file": "app/services/providers/base.py", + "source_location": "L69", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_366", - "target": "app_services_circuit_breaker_providercircuitbreaker_reset", + "source": "app_services_providers_base_providerstatus", + "target": "enum", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L401", + "source_location": "L464", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_401", - "target": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", + "source": "app_services_circuit_breaker_get_circuit_breaker", + "target": "app_services_circuit_breaker_providercircuitbreaker", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L432", + "source_location": "L173", "weight": 1.0, - "source": "app_services_circuit_breaker_providercircuitbreaker_print_stats", - "target": "app_services_circuit_breaker_providercircuitbreaker_get_stats", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L407", + "source_location": "L406", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_407", + "source": "app_services_circuit_breaker_providercircuitbreaker", "target": "app_services_circuit_breaker_providercircuitbreaker_get_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L431", + "source_location": "L54", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_431", - "target": "app_services_circuit_breaker_providercircuitbreaker_print_stats", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_init", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L465", + "source_location": "L127", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_465", - "target": "app_services_circuit_breaker_get_circuit_breaker", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L498", + "source_location": "L157", "weight": 1.0, - "source": "app_services_circuit_breaker_startup_circuit_breaker", - "target": "app_services_circuit_breaker_get_circuit_breaker", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/news_aggregator.py", - "source_location": "L20", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L430", "weight": 1.0, - "source": "app_services_news_aggregator", - "target": "app_services_circuit_breaker_get_circuit_breaker", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_print_stats", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "app/services/news_aggregator.py", - "source_location": "L201", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L292", "weight": 1.0, - "source": "app_services_news_aggregator_newsaggregator_init", - "target": "app_services_circuit_breaker_get_circuit_breaker" + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_record_failure", + "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", "source_file": "app/services/circuit_breaker.py", - "source_location": "L486", + "source_location": "L268", "weight": 1.0, - "source": "app_services_circuit_breaker_rationale_486", - "target": "app_services_circuit_breaker_startup_circuit_breaker", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_record_success", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L267", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L123", "weight": 1.0, - "source": "app_services_deduplication", - "target": "app_services_deduplication_get_url_filter", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L32", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L365", "weight": 1.0, - "source": "app_services_deduplication", - "target": "app_services_deduplication_urlfilter", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_reset", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L1", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L400", "weight": 1.0, - "source": "app_services_deduplication_rationale_1", - "target": "app_services_deduplication", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L267", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L191", "weight": 1.0, - "source": "app_services_deduplication_get_url_filter", - "target": "app_services_deduplication_urlfilter", + "source": "app_services_circuit_breaker_providercircuitbreaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_should_skip", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", + "source_file": "app/services/circuit_breaker.py", "source_location": "L33", "weight": 1.0, - "source": "app_services_deduplication_rationale_33", - "target": "app_services_deduplication_urlfilter", + "source": "app_services_circuit_breaker_rationale_33", + "target": "app_services_circuit_breaker_providercircuitbreaker", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L128", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L61", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_check_and_add", + "source": "app_services_circuit_breaker_rationale_61", + "target": "app_services_circuit_breaker_providercircuitbreaker_init", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L116", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L181", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_create_new_filter", + "source": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L240", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L138", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_get_estimated_memory_usage", + "source": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", + "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L182", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L166", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_get_stats", + "source": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", + "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L40", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L124", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_init", + "source": "app_services_circuit_breaker_rationale_124", + "target": "app_services_circuit_breaker_providercircuitbreaker_redis_key", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L91", + "confidence_score": 1.0, + "source_file": "app/services/circuit_breaker.py", + "source_location": "L135", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_load_or_create_filter", - "confidence_score": 1.0 + "source": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L201", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L128", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_print_stats", + "source": "app_services_circuit_breaker_rationale_128", + "target": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L221", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L499", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_reset", + "source": "app_services_circuit_breaker_startup_circuit_breaker", + "target": "app_services_circuit_breaker_providercircuitbreaker_load_from_redis", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L167", + "confidence_score": 1.0, + "source_file": "app/services/circuit_breaker.py", + "source_location": "L165", "weight": 1.0, - "source": "app_services_deduplication_urlfilter", - "target": "app_services_deduplication_urlfilter_save_state", - "confidence_score": 1.0 + "source": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L49", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L344", "weight": 1.0, - "source": "app_services_deduplication_rationale_49", - "target": "app_services_deduplication_urlfilter_init", + "source": "app_services_circuit_breaker_providercircuitbreaker_record_failure", + "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L76", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L259", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_init", - "target": "app_services_deduplication_urlfilter_load_or_create_filter", + "source": "app_services_circuit_breaker_providercircuitbreaker_should_skip", + "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L92", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L158", "weight": 1.0, - "source": "app_services_deduplication_rationale_92", - "target": "app_services_deduplication_urlfilter_load_or_create_filter", + "source": "app_services_circuit_breaker_rationale_158", + "target": "app_services_circuit_breaker_providercircuitbreaker_persist_open_to_redis", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L105", + "confidence_score": 1.0, + "source_file": "app/services/circuit_breaker.py", + "source_location": "L180", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_load_or_create_filter", - "target": "app_services_deduplication_urlfilter_create_new_filter", - "confidence_score": 1.0 + "source": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", + "target": "app_services_upstash_cache_get_upstash_cache" }, { - "relation": "references", - "context": "return_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L91", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L288", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_load_or_create_filter", - "target": "scalablebloomfilter", + "source": "app_services_circuit_breaker_providercircuitbreaker_record_success", + "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L116", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L382", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_create_new_filter", - "target": "scalablebloomfilter", + "source": "app_services_circuit_breaker_providercircuitbreaker_reset", + "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L224", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L403", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_reset", - "target": "scalablebloomfilter", + "source": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", + "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L117", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L174", "weight": 1.0, - "source": "app_services_deduplication_rationale_117", - "target": "app_services_deduplication_urlfilter_create_new_filter", + "source": "app_services_circuit_breaker_rationale_174", + "target": "app_services_circuit_breaker_providercircuitbreaker_delete_from_redis", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L129", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L192", "weight": 1.0, - "source": "app_services_deduplication_rationale_129", - "target": "app_services_deduplication_urlfilter_check_and_add", + "source": "app_services_circuit_breaker_rationale_192", + "target": "app_services_circuit_breaker_providercircuitbreaker_should_skip", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L163", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L269", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_check_and_add", - "target": "app_services_deduplication_urlfilter_save_state", + "source": "app_services_circuit_breaker_rationale_269", + "target": "app_services_circuit_breaker_providercircuitbreaker_record_success", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L168", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L298", "weight": 1.0, - "source": "app_services_deduplication_rationale_168", - "target": "app_services_deduplication_urlfilter_save_state", + "source": "app_services_circuit_breaker_rationale_298", + "target": "app_services_circuit_breaker_providercircuitbreaker_record_failure", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L237", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L396", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_reset", - "target": "app_services_deduplication_urlfilter_save_state", + "source": "app_services_circuit_breaker_providercircuitbreaker_reset", + "target": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L183", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L366", + "weight": 1.0, + "source": "app_services_circuit_breaker_rationale_366", + "target": "app_services_circuit_breaker_providercircuitbreaker_reset", + "confidence_score": 1.0 + }, + { + "relation": "rationale_for", + "confidence": "EXTRACTED", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L401", "weight": 1.0, - "source": "app_services_deduplication_rationale_183", - "target": "app_services_deduplication_urlfilter_get_stats", + "source": "app_services_circuit_breaker_rationale_401", + "target": "app_services_circuit_breaker_providercircuitbreaker_reset_all_redis_keys", "confidence_score": 1.0 }, { "relation": "calls", "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L203", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L432", "weight": 1.0, - "source": "app_services_deduplication_urlfilter_print_stats", - "target": "app_services_deduplication_urlfilter_get_stats", + "source": "app_services_circuit_breaker_providercircuitbreaker_print_stats", + "target": "app_services_circuit_breaker_providercircuitbreaker_get_stats", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L202", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L407", "weight": 1.0, - "source": "app_services_deduplication_rationale_202", - "target": "app_services_deduplication_urlfilter_print_stats", + "source": "app_services_circuit_breaker_rationale_407", + "target": "app_services_circuit_breaker_providercircuitbreaker_get_stats", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L222", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L431", "weight": 1.0, - "source": "app_services_deduplication_rationale_222", - "target": "app_services_deduplication_urlfilter_reset", + "source": "app_services_circuit_breaker_rationale_431", + "target": "app_services_circuit_breaker_providercircuitbreaker_print_stats", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L241", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L465", "weight": 1.0, - "source": "app_services_deduplication_rationale_241", - "target": "app_services_deduplication_urlfilter_get_estimated_memory_usage", + "source": "app_services_circuit_breaker_rationale_465", + "target": "app_services_circuit_breaker_get_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/deduplication.py", - "source_location": "L268", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L498", "weight": 1.0, - "source": "app_services_deduplication_rationale_268", - "target": "app_services_deduplication_get_url_filter", + "source": "app_services_circuit_breaker_startup_circuit_breaker", + "target": "app_services_circuit_breaker_get_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "imports", + "context": "import", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L102", + "source_file": "app/services/news_aggregator.py", + "source_location": "L20", "weight": 1.0, - "source": "app_services_document", - "target": "app_services_document_create_document_from_rss_entry", + "source": "app_services_news_aggregator", + "target": "app_services_circuit_breaker_get_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L18", + "confidence_score": 1.0, + "source_file": "app/services/news_aggregator.py", + "source_location": "L201", "weight": 1.0, - "source": "app_services_document", - "target": "app_services_document_document", - "confidence_score": 1.0 + "source": "app_services_news_aggregator_newsaggregator_init", + "target": "app_services_circuit_breaker_get_circuit_breaker" }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L1", + "source_file": "app/services/circuit_breaker.py", + "source_location": "L486", "weight": 1.0, - "source": "app_services_document_rationale_1", - "target": "app_services_document", + "source": "app_services_circuit_breaker_rationale_486", + "target": "app_services_circuit_breaker_startup_circuit_breaker", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L102", + "source_file": "app/services/deduplication.py", + "source_location": "L267", "weight": 1.0, - "source": "app_services_document_create_document_from_rss_entry", - "target": "app_services_document_document", + "source": "app_services_deduplication", + "target": "app_services_deduplication_get_url_filter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L76", + "source_file": "app/services/deduplication.py", + "source_location": "L32", "weight": 1.0, - "source": "app_services_document_document", - "target": "app_services_document_document_from_dict", + "source": "app_services_deduplication", + "target": "app_services_deduplication_urlfilter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L46", + "source_file": "app/services/deduplication.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_document_document", - "target": "app_services_document_document_generate_id", + "source": "app_services_deduplication_rationale_1", + "target": "app_services_deduplication", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L28", + "source_file": "app/services/deduplication.py", + "source_location": "L267", "weight": 1.0, - "source": "app_services_document_document", - "target": "app_services_document_document_init", + "source": "app_services_deduplication_get_url_filter", + "target": "app_services_deduplication_urlfilter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L97", + "source_file": "app/services/deduplication.py", + "source_location": "L33", "weight": 1.0, - "source": "app_services_document_document", - "target": "app_services_document_document_len", + "source": "app_services_deduplication_rationale_33", + "target": "app_services_deduplication_urlfilter", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L92", + "source_file": "app/services/deduplication.py", + "source_location": "L128", "weight": 1.0, - "source": "app_services_document_document", - "target": "app_services_document_document_repr", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_check_and_add", "confidence_score": 1.0 }, { "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L62", + "source_file": "app/services/deduplication.py", + "source_location": "L116", "weight": 1.0, - "source": "app_services_document_document", - "target": "app_services_document_document_to_dict", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_create_new_filter", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L19", + "source_file": "app/services/deduplication.py", + "source_location": "L240", "weight": 1.0, - "source": "app_services_document_rationale_19", - "target": "app_services_document_document", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_get_estimated_memory_usage", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L44", + "source_file": "app/services/deduplication.py", + "source_location": "L182", "weight": 1.0, - "source": "app_services_document_document_init", - "target": "app_services_document_document_generate_id", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_get_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L34", + "source_file": "app/services/deduplication.py", + "source_location": "L40", "weight": 1.0, - "source": "app_services_document_rationale_34", - "target": "app_services_document_document_init", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_init", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L47", + "source_file": "app/services/deduplication.py", + "source_location": "L91", "weight": 1.0, - "source": "app_services_document_rationale_47", - "target": "app_services_document_document_generate_id", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_load_or_create_filter", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L63", + "source_file": "app/services/deduplication.py", + "source_location": "L201", "weight": 1.0, - "source": "app_services_document_rationale_63", - "target": "app_services_document_document_to_dict", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_print_stats", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L77", + "source_file": "app/services/deduplication.py", + "source_location": "L221", "weight": 1.0, - "source": "app_services_document_rationale_77", - "target": "app_services_document_document_from_dict", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_reset", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L93", + "source_file": "app/services/deduplication.py", + "source_location": "L167", "weight": 1.0, - "source": "app_services_document_rationale_93", - "target": "app_services_document_document_repr", + "source": "app_services_deduplication_urlfilter", + "target": "app_services_deduplication_urlfilter_save_state", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/document.py", - "source_location": "L107", - "weight": 1.0, - "source": "app_services_document_rationale_107", - "target": "app_services_document_create_document_from_rss_entry", - "confidence_score": 1.0 - }, - { - "relation": "contains", - "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L13", + "source_file": "app/services/deduplication.py", + "source_location": "L49", "weight": 1.0, - "source": "app_services_firebase_service", - "target": "app_services_firebase_service_firebaseservice", + "source": "app_services_deduplication_rationale_49", + "target": "app_services_deduplication_urlfilter_init", "confidence_score": 1.0 }, { - "relation": "contains", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L426", + "source_file": "app/services/deduplication.py", + "source_location": "L76", "weight": 1.0, - "source": "app_services_firebase_service", - "target": "app_services_firebase_service_get_firebase_service", + "source": "app_services_deduplication_urlfilter_init", + "target": "app_services_deduplication_urlfilter_load_or_create_filter", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L309", + "source_file": "app/services/deduplication.py", + "source_location": "L92", "weight": 1.0, - "source": "app_services_firebase_service_rationale_309", - "target": "app_services_firebase_service", + "source": "app_services_deduplication_rationale_92", + "target": "app_services_deduplication_urlfilter_load_or_create_filter", "confidence_score": 1.0 }, { - "relation": "imports_from", - "context": "import", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L10", + "source_file": "app/services/deduplication.py", + "source_location": "L105", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_firebase_service", + "source": "app_services_deduplication_urlfilter_load_or_create_filter", + "target": "app_services_deduplication_urlfilter_create_new_filter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L153", + "source_file": "app/services/deduplication.py", + "source_location": "L91", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_add_subscriber", + "source": "app_services_deduplication_urlfilter_load_or_create_filter", + "target": "scalablebloomfilter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L273", + "source_file": "app/services/deduplication.py", + "source_location": "L116", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_get_all_subscribers", + "source": "app_services_deduplication_urlfilter_create_new_filter", + "target": "scalablebloomfilter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L95", + "source_file": "app/services/deduplication.py", + "source_location": "L224", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_get_article_id", + "source": "app_services_deduplication_urlfilter_reset", + "target": "scalablebloomfilter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L210", + "source_file": "app/services/deduplication.py", + "source_location": "L117", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_get_subscriber", + "source": "app_services_deduplication_rationale_117", + "target": "app_services_deduplication_urlfilter_create_new_filter", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L227", + "source_file": "app/services/deduplication.py", + "source_location": "L129", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_get_subscriber_by_token", + "source": "app_services_deduplication_rationale_129", + "target": "app_services_deduplication_urlfilter_check_and_add", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L298", + "source_file": "app/services/deduplication.py", + "source_location": "L163", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_get_subscribers_by_preference", + "source": "app_services_deduplication_urlfilter_check_and_add", + "target": "app_services_deduplication_urlfilter_save_state", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L134", + "source_file": "app/services/deduplication.py", + "source_location": "L168", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_get_view_count", + "source": "app_services_deduplication_rationale_168", + "target": "app_services_deduplication_urlfilter_save_state", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L101", + "source_file": "app/services/deduplication.py", + "source_location": "L237", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_increment_view", + "source": "app_services_deduplication_urlfilter_reset", + "target": "app_services_deduplication_urlfilter_save_state", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L16", + "source_file": "app/services/deduplication.py", + "source_location": "L183", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_init", + "source": "app_services_deduplication_rationale_183", + "target": "app_services_deduplication_urlfilter_get_stats", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L22", + "source_file": "app/services/deduplication.py", + "source_location": "L203", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_initialize", + "source": "app_services_deduplication_urlfilter_print_stats", + "target": "app_services_deduplication_urlfilter_get_stats", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L349", + "source_file": "app/services/deduplication.py", + "source_location": "L202", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_update_preference", + "source": "app_services_deduplication_rationale_202", + "target": "app_services_deduplication_urlfilter_print_stats", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L249", + "source_file": "app/services/deduplication.py", + "source_location": "L222", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_update_subscriber_status", + "source": "app_services_deduplication_rationale_222", + "target": "app_services_deduplication_urlfilter_reset", "confidence_score": 1.0 }, { - "relation": "method", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L376", + "source_file": "app/services/deduplication.py", + "source_location": "L241", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice", - "target": "app_services_firebase_service_firebaseservice_update_subscription_status", + "source": "app_services_deduplication_rationale_241", + "target": "app_services_deduplication_urlfilter_get_estimated_memory_usage", "confidence_score": 1.0 }, { - "relation": "references", - "context": "return_type", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L426", + "source_file": "app/services/deduplication.py", + "source_location": "L268", "weight": 1.0, - "source": "app_services_firebase_service_get_firebase_service", - "target": "app_services_firebase_service_firebaseservice", + "source": "app_services_deduplication_rationale_268", + "target": "app_services_deduplication_get_url_filter", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L14", + "source_file": "app/services/document.py", + "source_location": "L102", "weight": 1.0, - "source": "app_services_firebase_service_rationale_14", - "target": "app_services_firebase_service_firebaseservice", + "source": "app_services_document", + "target": "app_services_document_create_document_from_rss_entry", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "contains", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L20", + "source_file": "app/services/document.py", + "source_location": "L18", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice_init", - "target": "app_services_firebase_service_firebaseservice_initialize", + "source": "app_services_document", + "target": "app_services_document_document", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L23", + "source_file": "app/services/document.py", + "source_location": "L1", "weight": 1.0, - "source": "app_services_firebase_service_rationale_23", - "target": "app_services_firebase_service_firebaseservice_initialize", + "source": "app_services_document_rationale_1", + "target": "app_services_document", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "references", + "context": "return_type", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L140", + "source_file": "app/services/document.py", + "source_location": "L102", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice_get_view_count", - "target": "app_services_firebase_service_firebaseservice_get_article_id", + "source": "app_services_document_create_document_from_rss_entry", + "target": "app_services_document_document", "confidence_score": 1.0 }, { - "relation": "calls", - "context": "call", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L107", + "source_file": "app/services/document.py", + "source_location": "L76", "weight": 1.0, - "source": "app_services_firebase_service_firebaseservice_increment_view", - "target": "app_services_firebase_service_firebaseservice_get_article_id", + "source": "app_services_document_document", + "target": "app_services_document_document_from_dict", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L96", + "source_file": "app/services/document.py", + "source_location": "L46", "weight": 1.0, - "source": "app_services_firebase_service_rationale_96", - "target": "app_services_firebase_service_firebaseservice_get_article_id", + "source": "app_services_document_document", + "target": "app_services_document_document_generate_id", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L102", + "source_file": "app/services/document.py", + "source_location": "L28", "weight": 1.0, - "source": "app_services_firebase_service_rationale_102", - "target": "app_services_firebase_service_firebaseservice_increment_view", + "source": "app_services_document_document", + "target": "app_services_document_document_init", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L135", + "source_file": "app/services/document.py", + "source_location": "L97", "weight": 1.0, - "source": "app_services_firebase_service_rationale_135", - "target": "app_services_firebase_service_firebaseservice_get_view_count", + "source": "app_services_document_document", + "target": "app_services_document_document_len", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L154", + "source_file": "app/services/document.py", + "source_location": "L92", "weight": 1.0, - "source": "app_services_firebase_service_rationale_154", - "target": "app_services_firebase_service_firebaseservice_add_subscriber", + "source": "app_services_document_document", + "target": "app_services_document_document_repr", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "method", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L211", + "source_file": "app/services/document.py", + "source_location": "L62", "weight": 1.0, - "source": "app_services_firebase_service_rationale_211", - "target": "app_services_firebase_service_firebaseservice_get_subscriber", + "source": "app_services_document_document", + "target": "app_services_document_document_to_dict", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L228", + "source_file": "app/services/document.py", + "source_location": "L19", "weight": 1.0, - "source": "app_services_firebase_service_rationale_228", - "target": "app_services_firebase_service_firebaseservice_get_subscriber_by_token", + "source": "app_services_document_rationale_19", + "target": "app_services_document_document", "confidence_score": 1.0 }, { - "relation": "rationale_for", + "relation": "calls", + "context": "call", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L250", + "source_file": "app/services/document.py", + "source_location": "L44", "weight": 1.0, - "source": "app_services_firebase_service_rationale_250", - "target": "app_services_firebase_service_firebaseservice_update_subscriber_status", + "source": "app_services_document_document_init", + "target": "app_services_document_document_generate_id", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L274", + "source_file": "app/services/document.py", + "source_location": "L34", "weight": 1.0, - "source": "app_services_firebase_service_rationale_274", - "target": "app_services_firebase_service_firebaseservice_get_all_subscribers", + "source": "app_services_document_rationale_34", + "target": "app_services_document_document_init", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L299", + "source_file": "app/services/document.py", + "source_location": "L47", "weight": 1.0, - "source": "app_services_firebase_service_rationale_299", - "target": "app_services_firebase_service_firebaseservice_get_subscribers_by_preference", + "source": "app_services_document_rationale_47", + "target": "app_services_document_document_generate_id", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L350", + "source_file": "app/services/document.py", + "source_location": "L63", "weight": 1.0, - "source": "app_services_firebase_service_rationale_350", - "target": "app_services_firebase_service_firebaseservice_update_preference", + "source": "app_services_document_rationale_63", + "target": "app_services_document_document_to_dict", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L377", + "source_file": "app/services/document.py", + "source_location": "L77", "weight": 1.0, - "source": "app_services_firebase_service_rationale_377", - "target": "app_services_firebase_service_firebaseservice_update_subscription_status", + "source": "app_services_document_rationale_77", + "target": "app_services_document_document_from_dict", "confidence_score": 1.0 }, { "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/firebase_service.py", - "source_location": "L427", + "source_file": "app/services/document.py", + "source_location": "L93", "weight": 1.0, - "source": "app_services_firebase_service_rationale_427", - "target": "app_services_firebase_service_get_firebase_service", + "source": "app_services_document_rationale_93", + "target": "app_services_document_document_repr", "confidence_score": 1.0 }, { - "relation": "imports", - "context": "import", + "relation": "rationale_for", "confidence": "EXTRACTED", - "source_file": "app/services/newsletter_service.py", - "source_location": "L10", + "source_file": "app/services/document.py", + "source_location": "L107", "weight": 1.0, - "source": "app_services_newsletter_service", - "target": "app_services_firebase_service_get_firebase_service", + "source": "app_services_document_rationale_107", + "target": "app_services_document_create_document_from_rss_entry", "confidence_score": 1.0 }, { @@ -29465,9 +28620,9 @@ "source_file": "README.md", "source_location": "L12", "weight": 1.0, - "confidence_score": 1.0, "source": "readme", - "target": "readme_segmentopulse_backend_api" + "target": "readme_segmentopulse_backend_api", + "confidence_score": 1.0 }, { "relation": "contains", @@ -29681,5 +28836,5 @@ } ], "hyperedges": [], - "built_at_commit": "f7d7d04dcdbf515925dfab40b3db49ce9ff5163f" + "built_at_commit": "98ca1d1cc0401419e8e67cfd12134591cef7431e" } \ No newline at end of file