riksdagsmonitor 0.8.14 → 0.8.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cia/dashboard-init.d.ts +26 -0
- package/dist/lib/cia/dashboard-init.d.ts.map +1 -0
- package/dist/lib/cia/dashboard-init.js +108 -0
- package/dist/lib/cia/dashboard-init.js.map +1 -0
- package/dist/lib/cia/data-loader.d.ts +408 -0
- package/dist/lib/cia/data-loader.d.ts.map +1 -0
- package/dist/lib/cia/data-loader.js +867 -0
- package/dist/lib/cia/data-loader.js.map +1 -0
- package/dist/lib/cia/election-predictions.d.ts +78 -0
- package/dist/lib/cia/election-predictions.d.ts.map +1 -0
- package/dist/lib/cia/election-predictions.js +259 -0
- package/dist/lib/cia/election-predictions.js.map +1 -0
- package/dist/lib/cia/i18n-translations.d.ts +111 -0
- package/dist/lib/cia/i18n-translations.d.ts.map +1 -0
- package/dist/lib/cia/i18n-translations.js +619 -0
- package/dist/lib/cia/i18n-translations.js.map +1 -0
- package/dist/lib/cia/visualizations.d.ts +64 -0
- package/dist/lib/cia/visualizations.d.ts.map +1 -0
- package/dist/lib/cia/visualizations.js +662 -0
- package/dist/lib/cia/visualizations.js.map +1 -0
- package/dist/lib/dashboards/anomaly-detection.d.ts +44 -0
- package/dist/lib/dashboards/anomaly-detection.d.ts.map +1 -0
- package/dist/lib/dashboards/anomaly-detection.js +1017 -0
- package/dist/lib/dashboards/anomaly-detection.js.map +1 -0
- package/dist/lib/dashboards/coalition-dashboard.d.ts +36 -0
- package/dist/lib/dashboards/coalition-dashboard.d.ts.map +1 -0
- package/dist/lib/dashboards/coalition-dashboard.js +629 -0
- package/dist/lib/dashboards/coalition-dashboard.js.map +1 -0
- package/dist/lib/dashboards/coalition-loader.d.ts +43 -0
- package/dist/lib/dashboards/coalition-loader.d.ts.map +1 -0
- package/dist/lib/dashboards/coalition-loader.js +665 -0
- package/dist/lib/dashboards/coalition-loader.js.map +1 -0
- package/dist/lib/dashboards/committees-dashboard.d.ts +23 -0
- package/dist/lib/dashboards/committees-dashboard.d.ts.map +1 -0
- package/dist/lib/dashboards/committees-dashboard.js +886 -0
- package/dist/lib/dashboards/committees-dashboard.js.map +1 -0
- package/dist/lib/dashboards/election-cycle.d.ts +62 -0
- package/dist/lib/dashboards/election-cycle.d.ts.map +1 -0
- package/dist/lib/dashboards/election-cycle.js +484 -0
- package/dist/lib/dashboards/election-cycle.js.map +1 -0
- package/dist/lib/dashboards/ministry-dashboard.d.ts +46 -0
- package/dist/lib/dashboards/ministry-dashboard.d.ts.map +1 -0
- package/dist/lib/dashboards/ministry-dashboard.js +1114 -0
- package/dist/lib/dashboards/ministry-dashboard.js.map +1 -0
- package/dist/lib/dashboards/party-dashboard.d.ts +56 -0
- package/dist/lib/dashboards/party-dashboard.d.ts.map +1 -0
- package/dist/lib/dashboards/party-dashboard.js +981 -0
- package/dist/lib/dashboards/party-dashboard.js.map +1 -0
- package/dist/lib/dashboards/politician-dashboard.d.ts +41 -0
- package/dist/lib/dashboards/politician-dashboard.d.ts.map +1 -0
- package/dist/lib/dashboards/politician-dashboard.js +611 -0
- package/dist/lib/dashboards/politician-dashboard.js.map +1 -0
- package/dist/lib/dashboards/pre-election.d.ts +64 -0
- package/dist/lib/dashboards/pre-election.d.ts.map +1 -0
- package/dist/lib/dashboards/pre-election.js +604 -0
- package/dist/lib/dashboards/pre-election.js.map +1 -0
- package/dist/lib/dashboards/risk-dashboard.d.ts +37 -0
- package/dist/lib/dashboards/risk-dashboard.d.ts.map +1 -0
- package/dist/lib/dashboards/risk-dashboard.js +863 -0
- package/dist/lib/dashboards/risk-dashboard.js.map +1 -0
- package/dist/lib/dashboards/seasonal-patterns.d.ts +24 -0
- package/dist/lib/dashboards/seasonal-patterns.d.ts.map +1 -0
- package/dist/lib/dashboards/seasonal-patterns.js +535 -0
- package/dist/lib/dashboards/seasonal-patterns.js.map +1 -0
- package/dist/lib/dashboards/stats-loader.d.ts +35 -0
- package/dist/lib/dashboards/stats-loader.d.ts.map +1 -0
- package/dist/lib/dashboards/stats-loader.js +145 -0
- package/dist/lib/dashboards/stats-loader.js.map +1 -0
- package/dist/lib/shared/chart-factory.d.ts.map +1 -0
- package/dist/lib/shared/chart-factory.js.map +1 -0
- package/dist/lib/shared/data-loader.d.ts.map +1 -0
- package/dist/lib/shared/data-loader.js.map +1 -0
- package/dist/lib/shared/dom-utils.d.ts.map +1 -0
- package/dist/lib/shared/dom-utils.js.map +1 -0
- package/dist/lib/shared/error-boundary.d.ts.map +1 -0
- package/dist/lib/shared/error-boundary.js.map +1 -0
- package/dist/lib/shared/fallback-ui.d.ts.map +1 -0
- package/dist/lib/shared/fallback-ui.js.map +1 -0
- package/dist/lib/shared/index.d.ts.map +1 -0
- package/dist/lib/shared/index.js.map +1 -0
- package/dist/lib/shared/logger.d.ts.map +1 -0
- package/dist/lib/shared/logger.js.map +1 -0
- package/dist/lib/shared/register-globals.d.ts +14 -0
- package/dist/lib/shared/register-globals.d.ts.map +1 -0
- package/dist/lib/shared/register-globals.js +21 -0
- package/dist/lib/shared/register-globals.js.map +1 -0
- package/dist/lib/shared/theme.d.ts.map +1 -0
- package/dist/lib/shared/theme.js.map +1 -0
- package/dist/lib/shared/types.d.ts.map +1 -0
- package/dist/lib/shared/types.js.map +1 -0
- package/dist/lib/ui/back-to-top.d.ts +13 -0
- package/dist/lib/ui/back-to-top.d.ts.map +1 -0
- package/dist/lib/ui/back-to-top.js +48 -0
- package/dist/lib/ui/back-to-top.js.map +1 -0
- package/dist/scripts/ai-analysis/coalition-detector.d.ts +28 -0
- package/dist/scripts/ai-analysis/coalition-detector.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/coalition-detector.js +242 -0
- package/dist/scripts/ai-analysis/coalition-detector.js.map +1 -0
- package/dist/scripts/ai-analysis/dashboard-analyzer.d.ts +73 -0
- package/dist/scripts/ai-analysis/dashboard-analyzer.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/dashboard-analyzer.js +511 -0
- package/dist/scripts/ai-analysis/dashboard-analyzer.js.map +1 -0
- package/dist/scripts/ai-analysis/document-analyzer.d.ts +196 -0
- package/dist/scripts/ai-analysis/document-analyzer.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/document-analyzer.js +1001 -0
- package/dist/scripts/ai-analysis/document-analyzer.js.map +1 -0
- package/dist/scripts/ai-analysis/domains/index.d.ts +15 -0
- package/dist/scripts/ai-analysis/domains/index.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/domains/index.js +494 -0
- package/dist/scripts/ai-analysis/domains/index.js.map +1 -0
- package/dist/scripts/ai-analysis/helpers.d.ts +43 -0
- package/dist/scripts/ai-analysis/helpers.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/helpers.js +79 -0
- package/dist/scripts/ai-analysis/helpers.js.map +1 -0
- package/dist/scripts/ai-analysis/index.d.ts +15 -0
- package/dist/scripts/ai-analysis/index.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/index.js +14 -0
- package/dist/scripts/ai-analysis/index.js.map +1 -0
- package/dist/scripts/ai-analysis/pipeline.d.ts +41 -0
- package/dist/scripts/ai-analysis/pipeline.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/pipeline.js +208 -0
- package/dist/scripts/ai-analysis/pipeline.js.map +1 -0
- package/dist/scripts/ai-analysis/political-significance.d.ts +63 -0
- package/dist/scripts/ai-analysis/political-significance.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/political-significance.js +227 -0
- package/dist/scripts/ai-analysis/political-significance.js.map +1 -0
- package/dist/scripts/ai-analysis/quality-assessor.d.ts +104 -0
- package/dist/scripts/ai-analysis/quality-assessor.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/quality-assessor.js +554 -0
- package/dist/scripts/ai-analysis/quality-assessor.js.map +1 -0
- package/dist/scripts/ai-analysis/swot/index.d.ts +56 -0
- package/dist/scripts/ai-analysis/swot/index.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/swot/index.js +360 -0
- package/dist/scripts/ai-analysis/swot/index.js.map +1 -0
- package/dist/scripts/ai-analysis/swot/placeholders.d.ts +30 -0
- package/dist/scripts/ai-analysis/swot/placeholders.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/swot/placeholders.js +381 -0
- package/dist/scripts/ai-analysis/swot/placeholders.js.map +1 -0
- package/dist/scripts/ai-analysis/types.d.ts +333 -0
- package/dist/scripts/ai-analysis/types.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/types.js +19 -0
- package/dist/scripts/ai-analysis/types.js.map +1 -0
- package/dist/scripts/ai-analysis/visualisation/index.d.ts +15 -0
- package/dist/scripts/ai-analysis/visualisation/index.d.ts.map +1 -0
- package/dist/scripts/ai-analysis/visualisation/index.js +179 -0
- package/dist/scripts/ai-analysis/visualisation/index.js.map +1 -0
- package/dist/scripts/analysis-framework/cross-reference.d.ts +35 -0
- package/dist/scripts/analysis-framework/cross-reference.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/cross-reference.js +290 -0
- package/dist/scripts/analysis-framework/cross-reference.js.map +1 -0
- package/dist/scripts/analysis-framework/index.d.ts +79 -0
- package/dist/scripts/analysis-framework/index.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/index.js +133 -0
- package/dist/scripts/analysis-framework/index.js.map +1 -0
- package/dist/scripts/analysis-framework/lenses/citizen.d.ts +29 -0
- package/dist/scripts/analysis-framework/lenses/citizen.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/lenses/citizen.js +220 -0
- package/dist/scripts/analysis-framework/lenses/citizen.js.map +1 -0
- package/dist/scripts/analysis-framework/lenses/economic.d.ts +29 -0
- package/dist/scripts/analysis-framework/lenses/economic.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/lenses/economic.js +227 -0
- package/dist/scripts/analysis-framework/lenses/economic.js.map +1 -0
- package/dist/scripts/analysis-framework/lenses/government.d.ts +32 -0
- package/dist/scripts/analysis-framework/lenses/government.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/lenses/government.js +265 -0
- package/dist/scripts/analysis-framework/lenses/government.js.map +1 -0
- package/dist/scripts/analysis-framework/lenses/international.d.ts +29 -0
- package/dist/scripts/analysis-framework/lenses/international.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/lenses/international.js +248 -0
- package/dist/scripts/analysis-framework/lenses/international.js.map +1 -0
- package/dist/scripts/analysis-framework/lenses/media.d.ts +29 -0
- package/dist/scripts/analysis-framework/lenses/media.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/lenses/media.js +211 -0
- package/dist/scripts/analysis-framework/lenses/media.js.map +1 -0
- package/dist/scripts/analysis-framework/lenses/opposition.d.ts +29 -0
- package/dist/scripts/analysis-framework/lenses/opposition.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/lenses/opposition.js +234 -0
- package/dist/scripts/analysis-framework/lenses/opposition.js.map +1 -0
- package/dist/scripts/analysis-framework/methodology-types.d.ts +309 -0
- package/dist/scripts/analysis-framework/methodology-types.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/methodology-types.js +38 -0
- package/dist/scripts/analysis-framework/methodology-types.js.map +1 -0
- package/dist/scripts/analysis-framework/political-classification.d.ts +58 -0
- package/dist/scripts/analysis-framework/political-classification.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/political-classification.js +414 -0
- package/dist/scripts/analysis-framework/political-classification.js.map +1 -0
- package/dist/scripts/analysis-framework/political-risk-assessment.d.ts +74 -0
- package/dist/scripts/analysis-framework/political-risk-assessment.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/political-risk-assessment.js +656 -0
- package/dist/scripts/analysis-framework/political-risk-assessment.js.map +1 -0
- package/dist/scripts/analysis-framework/political-threat-analysis.d.ts +65 -0
- package/dist/scripts/analysis-framework/political-threat-analysis.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/political-threat-analysis.js +553 -0
- package/dist/scripts/analysis-framework/political-threat-analysis.js.map +1 -0
- package/dist/scripts/analysis-framework/significance-scorer.d.ts +62 -0
- package/dist/scripts/analysis-framework/significance-scorer.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/significance-scorer.js +196 -0
- package/dist/scripts/analysis-framework/significance-scorer.js.map +1 -0
- package/dist/scripts/analysis-framework/types.d.ts +138 -0
- package/dist/scripts/analysis-framework/types.d.ts.map +1 -0
- package/dist/scripts/analysis-framework/types.js +12 -0
- package/dist/scripts/analysis-framework/types.js.map +1 -0
- package/dist/scripts/analysis-reader.d.ts +240 -0
- package/dist/scripts/analysis-reader.d.ts.map +1 -0
- package/dist/scripts/analysis-reader.js +495 -0
- package/dist/scripts/analysis-reader.js.map +1 -0
- package/dist/scripts/article-quality-enhancer.d.ts +148 -0
- package/dist/scripts/article-quality-enhancer.d.ts.map +1 -0
- package/dist/scripts/article-quality-enhancer.js +430 -0
- package/dist/scripts/article-quality-enhancer.js.map +1 -0
- package/dist/scripts/article-template/constants.d.ts +104 -0
- package/dist/scripts/article-template/constants.d.ts.map +1 -0
- package/dist/scripts/article-template/constants.js +225 -0
- package/dist/scripts/article-template/constants.js.map +1 -0
- package/dist/scripts/article-template/helpers.d.ts +83 -0
- package/dist/scripts/article-template/helpers.d.ts.map +1 -0
- package/dist/scripts/article-template/helpers.js +236 -0
- package/dist/scripts/article-template/helpers.js.map +1 -0
- package/dist/scripts/article-template/index.d.ts +39 -0
- package/dist/scripts/article-template/index.d.ts.map +1 -0
- package/dist/scripts/article-template/index.js +37 -0
- package/dist/scripts/article-template/index.js.map +1 -0
- package/dist/scripts/article-template/registry.d.ts +64 -0
- package/dist/scripts/article-template/registry.d.ts.map +1 -0
- package/dist/scripts/article-template/registry.js +405 -0
- package/dist/scripts/article-template/registry.js.map +1 -0
- package/dist/scripts/article-template/template.d.ts +18 -0
- package/dist/scripts/article-template/template.d.ts.map +1 -0
- package/dist/scripts/article-template/template.js +359 -0
- package/dist/scripts/article-template/template.js.map +1 -0
- package/dist/scripts/article-template/types.d.ts +90 -0
- package/dist/scripts/article-template/types.d.ts.map +1 -0
- package/dist/scripts/article-template/types.js +96 -0
- package/dist/scripts/article-template/types.js.map +1 -0
- package/dist/scripts/article-template.d.ts +18 -0
- package/dist/scripts/article-template.d.ts.map +1 -0
- package/dist/scripts/article-template.js +18 -0
- package/dist/scripts/article-template.js.map +1 -0
- package/dist/scripts/catalog-downloaded-data.d.ts +66 -0
- package/dist/scripts/catalog-downloaded-data.d.ts.map +1 -0
- package/dist/scripts/catalog-downloaded-data.js +239 -0
- package/dist/scripts/catalog-downloaded-data.js.map +1 -0
- package/dist/scripts/check-cia-schema-updates.d.ts +186 -0
- package/dist/scripts/check-cia-schema-updates.d.ts.map +1 -0
- package/dist/scripts/check-cia-schema-updates.js +363 -0
- package/dist/scripts/check-cia-schema-updates.js.map +1 -0
- package/dist/scripts/data-transformers/calendar.d.ts +16 -0
- package/dist/scripts/data-transformers/calendar.d.ts.map +1 -0
- package/dist/scripts/data-transformers/calendar.js +137 -0
- package/dist/scripts/data-transformers/calendar.js.map +1 -0
- package/dist/scripts/data-transformers/constants/committee-names.d.ts +15 -0
- package/dist/scripts/data-transformers/constants/committee-names.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants/committee-names.js +30 -0
- package/dist/scripts/data-transformers/constants/committee-names.js.map +1 -0
- package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts +11 -0
- package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants/content-labels-part1.js +900 -0
- package/dist/scripts/data-transformers/constants/content-labels-part1.js.map +1 -0
- package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts +11 -0
- package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants/content-labels-part2.js +900 -0
- package/dist/scripts/data-transformers/constants/content-labels-part2.js.map +1 -0
- package/dist/scripts/data-transformers/constants/content-labels.d.ts +13 -0
- package/dist/scripts/data-transformers/constants/content-labels.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants/content-labels.js +18 -0
- package/dist/scripts/data-transformers/constants/content-labels.js.map +1 -0
- package/dist/scripts/data-transformers/constants/index.d.ts +15 -0
- package/dist/scripts/data-transformers/constants/index.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants/index.js +15 -0
- package/dist/scripts/data-transformers/constants/index.js.map +1 -0
- package/dist/scripts/data-transformers/constants/locale-map.d.ts +13 -0
- package/dist/scripts/data-transformers/constants/locale-map.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants/locale-map.js +17 -0
- package/dist/scripts/data-transformers/constants/locale-map.js.map +1 -0
- package/dist/scripts/data-transformers/constants.d.ts +14 -0
- package/dist/scripts/data-transformers/constants.d.ts.map +1 -0
- package/dist/scripts/data-transformers/constants.js +14 -0
- package/dist/scripts/data-transformers/constants.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts +64 -0
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js +805 -0
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.d.ts +89 -0
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.js +667 -0
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts +50 -0
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.js +310 -0
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/committee.d.ts +12 -0
- package/dist/scripts/data-transformers/content-generators/committee.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/committee.js +247 -0
- package/dist/scripts/data-transformers/content-generators/committee.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts +124 -0
- package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/dashboard-section.js +564 -0
- package/dist/scripts/data-transformers/content-generators/dashboard-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts +82 -0
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js +321 -0
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/generic.d.ts +12 -0
- package/dist/scripts/data-transformers/content-generators/generic.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/generic.js +295 -0
- package/dist/scripts/data-transformers/content-generators/generic.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/index.d.ts +56 -0
- package/dist/scripts/data-transformers/content-generators/index.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/index.js +45 -0
- package/dist/scripts/data-transformers/content-generators/index.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/interpellations.d.ts +12 -0
- package/dist/scripts/data-transformers/content-generators/interpellations.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/interpellations.js +124 -0
- package/dist/scripts/data-transformers/content-generators/interpellations.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts +137 -0
- package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/mindmap-section.js +286 -0
- package/dist/scripts/data-transformers/content-generators/mindmap-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts +17 -0
- package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/month-ahead.js +212 -0
- package/dist/scripts/data-transformers/content-generators/month-ahead.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts +17 -0
- package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/monthly-review.js +173 -0
- package/dist/scripts/data-transformers/content-generators/monthly-review.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/motions.d.ts +12 -0
- package/dist/scripts/data-transformers/content-generators/motions.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/motions.js +158 -0
- package/dist/scripts/data-transformers/content-generators/motions.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts +52 -0
- package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/newsworthiness.js +244 -0
- package/dist/scripts/data-transformers/content-generators/newsworthiness.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/propositions.d.ts +12 -0
- package/dist/scripts/data-transformers/content-generators/propositions.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/propositions.js +263 -0
- package/dist/scripts/data-transformers/content-generators/propositions.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts +92 -0
- package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/sankey-section.js +257 -0
- package/dist/scripts/data-transformers/content-generators/sankey-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/shared.d.ts +81 -0
- package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/shared.js +913 -0
- package/dist/scripts/data-transformers/content-generators/shared.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.d.ts +83 -0
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.js +219 -0
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/swot-section.d.ts +50 -0
- package/dist/scripts/data-transformers/content-generators/swot-section.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/swot-section.js +177 -0
- package/dist/scripts/data-transformers/content-generators/swot-section.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts +12 -0
- package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators/week-ahead.js +332 -0
- package/dist/scripts/data-transformers/content-generators/week-ahead.js.map +1 -0
- package/dist/scripts/data-transformers/content-generators.d.ts +15 -0
- package/dist/scripts/data-transformers/content-generators.d.ts.map +1 -0
- package/dist/scripts/data-transformers/content-generators.js +14 -0
- package/dist/scripts/data-transformers/content-generators.js.map +1 -0
- package/dist/scripts/data-transformers/document-analysis.d.ts +58 -0
- package/dist/scripts/data-transformers/document-analysis.d.ts.map +1 -0
- package/dist/scripts/data-transformers/document-analysis.js +396 -0
- package/dist/scripts/data-transformers/document-analysis.js.map +1 -0
- package/dist/scripts/data-transformers/helpers.d.ts +144 -0
- package/dist/scripts/data-transformers/helpers.d.ts.map +1 -0
- package/dist/scripts/data-transformers/helpers.js +408 -0
- package/dist/scripts/data-transformers/helpers.js.map +1 -0
- package/dist/scripts/data-transformers/index.d.ts +45 -0
- package/dist/scripts/data-transformers/index.d.ts.map +1 -0
- package/dist/scripts/data-transformers/index.js +66 -0
- package/dist/scripts/data-transformers/index.js.map +1 -0
- package/dist/scripts/data-transformers/metadata.d.ts +42 -0
- package/dist/scripts/data-transformers/metadata.d.ts.map +1 -0
- package/dist/scripts/data-transformers/metadata.js +385 -0
- package/dist/scripts/data-transformers/metadata.js.map +1 -0
- package/dist/scripts/data-transformers/policy-analysis.d.ts +105 -0
- package/dist/scripts/data-transformers/policy-analysis.d.ts.map +1 -0
- package/dist/scripts/data-transformers/policy-analysis.js +686 -0
- package/dist/scripts/data-transformers/policy-analysis.js.map +1 -0
- package/dist/scripts/data-transformers/risk-analysis.d.ts +104 -0
- package/dist/scripts/data-transformers/risk-analysis.d.ts.map +1 -0
- package/dist/scripts/data-transformers/risk-analysis.js +279 -0
- package/dist/scripts/data-transformers/risk-analysis.js.map +1 -0
- package/dist/scripts/data-transformers/types.d.ts +260 -0
- package/dist/scripts/data-transformers/types.d.ts.map +1 -0
- package/dist/scripts/data-transformers/types.js +11 -0
- package/dist/scripts/data-transformers/types.js.map +1 -0
- package/dist/scripts/data-transformers.d.ts +23 -0
- package/dist/scripts/data-transformers.d.ts.map +1 -0
- package/dist/scripts/data-transformers.js +35 -0
- package/dist/scripts/data-transformers.js.map +1 -0
- package/dist/scripts/deep-inspection/index.d.ts +55 -0
- package/dist/scripts/deep-inspection/index.d.ts.map +1 -0
- package/dist/scripts/deep-inspection/index.js +66 -0
- package/dist/scripts/deep-inspection/index.js.map +1 -0
- package/dist/scripts/detect-swedish-leakage.d.ts +69 -0
- package/dist/scripts/detect-swedish-leakage.d.ts.map +1 -0
- package/dist/scripts/detect-swedish-leakage.js +417 -0
- package/dist/scripts/detect-swedish-leakage.js.map +1 -0
- package/dist/scripts/editorial-framework.d.ts +121 -0
- package/dist/scripts/editorial-framework.d.ts.map +1 -0
- package/dist/scripts/editorial-framework.js +364 -0
- package/dist/scripts/editorial-framework.js.map +1 -0
- package/dist/scripts/editorial-pillars.d.ts +43 -0
- package/dist/scripts/editorial-pillars.d.ts.map +1 -0
- package/dist/scripts/editorial-pillars.js +215 -0
- package/dist/scripts/editorial-pillars.js.map +1 -0
- package/dist/scripts/extract-news-metadata.d.ts +12 -0
- package/dist/scripts/extract-news-metadata.d.ts.map +1 -0
- package/dist/scripts/extract-news-metadata.js +107 -0
- package/dist/scripts/extract-news-metadata.js.map +1 -0
- package/dist/scripts/extract-vocabulary.d.ts +15 -0
- package/dist/scripts/extract-vocabulary.d.ts.map +1 -0
- package/dist/scripts/extract-vocabulary.js +255 -0
- package/dist/scripts/extract-vocabulary.js.map +1 -0
- package/dist/scripts/fix-article-navigation.d.ts +37 -0
- package/dist/scripts/fix-article-navigation.d.ts.map +1 -0
- package/dist/scripts/fix-article-navigation.js +198 -0
- package/dist/scripts/fix-article-navigation.js.map +1 -0
- package/dist/scripts/fix-keywords-localization.d.ts +18 -0
- package/dist/scripts/fix-keywords-localization.d.ts.map +1 -0
- package/dist/scripts/fix-keywords-localization.js +270 -0
- package/dist/scripts/fix-keywords-localization.js.map +1 -0
- package/dist/scripts/fix-old-articles-branding.d.ts +17 -0
- package/dist/scripts/fix-old-articles-branding.d.ts.map +1 -0
- package/dist/scripts/fix-old-articles-branding.js +229 -0
- package/dist/scripts/fix-old-articles-branding.js.map +1 -0
- package/dist/scripts/generate-news-backport.d.ts +16 -0
- package/dist/scripts/generate-news-backport.d.ts.map +1 -0
- package/dist/scripts/generate-news-backport.js +379 -0
- package/dist/scripts/generate-news-backport.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts +124 -0
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js +529 -0
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts +59 -0
- package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/analysis-cache.js +116 -0
- package/dist/scripts/generate-news-enhanced/analysis-cache.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts +58 -0
- package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/analysis-labels.js +144 -0
- package/dist/scripts/generate-news-enhanced/analysis-labels.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/config.d.ts +57 -0
- package/dist/scripts/generate-news-enhanced/config.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/config.js +286 -0
- package/dist/scripts/generate-news-enhanced/config.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/generators.d.ts +119 -0
- package/dist/scripts/generate-news-enhanced/generators.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/generators.js +2108 -0
- package/dist/scripts/generate-news-enhanced/generators.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/helpers.d.ts +123 -0
- package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/helpers.js +438 -0
- package/dist/scripts/generate-news-enhanced/helpers.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/index.d.ts +19 -0
- package/dist/scripts/generate-news-enhanced/index.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/index.js +221 -0
- package/dist/scripts/generate-news-enhanced/index.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +35 -0
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js +1179 -0
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +1 -0
- package/dist/scripts/generate-news-enhanced/types.d.ts +34 -0
- package/dist/scripts/generate-news-enhanced/types.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced/types.js +9 -0
- package/dist/scripts/generate-news-enhanced/types.js.map +1 -0
- package/dist/scripts/generate-news-enhanced.d.ts +25 -0
- package/dist/scripts/generate-news-enhanced.d.ts.map +1 -0
- package/dist/scripts/generate-news-enhanced.js +37 -0
- package/dist/scripts/generate-news-enhanced.js.map +1 -0
- package/dist/scripts/generate-news-indexes/constants.d.ts +20 -0
- package/dist/scripts/generate-news-indexes/constants.d.ts.map +1 -0
- package/dist/scripts/generate-news-indexes/constants.js +308 -0
- package/dist/scripts/generate-news-indexes/constants.js.map +1 -0
- package/dist/scripts/generate-news-indexes/helpers.d.ts +73 -0
- package/dist/scripts/generate-news-indexes/helpers.d.ts.map +1 -0
- package/dist/scripts/generate-news-indexes/helpers.js +352 -0
- package/dist/scripts/generate-news-indexes/helpers.js.map +1 -0
- package/dist/scripts/generate-news-indexes/index.d.ts +20 -0
- package/dist/scripts/generate-news-indexes/index.d.ts.map +1 -0
- package/dist/scripts/generate-news-indexes/index.js +75 -0
- package/dist/scripts/generate-news-indexes/index.js.map +1 -0
- package/dist/scripts/generate-news-indexes/template.d.ts +25 -0
- package/dist/scripts/generate-news-indexes/template.d.ts.map +1 -0
- package/dist/scripts/generate-news-indexes/template.js +644 -0
- package/dist/scripts/generate-news-indexes/template.js.map +1 -0
- package/dist/scripts/generate-news-indexes/types.d.ts +96 -0
- package/dist/scripts/generate-news-indexes/types.d.ts.map +1 -0
- package/dist/scripts/generate-news-indexes/types.js +9 -0
- package/dist/scripts/generate-news-indexes/types.js.map +1 -0
- package/dist/scripts/generate-news-indexes.d.ts +20 -0
- package/dist/scripts/generate-news-indexes.d.ts.map +1 -0
- package/dist/scripts/generate-news-indexes.js +19 -0
- package/dist/scripts/generate-news-indexes.js.map +1 -0
- package/dist/scripts/generate-rss.d.ts +48 -0
- package/dist/scripts/generate-rss.d.ts.map +1 -0
- package/dist/scripts/generate-rss.js +299 -0
- package/dist/scripts/generate-rss.js.map +1 -0
- package/dist/scripts/generate-sitemap-html.d.ts +79 -0
- package/dist/scripts/generate-sitemap-html.d.ts.map +1 -0
- package/dist/scripts/generate-sitemap-html.js +878 -0
- package/dist/scripts/generate-sitemap-html.js.map +1 -0
- package/dist/scripts/generate-sitemap.d.ts +23 -0
- package/dist/scripts/generate-sitemap.d.ts.map +1 -0
- package/dist/scripts/generate-sitemap.js +476 -0
- package/dist/scripts/generate-sitemap.js.map +1 -0
- package/dist/scripts/generate-types-from-cia-schemas.d.ts +176 -0
- package/dist/scripts/generate-types-from-cia-schemas.d.ts.map +1 -0
- package/dist/scripts/generate-types-from-cia-schemas.js +318 -0
- package/dist/scripts/generate-types-from-cia-schemas.js.map +1 -0
- package/dist/scripts/government-role-validator.d.ts +65 -0
- package/dist/scripts/government-role-validator.d.ts.map +1 -0
- package/dist/scripts/government-role-validator.js +217 -0
- package/dist/scripts/government-role-validator.js.map +1 -0
- package/dist/scripts/html-utils.d.ts +17 -0
- package/dist/scripts/html-utils.d.ts.map +1 -0
- package/dist/scripts/html-utils.js +29 -0
- package/dist/scripts/html-utils.js.map +1 -0
- package/dist/scripts/load-cia-stats.d.ts +89 -0
- package/dist/scripts/load-cia-stats.d.ts.map +1 -0
- package/dist/scripts/load-cia-stats.js +400 -0
- package/dist/scripts/load-cia-stats.js.map +1 -0
- package/dist/scripts/mcp-client/client.d.ts +73 -0
- package/dist/scripts/mcp-client/client.d.ts.map +1 -0
- package/dist/scripts/mcp-client/client.js +526 -0
- package/dist/scripts/mcp-client/client.js.map +1 -0
- package/dist/scripts/mcp-client/document-types.d.ts +23 -0
- package/dist/scripts/mcp-client/document-types.d.ts.map +1 -0
- package/dist/scripts/mcp-client/document-types.js +62 -0
- package/dist/scripts/mcp-client/document-types.js.map +1 -0
- package/dist/scripts/mcp-client/index.d.ts +34 -0
- package/dist/scripts/mcp-client/index.d.ts.map +1 -0
- package/dist/scripts/mcp-client/index.js +67 -0
- package/dist/scripts/mcp-client/index.js.map +1 -0
- package/dist/scripts/mcp-client/transport.d.ts +32 -0
- package/dist/scripts/mcp-client/transport.d.ts.map +1 -0
- package/dist/scripts/mcp-client/transport.js +102 -0
- package/dist/scripts/mcp-client/transport.js.map +1 -0
- package/dist/scripts/mcp-client.d.ts +18 -0
- package/dist/scripts/mcp-client.d.ts.map +1 -0
- package/dist/scripts/mcp-client.js +18 -0
- package/dist/scripts/mcp-client.js.map +1 -0
- package/dist/scripts/mcp-query-cli.d.ts +25 -0
- package/dist/scripts/mcp-query-cli.d.ts.map +1 -0
- package/dist/scripts/mcp-query-cli.js +66 -0
- package/dist/scripts/mcp-query-cli.js.map +1 -0
- package/dist/scripts/news-types/breaking-news.d.ts +178 -0
- package/dist/scripts/news-types/breaking-news.d.ts.map +1 -0
- package/dist/scripts/news-types/breaking-news.js +428 -0
- package/dist/scripts/news-types/breaking-news.js.map +1 -0
- package/dist/scripts/news-types/committee-reports.d.ts +212 -0
- package/dist/scripts/news-types/committee-reports.d.ts.map +1 -0
- package/dist/scripts/news-types/committee-reports.js +404 -0
- package/dist/scripts/news-types/committee-reports.js.map +1 -0
- package/dist/scripts/news-types/month-ahead.d.ts +71 -0
- package/dist/scripts/news-types/month-ahead.d.ts.map +1 -0
- package/dist/scripts/news-types/month-ahead.js +392 -0
- package/dist/scripts/news-types/month-ahead.js.map +1 -0
- package/dist/scripts/news-types/monthly-review.d.ts +61 -0
- package/dist/scripts/news-types/monthly-review.d.ts.map +1 -0
- package/dist/scripts/news-types/monthly-review.js +417 -0
- package/dist/scripts/news-types/monthly-review.js.map +1 -0
- package/dist/scripts/news-types/motions.d.ts +214 -0
- package/dist/scripts/news-types/motions.d.ts.map +1 -0
- package/dist/scripts/news-types/motions.js +447 -0
- package/dist/scripts/news-types/motions.js.map +1 -0
- package/dist/scripts/news-types/propositions.d.ts +204 -0
- package/dist/scripts/news-types/propositions.d.ts.map +1 -0
- package/dist/scripts/news-types/propositions.js +401 -0
- package/dist/scripts/news-types/propositions.js.map +1 -0
- package/dist/scripts/news-types/week-ahead.d.ts +231 -0
- package/dist/scripts/news-types/week-ahead.d.ts.map +1 -0
- package/dist/scripts/news-types/week-ahead.js +441 -0
- package/dist/scripts/news-types/week-ahead.js.map +1 -0
- package/dist/scripts/news-types/weekly-review/analysis.d.ts +47 -0
- package/dist/scripts/news-types/weekly-review/analysis.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review/analysis.js +276 -0
- package/dist/scripts/news-types/weekly-review/analysis.js.map +1 -0
- package/dist/scripts/news-types/weekly-review/data-loader.d.ts +51 -0
- package/dist/scripts/news-types/weekly-review/data-loader.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review/data-loader.js +298 -0
- package/dist/scripts/news-types/weekly-review/data-loader.js.map +1 -0
- package/dist/scripts/news-types/weekly-review/generator.d.ts +18 -0
- package/dist/scripts/news-types/weekly-review/generator.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review/generator.js +284 -0
- package/dist/scripts/news-types/weekly-review/generator.js.map +1 -0
- package/dist/scripts/news-types/weekly-review/index.d.ts +20 -0
- package/dist/scripts/news-types/weekly-review/index.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review/index.js +23 -0
- package/dist/scripts/news-types/weekly-review/index.js.map +1 -0
- package/dist/scripts/news-types/weekly-review/types.d.ts +72 -0
- package/dist/scripts/news-types/weekly-review/types.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review/types.js +20 -0
- package/dist/scripts/news-types/weekly-review/types.js.map +1 -0
- package/dist/scripts/news-types/weekly-review/validation.d.ts +10 -0
- package/dist/scripts/news-types/weekly-review/validation.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review/validation.js +95 -0
- package/dist/scripts/news-types/weekly-review/validation.js.map +1 -0
- package/dist/scripts/news-types/weekly-review.d.ts +15 -0
- package/dist/scripts/news-types/weekly-review.d.ts.map +1 -0
- package/dist/scripts/news-types/weekly-review.js +14 -0
- package/dist/scripts/news-types/weekly-review.js.map +1 -0
- package/dist/scripts/party-variants.d.ts +23 -0
- package/dist/scripts/party-variants.d.ts.map +1 -0
- package/dist/scripts/party-variants.js +50 -0
- package/dist/scripts/party-variants.js.map +1 -0
- package/dist/scripts/pipeline/index.d.ts +19 -0
- package/dist/scripts/pipeline/index.d.ts.map +1 -0
- package/dist/scripts/pipeline/index.js +17 -0
- package/dist/scripts/pipeline/index.js.map +1 -0
- package/dist/scripts/pipeline/orchestrator.d.ts +56 -0
- package/dist/scripts/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/scripts/pipeline/orchestrator.js +147 -0
- package/dist/scripts/pipeline/orchestrator.js.map +1 -0
- package/dist/scripts/pipeline/types.d.ts +117 -0
- package/dist/scripts/pipeline/types.d.ts.map +1 -0
- package/dist/scripts/pipeline/types.js +13 -0
- package/dist/scripts/pipeline/types.js.map +1 -0
- package/dist/scripts/pipeline/validation.d.ts +66 -0
- package/dist/scripts/pipeline/validation.d.ts.map +1 -0
- package/dist/scripts/pipeline/validation.js +129 -0
- package/dist/scripts/pipeline/validation.js.map +1 -0
- package/dist/scripts/populate-analysis-data.d.ts +41 -0
- package/dist/scripts/populate-analysis-data.d.ts.map +1 -0
- package/dist/scripts/populate-analysis-data.js +255 -0
- package/dist/scripts/populate-analysis-data.js.map +1 -0
- package/dist/scripts/pre-article-analysis/data-downloader.d.ts +80 -0
- package/dist/scripts/pre-article-analysis/data-downloader.d.ts.map +1 -0
- package/dist/scripts/pre-article-analysis/data-downloader.js +230 -0
- package/dist/scripts/pre-article-analysis/data-downloader.js.map +1 -0
- package/dist/scripts/pre-article-analysis/data-persistence.d.ts +141 -0
- package/dist/scripts/pre-article-analysis/data-persistence.d.ts.map +1 -0
- package/dist/scripts/pre-article-analysis/data-persistence.js +345 -0
- package/dist/scripts/pre-article-analysis/data-persistence.js.map +1 -0
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +95 -0
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +1 -0
- package/dist/scripts/pre-article-analysis/markdown-serializer.js +648 -0
- package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +1 -0
- package/dist/scripts/pre-article-analysis/pdf-converter.d.ts +58 -0
- package/dist/scripts/pre-article-analysis/pdf-converter.d.ts.map +1 -0
- package/dist/scripts/pre-article-analysis/pdf-converter.js +142 -0
- package/dist/scripts/pre-article-analysis/pdf-converter.js.map +1 -0
- package/dist/scripts/pre-article-analysis.d.ts +41 -0
- package/dist/scripts/pre-article-analysis.d.ts.map +1 -0
- package/dist/scripts/pre-article-analysis.js +578 -0
- package/dist/scripts/pre-article-analysis.js.map +1 -0
- package/dist/scripts/scb-client.d.ts +104 -0
- package/dist/scripts/scb-client.d.ts.map +1 -0
- package/dist/scripts/scb-client.js +286 -0
- package/dist/scripts/scb-client.js.map +1 -0
- package/dist/scripts/scb-context.d.ts +88 -0
- package/dist/scripts/scb-context.d.ts.map +1 -0
- package/dist/scripts/scb-context.js +307 -0
- package/dist/scripts/scb-context.js.map +1 -0
- package/dist/scripts/shared/version.d.ts +9 -0
- package/dist/scripts/shared/version.d.ts.map +1 -0
- package/dist/scripts/shared/version.js +28 -0
- package/dist/scripts/shared/version.js.map +1 -0
- package/dist/scripts/statistical-claims-detector.d.ts +119 -0
- package/dist/scripts/statistical-claims-detector.d.ts.map +1 -0
- package/dist/scripts/statistical-claims-detector.js +391 -0
- package/dist/scripts/statistical-claims-detector.js.map +1 -0
- package/dist/scripts/sync-cia-schemas.d.ts +52 -0
- package/dist/scripts/sync-cia-schemas.d.ts.map +1 -0
- package/dist/scripts/sync-cia-schemas.js +195 -0
- package/dist/scripts/sync-cia-schemas.js.map +1 -0
- package/dist/scripts/translation-dictionary.d.ts +45 -0
- package/dist/scripts/translation-dictionary.d.ts.map +1 -0
- package/dist/scripts/translation-dictionary.js +3642 -0
- package/dist/scripts/translation-dictionary.js.map +1 -0
- package/dist/scripts/types/article.d.ts +362 -0
- package/dist/scripts/types/article.d.ts.map +1 -0
- package/dist/scripts/types/article.js +6 -0
- package/dist/scripts/types/article.js.map +1 -0
- package/dist/scripts/types/content.d.ts +167 -0
- package/dist/scripts/types/content.d.ts.map +1 -0
- package/dist/scripts/types/content.js +6 -0
- package/dist/scripts/types/content.js.map +1 -0
- package/dist/scripts/types/editorial.d.ts +17 -0
- package/dist/scripts/types/editorial.d.ts.map +1 -0
- package/dist/scripts/types/editorial.js +6 -0
- package/dist/scripts/types/editorial.js.map +1 -0
- package/dist/scripts/types/language.d.ts +7 -0
- package/dist/scripts/types/language.d.ts.map +1 -0
- package/dist/scripts/types/language.js +6 -0
- package/dist/scripts/types/language.js.map +1 -0
- package/dist/scripts/types/mcp.d.ts +117 -0
- package/dist/scripts/types/mcp.d.ts.map +1 -0
- package/dist/scripts/types/mcp.js +6 -0
- package/dist/scripts/types/mcp.js.map +1 -0
- package/dist/scripts/types/party.d.ts +9 -0
- package/dist/scripts/types/party.d.ts.map +1 -0
- package/dist/scripts/types/party.js +6 -0
- package/dist/scripts/types/party.js.map +1 -0
- package/dist/scripts/types/validation.d.ts +136 -0
- package/dist/scripts/types/validation.d.ts.map +1 -0
- package/dist/scripts/types/validation.js +6 -0
- package/dist/scripts/types/validation.js.map +1 -0
- package/dist/scripts/types/workflow.d.ts +78 -0
- package/dist/scripts/types/workflow.d.ts.map +1 -0
- package/dist/scripts/types/workflow.js +6 -0
- package/dist/scripts/types/workflow.js.map +1 -0
- package/dist/scripts/update-stats-from-cia.d.ts +44 -0
- package/dist/scripts/update-stats-from-cia.d.ts.map +1 -0
- package/dist/scripts/update-stats-from-cia.js +310 -0
- package/dist/scripts/update-stats-from-cia.js.map +1 -0
- package/dist/scripts/validate-against-cia-schemas.d.ts +126 -0
- package/dist/scripts/validate-against-cia-schemas.d.ts.map +1 -0
- package/dist/scripts/validate-against-cia-schemas.js +299 -0
- package/dist/scripts/validate-against-cia-schemas.js.map +1 -0
- package/dist/scripts/validate-cross-references.d.ts +49 -0
- package/dist/scripts/validate-cross-references.d.ts.map +1 -0
- package/dist/scripts/validate-cross-references.js +183 -0
- package/dist/scripts/validate-cross-references.js.map +1 -0
- package/dist/scripts/validate-file-ownership.d.ts +68 -0
- package/dist/scripts/validate-file-ownership.d.ts.map +1 -0
- package/dist/scripts/validate-file-ownership.js +135 -0
- package/dist/scripts/validate-file-ownership.js.map +1 -0
- package/dist/scripts/validate-news-translations.d.ts +27 -0
- package/dist/scripts/validate-news-translations.d.ts.map +1 -0
- package/dist/scripts/validate-news-translations.js +258 -0
- package/dist/scripts/validate-news-translations.js.map +1 -0
- package/dist/scripts/validate-translations.d.ts +162 -0
- package/dist/scripts/validate-translations.d.ts.map +1 -0
- package/dist/scripts/validate-translations.js +378 -0
- package/dist/scripts/validate-translations.js.map +1 -0
- package/dist/scripts/workflow-state-coordinator.d.ts +354 -0
- package/dist/scripts/workflow-state-coordinator.d.ts.map +1 -0
- package/dist/scripts/workflow-state-coordinator.js +876 -0
- package/dist/scripts/workflow-state-coordinator.js.map +1 -0
- package/dist/scripts/world-bank-client.d.ts +122 -0
- package/dist/scripts/world-bank-client.d.ts.map +1 -0
- package/dist/scripts/world-bank-client.js +192 -0
- package/dist/scripts/world-bank-client.js.map +1 -0
- package/dist/scripts/world-bank-context.d.ts +88 -0
- package/dist/scripts/world-bank-context.d.ts.map +1 -0
- package/dist/scripts/world-bank-context.js +331 -0
- package/dist/scripts/world-bank-context.js.map +1 -0
- package/package.json +31 -6
- package/dist/lib/chart-factory.d.ts.map +0 -1
- package/dist/lib/chart-factory.js.map +0 -1
- package/dist/lib/data-loader.d.ts.map +0 -1
- package/dist/lib/data-loader.js.map +0 -1
- package/dist/lib/dom-utils.d.ts.map +0 -1
- package/dist/lib/dom-utils.js.map +0 -1
- package/dist/lib/error-boundary.d.ts.map +0 -1
- package/dist/lib/error-boundary.js.map +0 -1
- package/dist/lib/fallback-ui.d.ts.map +0 -1
- package/dist/lib/fallback-ui.js.map +0 -1
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/logger.d.ts.map +0 -1
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/theme.d.ts.map +0 -1
- package/dist/lib/theme.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- /package/dist/lib/{chart-factory.d.ts → shared/chart-factory.d.ts} +0 -0
- /package/dist/lib/{chart-factory.js → shared/chart-factory.js} +0 -0
- /package/dist/lib/{data-loader.d.ts → shared/data-loader.d.ts} +0 -0
- /package/dist/lib/{data-loader.js → shared/data-loader.js} +0 -0
- /package/dist/lib/{dom-utils.d.ts → shared/dom-utils.d.ts} +0 -0
- /package/dist/lib/{dom-utils.js → shared/dom-utils.js} +0 -0
- /package/dist/lib/{error-boundary.d.ts → shared/error-boundary.d.ts} +0 -0
- /package/dist/lib/{error-boundary.js → shared/error-boundary.js} +0 -0
- /package/dist/lib/{fallback-ui.d.ts → shared/fallback-ui.d.ts} +0 -0
- /package/dist/lib/{fallback-ui.js → shared/fallback-ui.js} +0 -0
- /package/dist/lib/{index.d.ts → shared/index.d.ts} +0 -0
- /package/dist/lib/{index.js → shared/index.js} +0 -0
- /package/dist/lib/{logger.d.ts → shared/logger.d.ts} +0 -0
- /package/dist/lib/{logger.js → shared/logger.js} +0 -0
- /package/dist/lib/{theme.d.ts → shared/theme.d.ts} +0 -0
- /package/dist/lib/{theme.js → shared/theme.js} +0 -0
- /package/dist/lib/{types.d.ts → shared/types.d.ts} +0 -0
- /package/dist/lib/{types.js → shared/types.js} +0 -0
|
@@ -0,0 +1,867 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/DataLoader
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* CIA Intelligence Data Loader & Pipeline Orchestrator.
|
|
7
|
+
* Core data acquisition module implementing multi-source intelligence data loading
|
|
8
|
+
* from the Citizen Intelligence Agency (CIA) Platform. Manages CSV export ingestion
|
|
9
|
+
* for 19+ intelligence product categories and JSON fallback for model-generated
|
|
10
|
+
* electoral forecasts. Provides resilient data pipeline with local-first strategy
|
|
11
|
+
* and remote fallback capabilities.
|
|
12
|
+
*
|
|
13
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
14
|
+
* @license Apache-2.0
|
|
15
|
+
* @version 2.0.0
|
|
16
|
+
* @since 2024
|
|
17
|
+
|
|
18
|
+
*
|
|
19
|
+
* @intelligence CIA Platform Data Pipeline Orchestrator — core data acquisition module implementing multi-source intelligence data loading from 19+ CIA product categories. Manages CSV export ingestion and JSON fallback for electoral forecasts. Provides resilient pipeline with local-first strategy and remote fallback.
|
|
20
|
+
*
|
|
21
|
+
* @business Data infrastructure investment — the CIA data pipeline is the foundation for all analytical products. Pipeline reliability directly impacts user experience and platform credibility. Modular architecture enables future data source expansion (European Parliament, Nordic councils).
|
|
22
|
+
*
|
|
23
|
+
* @marketing Data transparency asset — transparent data sourcing (CIA Platform, open government data) builds trust with all audience segments. Data pipeline documentation demonstrates commitment to accuracy and verifiability, key messaging for press and academic audiences.
|
|
24
|
+
* */
|
|
25
|
+
/* ------------------------------------------------------------------ */
|
|
26
|
+
/* CIADataLoader class */
|
|
27
|
+
/* ------------------------------------------------------------------ */
|
|
28
|
+
export class CIADataLoader {
|
|
29
|
+
csvBaseURL;
|
|
30
|
+
fallbackURL;
|
|
31
|
+
/** The 8 parties represented in the Swedish Riksdag. */
|
|
32
|
+
static RIKSDAG_PARTIES = ['S', 'M', 'SD', 'C', 'V', 'KD', 'L', 'MP'];
|
|
33
|
+
/** Mapping of full Swedish committee names to their Riksdag org codes. */
|
|
34
|
+
static COMMITTEE_ORG_CODES = {
|
|
35
|
+
'Konstitutionsutskottet': 'KU',
|
|
36
|
+
'Civilutskottet': 'CU',
|
|
37
|
+
'Trafikutskottet': 'TU',
|
|
38
|
+
'Näringsutskottet': 'NU',
|
|
39
|
+
'Miljö- och jordbruksutskottet': 'MJU',
|
|
40
|
+
'Utrikesutskottet': 'UU',
|
|
41
|
+
'Arbetsmarknadsutskottet': 'AU',
|
|
42
|
+
'Socialförsäkringsutskottet': 'SfU',
|
|
43
|
+
'Socialutskottet': 'SoU',
|
|
44
|
+
'Justitieutskottet': 'JuU',
|
|
45
|
+
'Skatteutskottet': 'SkU',
|
|
46
|
+
'EU-nämnden': 'EUN',
|
|
47
|
+
'Kulturutskottet': 'KrU',
|
|
48
|
+
'Utbildningsutskottet': 'UbU',
|
|
49
|
+
'Finansutskottet': 'FiU',
|
|
50
|
+
'Försvarsutskottet': 'FöU',
|
|
51
|
+
'Lagutskottet': 'LU',
|
|
52
|
+
'Bostadsutskottet': 'BoU'
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Heuristic divisor to estimate meetings/year from committee document counts.
|
|
56
|
+
* Assumption: ~25 published documents per active committee meeting.
|
|
57
|
+
*/
|
|
58
|
+
static COMMITTEE_DOCS_PER_MEETING_ESTIMATE = 25;
|
|
59
|
+
constructor() {
|
|
60
|
+
this.csvBaseURL = '../cia-data/';
|
|
61
|
+
this.fallbackURL = 'https://raw.githubusercontent.com/Hack23/cia/master/service.data.impl/sample-data/';
|
|
62
|
+
}
|
|
63
|
+
/** CSV data source definitions – maps to real PostgreSQL view exports. */
|
|
64
|
+
static CSV_SOURCES = {
|
|
65
|
+
personStatus: {
|
|
66
|
+
local: 'distribution_person_status.csv',
|
|
67
|
+
description: 'Active MP counts by status'
|
|
68
|
+
},
|
|
69
|
+
riskByParty: {
|
|
70
|
+
local: 'distribution_risk_by_party.csv',
|
|
71
|
+
description: 'Risk levels per party'
|
|
72
|
+
},
|
|
73
|
+
riskLevels: {
|
|
74
|
+
local: 'distribution_politician_risk_levels.csv',
|
|
75
|
+
description: 'Aggregate risk level distribution'
|
|
76
|
+
},
|
|
77
|
+
annualBallots: {
|
|
78
|
+
local: 'voting/distribution_annual_ballots.csv',
|
|
79
|
+
description: 'Annual ballot/vote counts'
|
|
80
|
+
},
|
|
81
|
+
crisisResilience: {
|
|
82
|
+
local: 'risk/distribution_crisis_resilience.csv',
|
|
83
|
+
description: 'Coalition stability/resilience scores'
|
|
84
|
+
},
|
|
85
|
+
partyPerformance: {
|
|
86
|
+
local: 'party/distribution_party_performance.csv',
|
|
87
|
+
description: 'Party metrics (docs, motions, performance level)'
|
|
88
|
+
},
|
|
89
|
+
partyMetrics: {
|
|
90
|
+
local: 'party/view_party_performance_metrics_sample.csv',
|
|
91
|
+
description: 'Full party metrics with win rate, rebel rate, absence rate'
|
|
92
|
+
},
|
|
93
|
+
partyMomentum: {
|
|
94
|
+
local: 'party/distribution_party_momentum.csv',
|
|
95
|
+
description: 'Party trend direction and stability'
|
|
96
|
+
},
|
|
97
|
+
partyMembers: {
|
|
98
|
+
local: 'party/distribution_annual_party_members.csv',
|
|
99
|
+
description: 'Annual party membership counts'
|
|
100
|
+
},
|
|
101
|
+
influenceMetrics: {
|
|
102
|
+
local: 'politician/view_riksdagen_politician_influence_metrics_sample.csv',
|
|
103
|
+
description: 'MP influence scores and network connections'
|
|
104
|
+
},
|
|
105
|
+
riskSummary: {
|
|
106
|
+
local: 'politician/view_politician_risk_summary_sample.csv',
|
|
107
|
+
description: 'MP risk scores and assessments'
|
|
108
|
+
},
|
|
109
|
+
committeeProductivity: {
|
|
110
|
+
local: 'committee/distribution_committee_productivity.csv',
|
|
111
|
+
description: 'Committee productivity and member counts'
|
|
112
|
+
},
|
|
113
|
+
committeeActivity: {
|
|
114
|
+
local: 'committee/distribution_committee_activity.csv',
|
|
115
|
+
description: 'Committee document counts'
|
|
116
|
+
},
|
|
117
|
+
partyEffectiveness: {
|
|
118
|
+
local: 'party/distribution_party_effectiveness_trends.csv',
|
|
119
|
+
description: 'Party effectiveness trends with win rate'
|
|
120
|
+
},
|
|
121
|
+
electionForecast: {
|
|
122
|
+
local: 'election/election_forecast.csv',
|
|
123
|
+
description: 'Election 2026 seat predictions per party'
|
|
124
|
+
},
|
|
125
|
+
coalitionScenarios: {
|
|
126
|
+
local: 'election/coalition_scenarios.csv',
|
|
127
|
+
description: 'Coalition scenario probability modeling'
|
|
128
|
+
},
|
|
129
|
+
coalitionAlignment: {
|
|
130
|
+
local: 'party/distribution_coalition_alignment.csv',
|
|
131
|
+
description: 'Real party-pair voting alignment rates'
|
|
132
|
+
},
|
|
133
|
+
genderByParty: {
|
|
134
|
+
local: 'party/distribution_gender_by_party.csv',
|
|
135
|
+
description: 'Gender distribution per party'
|
|
136
|
+
},
|
|
137
|
+
experienceByParty: {
|
|
138
|
+
local: 'party/distribution_experience_by_party.csv',
|
|
139
|
+
description: 'Experience levels per party'
|
|
140
|
+
},
|
|
141
|
+
ministryEffectiveness: {
|
|
142
|
+
local: 'ministry/distribution_ministry_effectiveness.csv',
|
|
143
|
+
description: 'Ministry effectiveness assessments'
|
|
144
|
+
},
|
|
145
|
+
annualDocTypes: {
|
|
146
|
+
local: 'voting/distribution_annual_document_types.csv',
|
|
147
|
+
description: 'Annual document type counts'
|
|
148
|
+
},
|
|
149
|
+
decisionTrends: {
|
|
150
|
+
local: 'voting/distribution_decision_trends.csv',
|
|
151
|
+
description: 'Decision approval trends over time'
|
|
152
|
+
},
|
|
153
|
+
electionRegions: {
|
|
154
|
+
local: 'election/distribution_election_regions.csv',
|
|
155
|
+
description: 'MPs per election region'
|
|
156
|
+
},
|
|
157
|
+
governmentRoles: {
|
|
158
|
+
local: 'view_riksdagen_goverment_role_member_sample.csv',
|
|
159
|
+
description: 'Government minister role assignments'
|
|
160
|
+
},
|
|
161
|
+
riskEvolution: {
|
|
162
|
+
local: 'distribution_risk_evolution_temporal.csv',
|
|
163
|
+
description: 'Risk score changes over time'
|
|
164
|
+
},
|
|
165
|
+
behavioralPatterns: {
|
|
166
|
+
local: 'party/distribution_behavioral_patterns_by_party.csv',
|
|
167
|
+
description: 'Behavioral risk patterns per party'
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Parse CSV text into array of objects using header row as keys.
|
|
172
|
+
* @param csvText - Raw CSV text
|
|
173
|
+
* @returns Parsed rows
|
|
174
|
+
*/
|
|
175
|
+
parseCSV(csvText) {
|
|
176
|
+
const lines = csvText.trim().split('\n');
|
|
177
|
+
if (lines.length < 2)
|
|
178
|
+
return [];
|
|
179
|
+
const headers = lines[0].split(',').map(h => h.trim().replace(/^"|"$/g, ''));
|
|
180
|
+
const rows = [];
|
|
181
|
+
for (let i = 1; i < lines.length; i++) {
|
|
182
|
+
const line = lines[i].trim();
|
|
183
|
+
if (!line)
|
|
184
|
+
continue;
|
|
185
|
+
// Simple CSV parsing (handles basic quoting)
|
|
186
|
+
const values = [];
|
|
187
|
+
let current = '';
|
|
188
|
+
let inQuotes = false;
|
|
189
|
+
for (let j = 0; j < line.length; j++) {
|
|
190
|
+
const ch = line[j];
|
|
191
|
+
if (ch === '"') {
|
|
192
|
+
inQuotes = !inQuotes;
|
|
193
|
+
}
|
|
194
|
+
else if (ch === ',' && !inQuotes) {
|
|
195
|
+
values.push(current.trim());
|
|
196
|
+
current = '';
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
current += ch;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
values.push(current.trim());
|
|
203
|
+
const row = {};
|
|
204
|
+
headers.forEach((h, idx) => {
|
|
205
|
+
const val = values[idx] || '';
|
|
206
|
+
const num = Number(val);
|
|
207
|
+
row[h] = val !== '' && !isNaN(num) ? num : val;
|
|
208
|
+
});
|
|
209
|
+
rows.push(row);
|
|
210
|
+
}
|
|
211
|
+
return rows;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Load CSV with local-first fallback.
|
|
215
|
+
* @param localPath - Path relative to csvBaseURL
|
|
216
|
+
* @param fallbackPath - Optional fallback path
|
|
217
|
+
* @returns Parsed CSV rows
|
|
218
|
+
*/
|
|
219
|
+
async loadCSV(localPath, fallbackPath) {
|
|
220
|
+
const urls = [
|
|
221
|
+
`${this.csvBaseURL}${localPath}`
|
|
222
|
+
];
|
|
223
|
+
if (fallbackPath) {
|
|
224
|
+
urls.push(`${this.fallbackURL}${fallbackPath}`);
|
|
225
|
+
}
|
|
226
|
+
for (const url of urls) {
|
|
227
|
+
try {
|
|
228
|
+
const response = await fetch(url);
|
|
229
|
+
if (!response.ok)
|
|
230
|
+
continue;
|
|
231
|
+
const text = await response.text();
|
|
232
|
+
const rows = this.parseCSV(text);
|
|
233
|
+
if (rows.length > 0)
|
|
234
|
+
return rows;
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
238
|
+
console.warn(`Failed to load CSV from ${url}:`, message);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
console.warn(`No data loaded for ${localPath}`);
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Build overview dashboard from CSV sources.
|
|
246
|
+
* Replaces overview-dashboard.json.
|
|
247
|
+
*/
|
|
248
|
+
async loadOverviewDashboard() {
|
|
249
|
+
const [personStatus, riskByParty, riskLevels, annualBallots, resilience] = await Promise.all([
|
|
250
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.personStatus.local),
|
|
251
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.riskByParty.local),
|
|
252
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.riskLevels.local),
|
|
253
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.annualBallots.local),
|
|
254
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.crisisResilience.local)
|
|
255
|
+
]);
|
|
256
|
+
// Count active MPs
|
|
257
|
+
const activeRow = personStatus.find(r => r.status === 'Tjänstgörande riksdagsledamot');
|
|
258
|
+
const totalMPs = activeRow ? activeRow.person_count : 349;
|
|
259
|
+
// Count unique parties from risk data (only real riksdag parties)
|
|
260
|
+
const riksdagParties = CIADataLoader.RIKSDAG_PARTIES;
|
|
261
|
+
const partiesInData = new Set(riskByParty.map(r => r.party).filter(p => riksdagParties.includes(p)));
|
|
262
|
+
const totalParties = partiesInData.size || 8;
|
|
263
|
+
// Risk alerts from risk_by_party
|
|
264
|
+
const highRisk = riskByParty.filter(r => r.risk_level === 'HIGH');
|
|
265
|
+
const medRisk = riskByParty.filter(r => r.risk_level === 'MEDIUM');
|
|
266
|
+
const lowRisk = riskByParty.filter(r => r.risk_level === 'LOW');
|
|
267
|
+
const critical = highRisk.reduce((sum, r) => sum + (r.politician_count || 0), 0);
|
|
268
|
+
const major = medRisk.reduce((sum, r) => sum + (r.politician_count || 0), 0);
|
|
269
|
+
const minor = lowRisk.reduce((sum, r) => sum + (r.politician_count || 0), 0);
|
|
270
|
+
// Total risk rules from risk levels
|
|
271
|
+
const totalRiskRules = riskLevels.length > 0
|
|
272
|
+
? riskLevels.reduce((sum, r) => sum + (r.politician_count || 0), 0)
|
|
273
|
+
: 45;
|
|
274
|
+
// Latest year ballot activity
|
|
275
|
+
const latestBallot = annualBallots.length > 0
|
|
276
|
+
? annualBallots[annualBallots.length - 1]
|
|
277
|
+
: {};
|
|
278
|
+
// Coalition stability from resilience scores (Tidö = M, KD, L, SD)
|
|
279
|
+
const tidoParties = ['M', 'KD', 'L', 'SD'];
|
|
280
|
+
const tidoResilience = resilience.filter(r => tidoParties.includes(r.party));
|
|
281
|
+
const avgResilience = tidoResilience.length > 0
|
|
282
|
+
? Math.round(tidoResilience.reduce((s, r) => s + (r.avg_resilience_score || 0), 0) / tidoResilience.length)
|
|
283
|
+
: 72;
|
|
284
|
+
return {
|
|
285
|
+
title: 'Swedish Riksdag Overview Dashboard',
|
|
286
|
+
description: 'Live intelligence from CIA PostgreSQL database exports',
|
|
287
|
+
lastUpdated: new Date().toISOString(),
|
|
288
|
+
keyMetrics: {
|
|
289
|
+
totalMPs,
|
|
290
|
+
totalParties,
|
|
291
|
+
totalRiskRules,
|
|
292
|
+
governmentCoalition: 'Tidö Agreement',
|
|
293
|
+
coalitionSeats: 176,
|
|
294
|
+
oppositionSeats: 173,
|
|
295
|
+
majorityMargin: 1
|
|
296
|
+
},
|
|
297
|
+
riskAlerts: {
|
|
298
|
+
critical,
|
|
299
|
+
major,
|
|
300
|
+
minor,
|
|
301
|
+
last90Days: { critical, major, minor }
|
|
302
|
+
},
|
|
303
|
+
parliamentActivity: {
|
|
304
|
+
votesLastMonth: latestBallot.total_votes || 0,
|
|
305
|
+
documentsProcessed: latestBallot.unique_ballots || 0,
|
|
306
|
+
motionsSubmitted: 0,
|
|
307
|
+
committeeMeetings: 0
|
|
308
|
+
},
|
|
309
|
+
coalitionStability: {
|
|
310
|
+
stabilityScore: avgResilience,
|
|
311
|
+
riskLevel: avgResilience >= 70 ? 'moderate' : 'high',
|
|
312
|
+
defectionProbability: 100 - avgResilience,
|
|
313
|
+
ideologicalTension: avgResilience < 60 ? 'high' : 'moderate'
|
|
314
|
+
},
|
|
315
|
+
dataQuality: {
|
|
316
|
+
completeness: 98.5,
|
|
317
|
+
lastDataSync: new Date().toISOString(),
|
|
318
|
+
coverage: '50+ years (1971-2026)'
|
|
319
|
+
},
|
|
320
|
+
_source: 'csv'
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Build election analysis from CSV sources.
|
|
325
|
+
* Replaces election-analysis.json.
|
|
326
|
+
*/
|
|
327
|
+
async loadElectionAnalysis() {
|
|
328
|
+
const [forecastRows, scenarioRows] = await Promise.all([
|
|
329
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.electionForecast.local),
|
|
330
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.coalitionScenarios.local)
|
|
331
|
+
]);
|
|
332
|
+
const toFiniteNumber = (value) => {
|
|
333
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
334
|
+
return value;
|
|
335
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
336
|
+
const num = Number(value);
|
|
337
|
+
if (Number.isFinite(num))
|
|
338
|
+
return num;
|
|
339
|
+
}
|
|
340
|
+
return undefined;
|
|
341
|
+
};
|
|
342
|
+
const toBoolean = (value) => {
|
|
343
|
+
if (typeof value === 'boolean')
|
|
344
|
+
return value;
|
|
345
|
+
if (typeof value === 'string') {
|
|
346
|
+
const normalized = value.trim().toLowerCase();
|
|
347
|
+
if (normalized === 'true')
|
|
348
|
+
return true;
|
|
349
|
+
if (normalized === 'false')
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
return undefined;
|
|
353
|
+
};
|
|
354
|
+
const parties = forecastRows.flatMap(r => {
|
|
355
|
+
const name = String(r.name ?? '').trim();
|
|
356
|
+
const currentSeats = toFiniteNumber(r.currentSeats);
|
|
357
|
+
const predictedSeats = toFiniteNumber(r.predictedSeats);
|
|
358
|
+
const change = toFiniteNumber(r.change);
|
|
359
|
+
const voteShare = toFiniteNumber(r.voteShare);
|
|
360
|
+
if (!name || currentSeats === undefined || predictedSeats === undefined || change === undefined || voteShare === undefined) {
|
|
361
|
+
return [];
|
|
362
|
+
}
|
|
363
|
+
const confidenceMin = toFiniteNumber(r.confidenceMin);
|
|
364
|
+
const confidenceMax = toFiniteNumber(r.confidenceMax);
|
|
365
|
+
return [{
|
|
366
|
+
name,
|
|
367
|
+
currentSeats,
|
|
368
|
+
predictedSeats,
|
|
369
|
+
change,
|
|
370
|
+
voteShare,
|
|
371
|
+
confidenceInterval: confidenceMin !== undefined && confidenceMax !== undefined
|
|
372
|
+
? { min: confidenceMin, max: confidenceMax }
|
|
373
|
+
: undefined
|
|
374
|
+
}];
|
|
375
|
+
});
|
|
376
|
+
const coalitionScenarios = scenarioRows.flatMap(r => {
|
|
377
|
+
const name = String(r.name ?? '').trim();
|
|
378
|
+
const probability = toFiniteNumber(r.probability);
|
|
379
|
+
const totalSeats = toFiniteNumber(r.totalSeats);
|
|
380
|
+
const majority = toBoolean(r.majority);
|
|
381
|
+
const riskLevel = String(r.riskLevel ?? '').trim();
|
|
382
|
+
const composition = String(r.composition ?? '')
|
|
383
|
+
.split(',')
|
|
384
|
+
.map(s => s.trim())
|
|
385
|
+
.filter(Boolean);
|
|
386
|
+
if (!name ||
|
|
387
|
+
probability === undefined ||
|
|
388
|
+
totalSeats === undefined ||
|
|
389
|
+
majority === undefined ||
|
|
390
|
+
!riskLevel ||
|
|
391
|
+
composition.length === 0) {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
return [{
|
|
395
|
+
name,
|
|
396
|
+
probability,
|
|
397
|
+
composition,
|
|
398
|
+
totalSeats,
|
|
399
|
+
majority,
|
|
400
|
+
riskLevel
|
|
401
|
+
}];
|
|
402
|
+
});
|
|
403
|
+
return {
|
|
404
|
+
forecast: { parties },
|
|
405
|
+
coalitionScenarios,
|
|
406
|
+
keyFactors: [
|
|
407
|
+
'Economic conditions',
|
|
408
|
+
'Immigration policy',
|
|
409
|
+
'Climate change priorities',
|
|
410
|
+
'Healthcare reform',
|
|
411
|
+
'NATO membership impact'
|
|
412
|
+
],
|
|
413
|
+
electionDate: '2026-09-13'
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Build party performance from CSV sources.
|
|
418
|
+
* Replaces party-performance.json.
|
|
419
|
+
*/
|
|
420
|
+
async loadPartyPerformance() {
|
|
421
|
+
const [performance, metrics, momentum] = await Promise.all([
|
|
422
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.partyPerformance.local),
|
|
423
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.partyMetrics.local),
|
|
424
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.partyMomentum.local)
|
|
425
|
+
]);
|
|
426
|
+
// Only include real riksdag parties
|
|
427
|
+
const riksdagParties = CIADataLoader.RIKSDAG_PARTIES;
|
|
428
|
+
const activePerformance = performance.filter(p => riksdagParties.includes(p.party));
|
|
429
|
+
// Build a lookup from the detailed metrics
|
|
430
|
+
const metricsMap = {};
|
|
431
|
+
metrics.forEach(m => {
|
|
432
|
+
if (riksdagParties.includes(m.party)) {
|
|
433
|
+
metricsMap[m.party] = m;
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
// Get latest momentum per party
|
|
437
|
+
const latestMomentum = {};
|
|
438
|
+
momentum
|
|
439
|
+
.filter(m => riksdagParties.includes(m.party))
|
|
440
|
+
.forEach(m => {
|
|
441
|
+
const party = m.party;
|
|
442
|
+
if (!latestMomentum[party] ||
|
|
443
|
+
m.year > latestMomentum[party].year ||
|
|
444
|
+
(m.year === latestMomentum[party].year &&
|
|
445
|
+
m.quarter > latestMomentum[party].quarter)) {
|
|
446
|
+
latestMomentum[party] = m;
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
// Known seat counts (from 2022 election results)
|
|
450
|
+
const seatMap = {
|
|
451
|
+
S: 107, SD: 73, M: 68, C: 24, V: 24, KD: 19, L: 16, MP: 18
|
|
452
|
+
};
|
|
453
|
+
const parties = activePerformance.map(p => {
|
|
454
|
+
const party = p.party;
|
|
455
|
+
const m = metricsMap[party] || {};
|
|
456
|
+
const mom = latestMomentum[party] || {};
|
|
457
|
+
return {
|
|
458
|
+
id: party,
|
|
459
|
+
partyName: p.party_name || party,
|
|
460
|
+
shortName: party,
|
|
461
|
+
metrics: {
|
|
462
|
+
seats: seatMap[party] || 0,
|
|
463
|
+
voteShare: 0,
|
|
464
|
+
memberCount: p.active_members || 0,
|
|
465
|
+
documentsAuthored: p.documents_last_year || 0,
|
|
466
|
+
motionsSubmitted: p.motions_last_year || 0,
|
|
467
|
+
successRate: m.avg_win_rate || 0
|
|
468
|
+
},
|
|
469
|
+
voting: {
|
|
470
|
+
totalVotes: m.total_votes_last_year || 0,
|
|
471
|
+
cohesionScore: m.avg_participation_rate || 0,
|
|
472
|
+
rebellionRate: m.avg_rebel_rate || 0
|
|
473
|
+
},
|
|
474
|
+
trends: {
|
|
475
|
+
supportTrend: (mom.trend_direction || 'stable').toLowerCase(),
|
|
476
|
+
activityTrend: (mom.stability_classification || 'stable').toLowerCase(),
|
|
477
|
+
performanceLevel: m.performance_level || p.performance_level || ''
|
|
478
|
+
},
|
|
479
|
+
_source: 'csv'
|
|
480
|
+
};
|
|
481
|
+
});
|
|
482
|
+
// Sort by seats descending
|
|
483
|
+
parties.sort((a, b) => (b.metrics.seats || 0) - (a.metrics.seats || 0));
|
|
484
|
+
return {
|
|
485
|
+
title: 'Party Performance Dashboard',
|
|
486
|
+
description: 'Live party data from CIA PostgreSQL database exports',
|
|
487
|
+
lastUpdated: new Date().toISOString(),
|
|
488
|
+
parties,
|
|
489
|
+
_source: 'csv'
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Build top 10 influential MPs from CSV sources.
|
|
494
|
+
* Replaces top10-influential-mps.json.
|
|
495
|
+
*/
|
|
496
|
+
async loadTop10Influential() {
|
|
497
|
+
const [influence, riskSummary] = await Promise.all([
|
|
498
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.influenceMetrics.local),
|
|
499
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.riskSummary.local)
|
|
500
|
+
]);
|
|
501
|
+
// Build risk lookup by person_id
|
|
502
|
+
const riskMap = {};
|
|
503
|
+
riskSummary.forEach(r => {
|
|
504
|
+
riskMap[r.person_id] = r;
|
|
505
|
+
});
|
|
506
|
+
// Sort by network_connections descending, take top 10
|
|
507
|
+
const sorted = [...influence]
|
|
508
|
+
.filter(mp => mp.network_connections > 0)
|
|
509
|
+
.sort((a, b) => (b.network_connections || 0) - (a.network_connections || 0))
|
|
510
|
+
.slice(0, 10);
|
|
511
|
+
const rankings = sorted.map((mp, idx) => {
|
|
512
|
+
const risk = riskMap[mp.person_id] || {};
|
|
513
|
+
return {
|
|
514
|
+
rank: idx + 1,
|
|
515
|
+
id: String(mp.person_id),
|
|
516
|
+
firstName: mp.first_name || '',
|
|
517
|
+
lastName: mp.last_name || '',
|
|
518
|
+
party: mp.party || '',
|
|
519
|
+
role: mp.influence_classification
|
|
520
|
+
? mp.influence_classification
|
|
521
|
+
.replace(/_/g, ' ')
|
|
522
|
+
.toLowerCase()
|
|
523
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
524
|
+
: '',
|
|
525
|
+
influenceScore: mp.network_connections || 0,
|
|
526
|
+
networkConnections: mp.network_connections || 0,
|
|
527
|
+
brokerClassification: mp.broker_classification || '',
|
|
528
|
+
riskLevel: risk.risk_level || '',
|
|
529
|
+
riskScore: risk.risk_score || 0,
|
|
530
|
+
_source: 'csv'
|
|
531
|
+
};
|
|
532
|
+
});
|
|
533
|
+
return {
|
|
534
|
+
title: 'Top 10 Most Influential MPs',
|
|
535
|
+
description: 'Network analysis from CIA politician influence metrics view',
|
|
536
|
+
lastUpdated: new Date().toISOString(),
|
|
537
|
+
methodology: 'Ranked by network_connections from view_riksdagen_politician_influence_metrics',
|
|
538
|
+
rankings,
|
|
539
|
+
_source: 'csv'
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Build committee network from CSV sources.
|
|
544
|
+
* Replaces committee-network.json.
|
|
545
|
+
* Filters out INACTIVE committees and deduplicates by name.
|
|
546
|
+
*/
|
|
547
|
+
async loadCommitteeNetwork() {
|
|
548
|
+
const [productivity, activity] = await Promise.all([
|
|
549
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.committeeProductivity.local),
|
|
550
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.committeeActivity.local)
|
|
551
|
+
]);
|
|
552
|
+
// Build activity lookup by org code
|
|
553
|
+
const activityMap = {};
|
|
554
|
+
activity.forEach(a => {
|
|
555
|
+
activityMap[a.org] = a.document_count || 0;
|
|
556
|
+
});
|
|
557
|
+
// Use class-level committee name-to-org-code mapping
|
|
558
|
+
const nameToOrgCode = CIADataLoader.COMMITTEE_ORG_CODES;
|
|
559
|
+
// Deduplicate committees by name, keeping the entry with the most data
|
|
560
|
+
const bestByName = {};
|
|
561
|
+
productivity.forEach(c => {
|
|
562
|
+
const name = c.committee_name;
|
|
563
|
+
if (!name)
|
|
564
|
+
return;
|
|
565
|
+
const existing = bestByName[name];
|
|
566
|
+
if (!existing || c.total_documents > existing.total_documents ||
|
|
567
|
+
(c.total_documents === existing.total_documents &&
|
|
568
|
+
c.total_members > existing.total_members)) {
|
|
569
|
+
bestByName[name] = c;
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
// Normalize committee metrics first so filtering and rendering use one consistent source.
|
|
573
|
+
const committees = Object.values(bestByName)
|
|
574
|
+
.map(c => {
|
|
575
|
+
const name = c.committee_name;
|
|
576
|
+
const code = nameToOrgCode[name] || name.substring(0, 3).toUpperCase();
|
|
577
|
+
const totalDocuments = c.total_documents || 0;
|
|
578
|
+
const activityDocs = activityMap[code] || 0;
|
|
579
|
+
const documentsProcessed = Math.max(totalDocuments, activityDocs);
|
|
580
|
+
const productivityLevel = c.productivity_level || '';
|
|
581
|
+
return {
|
|
582
|
+
id: code,
|
|
583
|
+
name,
|
|
584
|
+
memberCount: c.total_members || 0,
|
|
585
|
+
influenceScore: c.docs_per_member
|
|
586
|
+
? Math.round(c.docs_per_member * 100)
|
|
587
|
+
: 0,
|
|
588
|
+
documentsProcessed,
|
|
589
|
+
productivityLevel,
|
|
590
|
+
meetingsPerYear: documentsProcessed > 0
|
|
591
|
+
? Math.round(documentsProcessed / CIADataLoader.COMMITTEE_DOCS_PER_MEETING_ESTIMATE)
|
|
592
|
+
: 0,
|
|
593
|
+
keyIssues: [productivityLevel || 'N/A'],
|
|
594
|
+
_source: 'csv'
|
|
595
|
+
};
|
|
596
|
+
})
|
|
597
|
+
.filter(c => {
|
|
598
|
+
// Keep real committees only; skip generic node and inactive rows with no measured output.
|
|
599
|
+
return (c.name !== 'Riksdagen' &&
|
|
600
|
+
c.memberCount > 0 &&
|
|
601
|
+
(c.productivityLevel !== 'INACTIVE' || c.documentsProcessed > 0));
|
|
602
|
+
})
|
|
603
|
+
.sort((a, b) => b.documentsProcessed - a.documentsProcessed);
|
|
604
|
+
// Build simple network graph from committees
|
|
605
|
+
const nodes = committees.map(c => ({
|
|
606
|
+
id: c.id,
|
|
607
|
+
name: c.name,
|
|
608
|
+
size: c.influenceScore
|
|
609
|
+
}));
|
|
610
|
+
// Create edges between committees that share similar productivity levels
|
|
611
|
+
const edges = [];
|
|
612
|
+
for (let i = 0; i < committees.length; i++) {
|
|
613
|
+
for (let j = i + 1; j < committees.length && edges.length < 10; j++) {
|
|
614
|
+
if (committees[i].productivityLevel === committees[j].productivityLevel &&
|
|
615
|
+
committees[i].productivityLevel !== 'INACTIVE') {
|
|
616
|
+
edges.push({
|
|
617
|
+
source: committees[i].id,
|
|
618
|
+
target: committees[j].id,
|
|
619
|
+
weight: Math.min(committees[i].documentsProcessed, committees[j].documentsProcessed),
|
|
620
|
+
type: 'productivity_similarity'
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return {
|
|
626
|
+
title: 'Committee Network Analysis',
|
|
627
|
+
description: 'Committee data from CIA committee productivity view',
|
|
628
|
+
lastUpdated: new Date().toISOString(),
|
|
629
|
+
committees,
|
|
630
|
+
networkGraph: { nodes, edges },
|
|
631
|
+
crossCommitteeMPs: [],
|
|
632
|
+
_source: 'csv'
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Build voting patterns from CSV sources.
|
|
637
|
+
* Uses real coalition alignment data for the agreement matrix
|
|
638
|
+
* and party effectiveness trends for win rates.
|
|
639
|
+
*/
|
|
640
|
+
async loadVotingPatterns() {
|
|
641
|
+
const [coalitionAlignment, effectiveness, riskByParty] = await Promise.all([
|
|
642
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.coalitionAlignment.local),
|
|
643
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.partyEffectiveness.local),
|
|
644
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.riskByParty.local)
|
|
645
|
+
]);
|
|
646
|
+
const riksdagParties = CIADataLoader.RIKSDAG_PARTIES;
|
|
647
|
+
const labels = riksdagParties;
|
|
648
|
+
const partyNames = [
|
|
649
|
+
'Social Democrats', 'Moderates', 'Sweden Democrats', 'Centre',
|
|
650
|
+
'Left', 'Christian Democrats', 'Liberals', 'Green'
|
|
651
|
+
];
|
|
652
|
+
// Build agreement matrix from real coalition alignment data
|
|
653
|
+
const alignmentLookup = {};
|
|
654
|
+
coalitionAlignment
|
|
655
|
+
.filter(r => riksdagParties.includes(r.party1) && riksdagParties.includes(r.party2))
|
|
656
|
+
.forEach(r => {
|
|
657
|
+
const key1 = `${r.party1}:${r.party2}`;
|
|
658
|
+
const key2 = `${r.party2}:${r.party1}`;
|
|
659
|
+
const rate = Math.round((r.alignment_rate || 0) * 100);
|
|
660
|
+
alignmentLookup[key1] = rate;
|
|
661
|
+
alignmentLookup[key2] = rate;
|
|
662
|
+
});
|
|
663
|
+
// If real alignment data is available, use it; otherwise fall back to effectiveness-based
|
|
664
|
+
const hasAlignmentData = Object.keys(alignmentLookup).length > 0;
|
|
665
|
+
let agreementMatrix;
|
|
666
|
+
if (hasAlignmentData) {
|
|
667
|
+
agreementMatrix = labels.map(p1 => labels.map(p2 => {
|
|
668
|
+
if (p1 === p2)
|
|
669
|
+
return 100;
|
|
670
|
+
return alignmentLookup[`${p1}:${p2}`] ?? 50;
|
|
671
|
+
}));
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
// Fallback: build from win rate similarity
|
|
675
|
+
const latestWinRate = {};
|
|
676
|
+
effectiveness
|
|
677
|
+
.filter(e => riksdagParties.includes(e.party))
|
|
678
|
+
.forEach(e => {
|
|
679
|
+
const party = e.party;
|
|
680
|
+
if (!latestWinRate[party] ||
|
|
681
|
+
e.year > latestWinRate[party].year ||
|
|
682
|
+
(e.year === latestWinRate[party].year &&
|
|
683
|
+
e.quarter > latestWinRate[party].quarter)) {
|
|
684
|
+
latestWinRate[party] = e;
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
agreementMatrix = labels.map(p1 => {
|
|
688
|
+
const wr1 = latestWinRate[p1] ? latestWinRate[p1].avg_win_rate : 50;
|
|
689
|
+
return labels.map(p2 => {
|
|
690
|
+
if (p1 === p2)
|
|
691
|
+
return 100;
|
|
692
|
+
const wr2 = latestWinRate[p2] ? latestWinRate[p2].avg_win_rate : 50;
|
|
693
|
+
return Math.max(0, Math.round(100 - Math.abs(wr1 - wr2)));
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
// Rebellion tracking from risk data (HIGH risk ~ rebellious)
|
|
698
|
+
const rebellionTracking = riksdagParties
|
|
699
|
+
.map(party => {
|
|
700
|
+
const partyRisks = riskByParty.filter(r => r.party === party);
|
|
701
|
+
const highRisk = partyRisks.find(r => r.risk_level === 'HIGH');
|
|
702
|
+
const total = partyRisks.reduce((s, r) => s + (r.politician_count || 0), 0);
|
|
703
|
+
const highCount = highRisk ? highRisk.politician_count : 0;
|
|
704
|
+
const rebellionRate = total > 0 ? Math.round((highCount / total) * 100 * 10) / 10 : 0;
|
|
705
|
+
return {
|
|
706
|
+
party,
|
|
707
|
+
rebellionRate,
|
|
708
|
+
trend: rebellionRate > 25 ? 'increasing' : rebellionRate > 15 ? 'stable' : 'decreasing'
|
|
709
|
+
};
|
|
710
|
+
})
|
|
711
|
+
.filter(r => r.rebellionRate > 0);
|
|
712
|
+
return {
|
|
713
|
+
title: 'Voting Patterns Analysis',
|
|
714
|
+
description: hasAlignmentData
|
|
715
|
+
? 'Real coalition alignment data from CIA voting analysis'
|
|
716
|
+
: 'Derived from CIA party effectiveness trends and risk data',
|
|
717
|
+
lastUpdated: new Date().toISOString(),
|
|
718
|
+
analysisPeriod: '2022-2026',
|
|
719
|
+
votingMatrix: { labels, partyNames, agreementMatrix },
|
|
720
|
+
keyIssues: [],
|
|
721
|
+
rebellionTracking,
|
|
722
|
+
_source: 'csv'
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Build ministry dashboard from CSV sources.
|
|
727
|
+
*/
|
|
728
|
+
async loadMinistryDashboard() {
|
|
729
|
+
const rows = await this.loadCSV(CIADataLoader.CSV_SOURCES.ministryEffectiveness.local);
|
|
730
|
+
const ministries = rows
|
|
731
|
+
.filter(r => r.ministry_name && r.documents_produced > 0)
|
|
732
|
+
.map(r => ({
|
|
733
|
+
name: r.ministry_name,
|
|
734
|
+
effectiveness: r.effectiveness_assessment || '',
|
|
735
|
+
documentsProduced: r.documents_produced || 0,
|
|
736
|
+
governmentBills: r.government_bills || 0,
|
|
737
|
+
year: r.year || 0,
|
|
738
|
+
quarter: r.quarter || 0
|
|
739
|
+
}))
|
|
740
|
+
.sort((a, b) => b.documentsProduced - a.documentsProduced);
|
|
741
|
+
return {
|
|
742
|
+
title: 'Ministry Performance',
|
|
743
|
+
description: 'Ministry effectiveness from CIA database exports',
|
|
744
|
+
lastUpdated: new Date().toISOString(),
|
|
745
|
+
ministries,
|
|
746
|
+
_source: 'csv'
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Build demographics dashboard from CSV sources.
|
|
751
|
+
*/
|
|
752
|
+
async loadDemographics() {
|
|
753
|
+
const riksdagParties = CIADataLoader.RIKSDAG_PARTIES;
|
|
754
|
+
const [genderRows, experienceRows] = await Promise.all([
|
|
755
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.genderByParty.local),
|
|
756
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.experienceByParty.local)
|
|
757
|
+
]);
|
|
758
|
+
const genderByParty = genderRows
|
|
759
|
+
.filter(r => riksdagParties.includes(r.party))
|
|
760
|
+
.map(r => ({
|
|
761
|
+
party: r.party,
|
|
762
|
+
gender: r.gender,
|
|
763
|
+
count: r.count || 0
|
|
764
|
+
}));
|
|
765
|
+
const experienceByParty = experienceRows
|
|
766
|
+
.filter(r => riksdagParties.includes(r.party))
|
|
767
|
+
.map(r => ({
|
|
768
|
+
party: r.party,
|
|
769
|
+
experienceLevel: r.experience_level || '',
|
|
770
|
+
politicianCount: r.politician_count || 0
|
|
771
|
+
}));
|
|
772
|
+
return {
|
|
773
|
+
title: 'Parliamentary Demographics',
|
|
774
|
+
description: 'Gender and experience distribution from CIA database exports',
|
|
775
|
+
lastUpdated: new Date().toISOString(),
|
|
776
|
+
genderByParty,
|
|
777
|
+
experienceByParty,
|
|
778
|
+
_source: 'csv'
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
* Build document activity dashboard from CSV sources.
|
|
783
|
+
*/
|
|
784
|
+
async loadDocumentActivity() {
|
|
785
|
+
const [docTypeRows, decisionRows] = await Promise.all([
|
|
786
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.annualDocTypes.local),
|
|
787
|
+
this.loadCSV(CIADataLoader.CSV_SOURCES.decisionTrends.local)
|
|
788
|
+
]);
|
|
789
|
+
const documentTypes = docTypeRows
|
|
790
|
+
.filter(r => r.doc_count > 0)
|
|
791
|
+
.map(r => ({
|
|
792
|
+
year: r.year || 0,
|
|
793
|
+
documentType: r.document_type || '',
|
|
794
|
+
docCount: r.doc_count || 0
|
|
795
|
+
}));
|
|
796
|
+
const decisionTrends = decisionRows
|
|
797
|
+
.filter(r => r.decision_count > 0)
|
|
798
|
+
.map(r => ({
|
|
799
|
+
year: r.year || 0,
|
|
800
|
+
month: r.month || 0,
|
|
801
|
+
decisionCount: r.decision_count || 0,
|
|
802
|
+
approvedDecisions: r.approved_decisions || 0,
|
|
803
|
+
rejectedDecisions: r.rejected_decisions || 0,
|
|
804
|
+
approvalRate: r.approval_rate || 0
|
|
805
|
+
}));
|
|
806
|
+
return {
|
|
807
|
+
title: 'Parliamentary Document Activity',
|
|
808
|
+
description: 'Document production and decision trends from CIA database exports',
|
|
809
|
+
lastUpdated: new Date().toISOString(),
|
|
810
|
+
documentTypes,
|
|
811
|
+
decisionTrends,
|
|
812
|
+
_source: 'csv'
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Build risk evolution dashboard from CSV sources.
|
|
817
|
+
*/
|
|
818
|
+
async loadRiskEvolution() {
|
|
819
|
+
const rows = await this.loadCSV(CIADataLoader.CSV_SOURCES.riskEvolution.local);
|
|
820
|
+
const entries = rows
|
|
821
|
+
.filter(r => r.politician_count > 0)
|
|
822
|
+
.map(r => ({
|
|
823
|
+
period: r.assessment_period || '',
|
|
824
|
+
severity: r.risk_severity || '',
|
|
825
|
+
politicianCount: r.politician_count || 0,
|
|
826
|
+
avgRiskScore: r.avg_risk_score || 0
|
|
827
|
+
}));
|
|
828
|
+
return {
|
|
829
|
+
title: 'Risk Score Evolution',
|
|
830
|
+
description: 'Temporal risk score changes from CIA database exports',
|
|
831
|
+
lastUpdated: new Date().toISOString(),
|
|
832
|
+
entries,
|
|
833
|
+
_source: 'csv'
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
/**
|
|
837
|
+
* Load all data in parallel.
|
|
838
|
+
* @returns Object with all data
|
|
839
|
+
*/
|
|
840
|
+
async loadAll() {
|
|
841
|
+
const [overview, election, partyPerf, top10, committees, votingPatterns, ministry, demographics, documentActivity, riskEvolution] = await Promise.all([
|
|
842
|
+
this.loadOverviewDashboard(),
|
|
843
|
+
this.loadElectionAnalysis(),
|
|
844
|
+
this.loadPartyPerformance(),
|
|
845
|
+
this.loadTop10Influential(),
|
|
846
|
+
this.loadCommitteeNetwork(),
|
|
847
|
+
this.loadVotingPatterns(),
|
|
848
|
+
this.loadMinistryDashboard(),
|
|
849
|
+
this.loadDemographics(),
|
|
850
|
+
this.loadDocumentActivity(),
|
|
851
|
+
this.loadRiskEvolution()
|
|
852
|
+
]);
|
|
853
|
+
return {
|
|
854
|
+
overview,
|
|
855
|
+
election,
|
|
856
|
+
partyPerf,
|
|
857
|
+
top10,
|
|
858
|
+
committees,
|
|
859
|
+
votingPatterns,
|
|
860
|
+
ministry,
|
|
861
|
+
demographics,
|
|
862
|
+
documentActivity,
|
|
863
|
+
riskEvolution
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
//# sourceMappingURL=data-loader.js.map
|