riksdagsmonitor 0.8.12 → 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.
Files changed (779) hide show
  1. package/dist/lib/cia/dashboard-init.d.ts +26 -0
  2. package/dist/lib/cia/dashboard-init.d.ts.map +1 -0
  3. package/dist/lib/cia/dashboard-init.js +108 -0
  4. package/dist/lib/cia/dashboard-init.js.map +1 -0
  5. package/dist/lib/cia/data-loader.d.ts +408 -0
  6. package/dist/lib/cia/data-loader.d.ts.map +1 -0
  7. package/dist/lib/cia/data-loader.js +867 -0
  8. package/dist/lib/cia/data-loader.js.map +1 -0
  9. package/dist/lib/cia/election-predictions.d.ts +78 -0
  10. package/dist/lib/cia/election-predictions.d.ts.map +1 -0
  11. package/dist/lib/cia/election-predictions.js +259 -0
  12. package/dist/lib/cia/election-predictions.js.map +1 -0
  13. package/dist/lib/cia/i18n-translations.d.ts +111 -0
  14. package/dist/lib/cia/i18n-translations.d.ts.map +1 -0
  15. package/dist/lib/cia/i18n-translations.js +619 -0
  16. package/dist/lib/cia/i18n-translations.js.map +1 -0
  17. package/dist/lib/cia/visualizations.d.ts +64 -0
  18. package/dist/lib/cia/visualizations.d.ts.map +1 -0
  19. package/dist/lib/cia/visualizations.js +662 -0
  20. package/dist/lib/cia/visualizations.js.map +1 -0
  21. package/dist/lib/dashboards/anomaly-detection.d.ts +44 -0
  22. package/dist/lib/dashboards/anomaly-detection.d.ts.map +1 -0
  23. package/dist/lib/dashboards/anomaly-detection.js +1017 -0
  24. package/dist/lib/dashboards/anomaly-detection.js.map +1 -0
  25. package/dist/lib/dashboards/coalition-dashboard.d.ts +36 -0
  26. package/dist/lib/dashboards/coalition-dashboard.d.ts.map +1 -0
  27. package/dist/lib/dashboards/coalition-dashboard.js +629 -0
  28. package/dist/lib/dashboards/coalition-dashboard.js.map +1 -0
  29. package/dist/lib/dashboards/coalition-loader.d.ts +43 -0
  30. package/dist/lib/dashboards/coalition-loader.d.ts.map +1 -0
  31. package/dist/lib/dashboards/coalition-loader.js +665 -0
  32. package/dist/lib/dashboards/coalition-loader.js.map +1 -0
  33. package/dist/lib/dashboards/committees-dashboard.d.ts +23 -0
  34. package/dist/lib/dashboards/committees-dashboard.d.ts.map +1 -0
  35. package/dist/lib/dashboards/committees-dashboard.js +886 -0
  36. package/dist/lib/dashboards/committees-dashboard.js.map +1 -0
  37. package/dist/lib/dashboards/election-cycle.d.ts +62 -0
  38. package/dist/lib/dashboards/election-cycle.d.ts.map +1 -0
  39. package/dist/lib/dashboards/election-cycle.js +484 -0
  40. package/dist/lib/dashboards/election-cycle.js.map +1 -0
  41. package/dist/lib/dashboards/ministry-dashboard.d.ts +46 -0
  42. package/dist/lib/dashboards/ministry-dashboard.d.ts.map +1 -0
  43. package/dist/lib/dashboards/ministry-dashboard.js +1114 -0
  44. package/dist/lib/dashboards/ministry-dashboard.js.map +1 -0
  45. package/dist/lib/dashboards/party-dashboard.d.ts +56 -0
  46. package/dist/lib/dashboards/party-dashboard.d.ts.map +1 -0
  47. package/dist/lib/dashboards/party-dashboard.js +981 -0
  48. package/dist/lib/dashboards/party-dashboard.js.map +1 -0
  49. package/dist/lib/dashboards/politician-dashboard.d.ts +41 -0
  50. package/dist/lib/dashboards/politician-dashboard.d.ts.map +1 -0
  51. package/dist/lib/dashboards/politician-dashboard.js +611 -0
  52. package/dist/lib/dashboards/politician-dashboard.js.map +1 -0
  53. package/dist/lib/dashboards/pre-election.d.ts +64 -0
  54. package/dist/lib/dashboards/pre-election.d.ts.map +1 -0
  55. package/dist/lib/dashboards/pre-election.js +604 -0
  56. package/dist/lib/dashboards/pre-election.js.map +1 -0
  57. package/dist/lib/dashboards/risk-dashboard.d.ts +37 -0
  58. package/dist/lib/dashboards/risk-dashboard.d.ts.map +1 -0
  59. package/dist/lib/dashboards/risk-dashboard.js +863 -0
  60. package/dist/lib/dashboards/risk-dashboard.js.map +1 -0
  61. package/dist/lib/dashboards/seasonal-patterns.d.ts +24 -0
  62. package/dist/lib/dashboards/seasonal-patterns.d.ts.map +1 -0
  63. package/dist/lib/dashboards/seasonal-patterns.js +535 -0
  64. package/dist/lib/dashboards/seasonal-patterns.js.map +1 -0
  65. package/dist/lib/dashboards/stats-loader.d.ts +35 -0
  66. package/dist/lib/dashboards/stats-loader.d.ts.map +1 -0
  67. package/dist/lib/dashboards/stats-loader.js +145 -0
  68. package/dist/lib/dashboards/stats-loader.js.map +1 -0
  69. package/dist/lib/shared/chart-factory.d.ts.map +1 -0
  70. package/dist/lib/shared/chart-factory.js.map +1 -0
  71. package/dist/lib/shared/data-loader.d.ts.map +1 -0
  72. package/dist/lib/shared/data-loader.js.map +1 -0
  73. package/dist/lib/shared/dom-utils.d.ts.map +1 -0
  74. package/dist/lib/shared/dom-utils.js.map +1 -0
  75. package/dist/lib/shared/error-boundary.d.ts.map +1 -0
  76. package/dist/lib/shared/error-boundary.js.map +1 -0
  77. package/dist/lib/shared/fallback-ui.d.ts.map +1 -0
  78. package/dist/lib/shared/fallback-ui.js.map +1 -0
  79. package/dist/lib/shared/index.d.ts.map +1 -0
  80. package/dist/lib/shared/index.js.map +1 -0
  81. package/dist/lib/shared/logger.d.ts.map +1 -0
  82. package/dist/lib/shared/logger.js.map +1 -0
  83. package/dist/lib/shared/register-globals.d.ts +14 -0
  84. package/dist/lib/shared/register-globals.d.ts.map +1 -0
  85. package/dist/lib/shared/register-globals.js +21 -0
  86. package/dist/lib/shared/register-globals.js.map +1 -0
  87. package/dist/lib/shared/theme.d.ts.map +1 -0
  88. package/dist/lib/shared/theme.js.map +1 -0
  89. package/dist/lib/shared/types.d.ts.map +1 -0
  90. package/dist/lib/shared/types.js.map +1 -0
  91. package/dist/lib/ui/back-to-top.d.ts +13 -0
  92. package/dist/lib/ui/back-to-top.d.ts.map +1 -0
  93. package/dist/lib/ui/back-to-top.js +48 -0
  94. package/dist/lib/ui/back-to-top.js.map +1 -0
  95. package/dist/scripts/ai-analysis/coalition-detector.d.ts +28 -0
  96. package/dist/scripts/ai-analysis/coalition-detector.d.ts.map +1 -0
  97. package/dist/scripts/ai-analysis/coalition-detector.js +242 -0
  98. package/dist/scripts/ai-analysis/coalition-detector.js.map +1 -0
  99. package/dist/scripts/ai-analysis/dashboard-analyzer.d.ts +73 -0
  100. package/dist/scripts/ai-analysis/dashboard-analyzer.d.ts.map +1 -0
  101. package/dist/scripts/ai-analysis/dashboard-analyzer.js +511 -0
  102. package/dist/scripts/ai-analysis/dashboard-analyzer.js.map +1 -0
  103. package/dist/scripts/ai-analysis/document-analyzer.d.ts +196 -0
  104. package/dist/scripts/ai-analysis/document-analyzer.d.ts.map +1 -0
  105. package/dist/scripts/ai-analysis/document-analyzer.js +1001 -0
  106. package/dist/scripts/ai-analysis/document-analyzer.js.map +1 -0
  107. package/dist/scripts/ai-analysis/domains/index.d.ts +15 -0
  108. package/dist/scripts/ai-analysis/domains/index.d.ts.map +1 -0
  109. package/dist/scripts/ai-analysis/domains/index.js +494 -0
  110. package/dist/scripts/ai-analysis/domains/index.js.map +1 -0
  111. package/dist/scripts/ai-analysis/helpers.d.ts +43 -0
  112. package/dist/scripts/ai-analysis/helpers.d.ts.map +1 -0
  113. package/dist/scripts/ai-analysis/helpers.js +79 -0
  114. package/dist/scripts/ai-analysis/helpers.js.map +1 -0
  115. package/dist/scripts/ai-analysis/index.d.ts +15 -0
  116. package/dist/scripts/ai-analysis/index.d.ts.map +1 -0
  117. package/dist/scripts/ai-analysis/index.js +14 -0
  118. package/dist/scripts/ai-analysis/index.js.map +1 -0
  119. package/dist/scripts/ai-analysis/pipeline.d.ts +41 -0
  120. package/dist/scripts/ai-analysis/pipeline.d.ts.map +1 -0
  121. package/dist/scripts/ai-analysis/pipeline.js +208 -0
  122. package/dist/scripts/ai-analysis/pipeline.js.map +1 -0
  123. package/dist/scripts/ai-analysis/political-significance.d.ts +63 -0
  124. package/dist/scripts/ai-analysis/political-significance.d.ts.map +1 -0
  125. package/dist/scripts/ai-analysis/political-significance.js +227 -0
  126. package/dist/scripts/ai-analysis/political-significance.js.map +1 -0
  127. package/dist/scripts/ai-analysis/quality-assessor.d.ts +104 -0
  128. package/dist/scripts/ai-analysis/quality-assessor.d.ts.map +1 -0
  129. package/dist/scripts/ai-analysis/quality-assessor.js +554 -0
  130. package/dist/scripts/ai-analysis/quality-assessor.js.map +1 -0
  131. package/dist/scripts/ai-analysis/swot/index.d.ts +56 -0
  132. package/dist/scripts/ai-analysis/swot/index.d.ts.map +1 -0
  133. package/dist/scripts/ai-analysis/swot/index.js +360 -0
  134. package/dist/scripts/ai-analysis/swot/index.js.map +1 -0
  135. package/dist/scripts/ai-analysis/swot/placeholders.d.ts +30 -0
  136. package/dist/scripts/ai-analysis/swot/placeholders.d.ts.map +1 -0
  137. package/dist/scripts/ai-analysis/swot/placeholders.js +381 -0
  138. package/dist/scripts/ai-analysis/swot/placeholders.js.map +1 -0
  139. package/dist/scripts/ai-analysis/types.d.ts +333 -0
  140. package/dist/scripts/ai-analysis/types.d.ts.map +1 -0
  141. package/dist/scripts/ai-analysis/types.js +19 -0
  142. package/dist/scripts/ai-analysis/types.js.map +1 -0
  143. package/dist/scripts/ai-analysis/visualisation/index.d.ts +15 -0
  144. package/dist/scripts/ai-analysis/visualisation/index.d.ts.map +1 -0
  145. package/dist/scripts/ai-analysis/visualisation/index.js +179 -0
  146. package/dist/scripts/ai-analysis/visualisation/index.js.map +1 -0
  147. package/dist/scripts/analysis-framework/cross-reference.d.ts +35 -0
  148. package/dist/scripts/analysis-framework/cross-reference.d.ts.map +1 -0
  149. package/dist/scripts/analysis-framework/cross-reference.js +290 -0
  150. package/dist/scripts/analysis-framework/cross-reference.js.map +1 -0
  151. package/dist/scripts/analysis-framework/index.d.ts +79 -0
  152. package/dist/scripts/analysis-framework/index.d.ts.map +1 -0
  153. package/dist/scripts/analysis-framework/index.js +133 -0
  154. package/dist/scripts/analysis-framework/index.js.map +1 -0
  155. package/dist/scripts/analysis-framework/lenses/citizen.d.ts +29 -0
  156. package/dist/scripts/analysis-framework/lenses/citizen.d.ts.map +1 -0
  157. package/dist/scripts/analysis-framework/lenses/citizen.js +220 -0
  158. package/dist/scripts/analysis-framework/lenses/citizen.js.map +1 -0
  159. package/dist/scripts/analysis-framework/lenses/economic.d.ts +29 -0
  160. package/dist/scripts/analysis-framework/lenses/economic.d.ts.map +1 -0
  161. package/dist/scripts/analysis-framework/lenses/economic.js +227 -0
  162. package/dist/scripts/analysis-framework/lenses/economic.js.map +1 -0
  163. package/dist/scripts/analysis-framework/lenses/government.d.ts +32 -0
  164. package/dist/scripts/analysis-framework/lenses/government.d.ts.map +1 -0
  165. package/dist/scripts/analysis-framework/lenses/government.js +265 -0
  166. package/dist/scripts/analysis-framework/lenses/government.js.map +1 -0
  167. package/dist/scripts/analysis-framework/lenses/international.d.ts +29 -0
  168. package/dist/scripts/analysis-framework/lenses/international.d.ts.map +1 -0
  169. package/dist/scripts/analysis-framework/lenses/international.js +248 -0
  170. package/dist/scripts/analysis-framework/lenses/international.js.map +1 -0
  171. package/dist/scripts/analysis-framework/lenses/media.d.ts +29 -0
  172. package/dist/scripts/analysis-framework/lenses/media.d.ts.map +1 -0
  173. package/dist/scripts/analysis-framework/lenses/media.js +211 -0
  174. package/dist/scripts/analysis-framework/lenses/media.js.map +1 -0
  175. package/dist/scripts/analysis-framework/lenses/opposition.d.ts +29 -0
  176. package/dist/scripts/analysis-framework/lenses/opposition.d.ts.map +1 -0
  177. package/dist/scripts/analysis-framework/lenses/opposition.js +234 -0
  178. package/dist/scripts/analysis-framework/lenses/opposition.js.map +1 -0
  179. package/dist/scripts/analysis-framework/methodology-types.d.ts +309 -0
  180. package/dist/scripts/analysis-framework/methodology-types.d.ts.map +1 -0
  181. package/dist/scripts/analysis-framework/methodology-types.js +38 -0
  182. package/dist/scripts/analysis-framework/methodology-types.js.map +1 -0
  183. package/dist/scripts/analysis-framework/political-classification.d.ts +58 -0
  184. package/dist/scripts/analysis-framework/political-classification.d.ts.map +1 -0
  185. package/dist/scripts/analysis-framework/political-classification.js +414 -0
  186. package/dist/scripts/analysis-framework/political-classification.js.map +1 -0
  187. package/dist/scripts/analysis-framework/political-risk-assessment.d.ts +74 -0
  188. package/dist/scripts/analysis-framework/political-risk-assessment.d.ts.map +1 -0
  189. package/dist/scripts/analysis-framework/political-risk-assessment.js +656 -0
  190. package/dist/scripts/analysis-framework/political-risk-assessment.js.map +1 -0
  191. package/dist/scripts/analysis-framework/political-threat-analysis.d.ts +65 -0
  192. package/dist/scripts/analysis-framework/political-threat-analysis.d.ts.map +1 -0
  193. package/dist/scripts/analysis-framework/political-threat-analysis.js +553 -0
  194. package/dist/scripts/analysis-framework/political-threat-analysis.js.map +1 -0
  195. package/dist/scripts/analysis-framework/significance-scorer.d.ts +62 -0
  196. package/dist/scripts/analysis-framework/significance-scorer.d.ts.map +1 -0
  197. package/dist/scripts/analysis-framework/significance-scorer.js +196 -0
  198. package/dist/scripts/analysis-framework/significance-scorer.js.map +1 -0
  199. package/dist/scripts/analysis-framework/types.d.ts +138 -0
  200. package/dist/scripts/analysis-framework/types.d.ts.map +1 -0
  201. package/dist/scripts/analysis-framework/types.js +12 -0
  202. package/dist/scripts/analysis-framework/types.js.map +1 -0
  203. package/dist/scripts/analysis-reader.d.ts +240 -0
  204. package/dist/scripts/analysis-reader.d.ts.map +1 -0
  205. package/dist/scripts/analysis-reader.js +495 -0
  206. package/dist/scripts/analysis-reader.js.map +1 -0
  207. package/dist/scripts/article-quality-enhancer.d.ts +148 -0
  208. package/dist/scripts/article-quality-enhancer.d.ts.map +1 -0
  209. package/dist/scripts/article-quality-enhancer.js +430 -0
  210. package/dist/scripts/article-quality-enhancer.js.map +1 -0
  211. package/dist/scripts/article-template/constants.d.ts +104 -0
  212. package/dist/scripts/article-template/constants.d.ts.map +1 -0
  213. package/dist/scripts/article-template/constants.js +225 -0
  214. package/dist/scripts/article-template/constants.js.map +1 -0
  215. package/dist/scripts/article-template/helpers.d.ts +83 -0
  216. package/dist/scripts/article-template/helpers.d.ts.map +1 -0
  217. package/dist/scripts/article-template/helpers.js +236 -0
  218. package/dist/scripts/article-template/helpers.js.map +1 -0
  219. package/dist/scripts/article-template/index.d.ts +39 -0
  220. package/dist/scripts/article-template/index.d.ts.map +1 -0
  221. package/dist/scripts/article-template/index.js +37 -0
  222. package/dist/scripts/article-template/index.js.map +1 -0
  223. package/dist/scripts/article-template/registry.d.ts +64 -0
  224. package/dist/scripts/article-template/registry.d.ts.map +1 -0
  225. package/dist/scripts/article-template/registry.js +405 -0
  226. package/dist/scripts/article-template/registry.js.map +1 -0
  227. package/dist/scripts/article-template/template.d.ts +18 -0
  228. package/dist/scripts/article-template/template.d.ts.map +1 -0
  229. package/dist/scripts/article-template/template.js +359 -0
  230. package/dist/scripts/article-template/template.js.map +1 -0
  231. package/dist/scripts/article-template/types.d.ts +90 -0
  232. package/dist/scripts/article-template/types.d.ts.map +1 -0
  233. package/dist/scripts/article-template/types.js +96 -0
  234. package/dist/scripts/article-template/types.js.map +1 -0
  235. package/dist/scripts/article-template.d.ts +18 -0
  236. package/dist/scripts/article-template.d.ts.map +1 -0
  237. package/dist/scripts/article-template.js +18 -0
  238. package/dist/scripts/article-template.js.map +1 -0
  239. package/dist/scripts/catalog-downloaded-data.d.ts +66 -0
  240. package/dist/scripts/catalog-downloaded-data.d.ts.map +1 -0
  241. package/dist/scripts/catalog-downloaded-data.js +239 -0
  242. package/dist/scripts/catalog-downloaded-data.js.map +1 -0
  243. package/dist/scripts/check-cia-schema-updates.d.ts +186 -0
  244. package/dist/scripts/check-cia-schema-updates.d.ts.map +1 -0
  245. package/dist/scripts/check-cia-schema-updates.js +363 -0
  246. package/dist/scripts/check-cia-schema-updates.js.map +1 -0
  247. package/dist/scripts/data-transformers/calendar.d.ts +16 -0
  248. package/dist/scripts/data-transformers/calendar.d.ts.map +1 -0
  249. package/dist/scripts/data-transformers/calendar.js +137 -0
  250. package/dist/scripts/data-transformers/calendar.js.map +1 -0
  251. package/dist/scripts/data-transformers/constants/committee-names.d.ts +15 -0
  252. package/dist/scripts/data-transformers/constants/committee-names.d.ts.map +1 -0
  253. package/dist/scripts/data-transformers/constants/committee-names.js +30 -0
  254. package/dist/scripts/data-transformers/constants/committee-names.js.map +1 -0
  255. package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts +11 -0
  256. package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts.map +1 -0
  257. package/dist/scripts/data-transformers/constants/content-labels-part1.js +900 -0
  258. package/dist/scripts/data-transformers/constants/content-labels-part1.js.map +1 -0
  259. package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts +11 -0
  260. package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts.map +1 -0
  261. package/dist/scripts/data-transformers/constants/content-labels-part2.js +900 -0
  262. package/dist/scripts/data-transformers/constants/content-labels-part2.js.map +1 -0
  263. package/dist/scripts/data-transformers/constants/content-labels.d.ts +13 -0
  264. package/dist/scripts/data-transformers/constants/content-labels.d.ts.map +1 -0
  265. package/dist/scripts/data-transformers/constants/content-labels.js +18 -0
  266. package/dist/scripts/data-transformers/constants/content-labels.js.map +1 -0
  267. package/dist/scripts/data-transformers/constants/index.d.ts +15 -0
  268. package/dist/scripts/data-transformers/constants/index.d.ts.map +1 -0
  269. package/dist/scripts/data-transformers/constants/index.js +15 -0
  270. package/dist/scripts/data-transformers/constants/index.js.map +1 -0
  271. package/dist/scripts/data-transformers/constants/locale-map.d.ts +13 -0
  272. package/dist/scripts/data-transformers/constants/locale-map.d.ts.map +1 -0
  273. package/dist/scripts/data-transformers/constants/locale-map.js +17 -0
  274. package/dist/scripts/data-transformers/constants/locale-map.js.map +1 -0
  275. package/dist/scripts/data-transformers/constants.d.ts +14 -0
  276. package/dist/scripts/data-transformers/constants.d.ts.map +1 -0
  277. package/dist/scripts/data-transformers/constants.js +14 -0
  278. package/dist/scripts/data-transformers/constants.js.map +1 -0
  279. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts +64 -0
  280. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts.map +1 -0
  281. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js +805 -0
  282. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js.map +1 -0
  283. package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.d.ts +89 -0
  284. package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.d.ts.map +1 -0
  285. package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.js +667 -0
  286. package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.js.map +1 -0
  287. package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts +50 -0
  288. package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts.map +1 -0
  289. package/dist/scripts/data-transformers/content-generators/cia-overview-section.js +310 -0
  290. package/dist/scripts/data-transformers/content-generators/cia-overview-section.js.map +1 -0
  291. package/dist/scripts/data-transformers/content-generators/committee.d.ts +12 -0
  292. package/dist/scripts/data-transformers/content-generators/committee.d.ts.map +1 -0
  293. package/dist/scripts/data-transformers/content-generators/committee.js +247 -0
  294. package/dist/scripts/data-transformers/content-generators/committee.js.map +1 -0
  295. package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts +124 -0
  296. package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts.map +1 -0
  297. package/dist/scripts/data-transformers/content-generators/dashboard-section.js +564 -0
  298. package/dist/scripts/data-transformers/content-generators/dashboard-section.js.map +1 -0
  299. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts +82 -0
  300. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts.map +1 -0
  301. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js +321 -0
  302. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js.map +1 -0
  303. package/dist/scripts/data-transformers/content-generators/generic.d.ts +12 -0
  304. package/dist/scripts/data-transformers/content-generators/generic.d.ts.map +1 -0
  305. package/dist/scripts/data-transformers/content-generators/generic.js +295 -0
  306. package/dist/scripts/data-transformers/content-generators/generic.js.map +1 -0
  307. package/dist/scripts/data-transformers/content-generators/index.d.ts +56 -0
  308. package/dist/scripts/data-transformers/content-generators/index.d.ts.map +1 -0
  309. package/dist/scripts/data-transformers/content-generators/index.js +45 -0
  310. package/dist/scripts/data-transformers/content-generators/index.js.map +1 -0
  311. package/dist/scripts/data-transformers/content-generators/interpellations.d.ts +12 -0
  312. package/dist/scripts/data-transformers/content-generators/interpellations.d.ts.map +1 -0
  313. package/dist/scripts/data-transformers/content-generators/interpellations.js +124 -0
  314. package/dist/scripts/data-transformers/content-generators/interpellations.js.map +1 -0
  315. package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts +137 -0
  316. package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts.map +1 -0
  317. package/dist/scripts/data-transformers/content-generators/mindmap-section.js +286 -0
  318. package/dist/scripts/data-transformers/content-generators/mindmap-section.js.map +1 -0
  319. package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts +17 -0
  320. package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts.map +1 -0
  321. package/dist/scripts/data-transformers/content-generators/month-ahead.js +212 -0
  322. package/dist/scripts/data-transformers/content-generators/month-ahead.js.map +1 -0
  323. package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts +17 -0
  324. package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts.map +1 -0
  325. package/dist/scripts/data-transformers/content-generators/monthly-review.js +173 -0
  326. package/dist/scripts/data-transformers/content-generators/monthly-review.js.map +1 -0
  327. package/dist/scripts/data-transformers/content-generators/motions.d.ts +12 -0
  328. package/dist/scripts/data-transformers/content-generators/motions.d.ts.map +1 -0
  329. package/dist/scripts/data-transformers/content-generators/motions.js +158 -0
  330. package/dist/scripts/data-transformers/content-generators/motions.js.map +1 -0
  331. package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts +52 -0
  332. package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts.map +1 -0
  333. package/dist/scripts/data-transformers/content-generators/newsworthiness.js +244 -0
  334. package/dist/scripts/data-transformers/content-generators/newsworthiness.js.map +1 -0
  335. package/dist/scripts/data-transformers/content-generators/propositions.d.ts +12 -0
  336. package/dist/scripts/data-transformers/content-generators/propositions.d.ts.map +1 -0
  337. package/dist/scripts/data-transformers/content-generators/propositions.js +263 -0
  338. package/dist/scripts/data-transformers/content-generators/propositions.js.map +1 -0
  339. package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts +92 -0
  340. package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts.map +1 -0
  341. package/dist/scripts/data-transformers/content-generators/sankey-section.js +257 -0
  342. package/dist/scripts/data-transformers/content-generators/sankey-section.js.map +1 -0
  343. package/dist/scripts/data-transformers/content-generators/shared.d.ts +81 -0
  344. package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +1 -0
  345. package/dist/scripts/data-transformers/content-generators/shared.js +913 -0
  346. package/dist/scripts/data-transformers/content-generators/shared.js.map +1 -0
  347. package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.d.ts +83 -0
  348. package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.d.ts.map +1 -0
  349. package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.js +219 -0
  350. package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.js.map +1 -0
  351. package/dist/scripts/data-transformers/content-generators/swot-section.d.ts +50 -0
  352. package/dist/scripts/data-transformers/content-generators/swot-section.d.ts.map +1 -0
  353. package/dist/scripts/data-transformers/content-generators/swot-section.js +177 -0
  354. package/dist/scripts/data-transformers/content-generators/swot-section.js.map +1 -0
  355. package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts +12 -0
  356. package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts.map +1 -0
  357. package/dist/scripts/data-transformers/content-generators/week-ahead.js +332 -0
  358. package/dist/scripts/data-transformers/content-generators/week-ahead.js.map +1 -0
  359. package/dist/scripts/data-transformers/content-generators.d.ts +15 -0
  360. package/dist/scripts/data-transformers/content-generators.d.ts.map +1 -0
  361. package/dist/scripts/data-transformers/content-generators.js +14 -0
  362. package/dist/scripts/data-transformers/content-generators.js.map +1 -0
  363. package/dist/scripts/data-transformers/document-analysis.d.ts +58 -0
  364. package/dist/scripts/data-transformers/document-analysis.d.ts.map +1 -0
  365. package/dist/scripts/data-transformers/document-analysis.js +396 -0
  366. package/dist/scripts/data-transformers/document-analysis.js.map +1 -0
  367. package/dist/scripts/data-transformers/helpers.d.ts +144 -0
  368. package/dist/scripts/data-transformers/helpers.d.ts.map +1 -0
  369. package/dist/scripts/data-transformers/helpers.js +408 -0
  370. package/dist/scripts/data-transformers/helpers.js.map +1 -0
  371. package/dist/scripts/data-transformers/index.d.ts +45 -0
  372. package/dist/scripts/data-transformers/index.d.ts.map +1 -0
  373. package/dist/scripts/data-transformers/index.js +66 -0
  374. package/dist/scripts/data-transformers/index.js.map +1 -0
  375. package/dist/scripts/data-transformers/metadata.d.ts +42 -0
  376. package/dist/scripts/data-transformers/metadata.d.ts.map +1 -0
  377. package/dist/scripts/data-transformers/metadata.js +385 -0
  378. package/dist/scripts/data-transformers/metadata.js.map +1 -0
  379. package/dist/scripts/data-transformers/policy-analysis.d.ts +105 -0
  380. package/dist/scripts/data-transformers/policy-analysis.d.ts.map +1 -0
  381. package/dist/scripts/data-transformers/policy-analysis.js +686 -0
  382. package/dist/scripts/data-transformers/policy-analysis.js.map +1 -0
  383. package/dist/scripts/data-transformers/risk-analysis.d.ts +104 -0
  384. package/dist/scripts/data-transformers/risk-analysis.d.ts.map +1 -0
  385. package/dist/scripts/data-transformers/risk-analysis.js +279 -0
  386. package/dist/scripts/data-transformers/risk-analysis.js.map +1 -0
  387. package/dist/scripts/data-transformers/types.d.ts +260 -0
  388. package/dist/scripts/data-transformers/types.d.ts.map +1 -0
  389. package/dist/scripts/data-transformers/types.js +11 -0
  390. package/dist/scripts/data-transformers/types.js.map +1 -0
  391. package/dist/scripts/data-transformers.d.ts +23 -0
  392. package/dist/scripts/data-transformers.d.ts.map +1 -0
  393. package/dist/scripts/data-transformers.js +35 -0
  394. package/dist/scripts/data-transformers.js.map +1 -0
  395. package/dist/scripts/deep-inspection/index.d.ts +55 -0
  396. package/dist/scripts/deep-inspection/index.d.ts.map +1 -0
  397. package/dist/scripts/deep-inspection/index.js +66 -0
  398. package/dist/scripts/deep-inspection/index.js.map +1 -0
  399. package/dist/scripts/detect-swedish-leakage.d.ts +69 -0
  400. package/dist/scripts/detect-swedish-leakage.d.ts.map +1 -0
  401. package/dist/scripts/detect-swedish-leakage.js +417 -0
  402. package/dist/scripts/detect-swedish-leakage.js.map +1 -0
  403. package/dist/scripts/editorial-framework.d.ts +121 -0
  404. package/dist/scripts/editorial-framework.d.ts.map +1 -0
  405. package/dist/scripts/editorial-framework.js +364 -0
  406. package/dist/scripts/editorial-framework.js.map +1 -0
  407. package/dist/scripts/editorial-pillars.d.ts +43 -0
  408. package/dist/scripts/editorial-pillars.d.ts.map +1 -0
  409. package/dist/scripts/editorial-pillars.js +215 -0
  410. package/dist/scripts/editorial-pillars.js.map +1 -0
  411. package/dist/scripts/extract-news-metadata.d.ts +12 -0
  412. package/dist/scripts/extract-news-metadata.d.ts.map +1 -0
  413. package/dist/scripts/extract-news-metadata.js +107 -0
  414. package/dist/scripts/extract-news-metadata.js.map +1 -0
  415. package/dist/scripts/extract-vocabulary.d.ts +15 -0
  416. package/dist/scripts/extract-vocabulary.d.ts.map +1 -0
  417. package/dist/scripts/extract-vocabulary.js +255 -0
  418. package/dist/scripts/extract-vocabulary.js.map +1 -0
  419. package/dist/scripts/fix-article-navigation.d.ts +37 -0
  420. package/dist/scripts/fix-article-navigation.d.ts.map +1 -0
  421. package/dist/scripts/fix-article-navigation.js +198 -0
  422. package/dist/scripts/fix-article-navigation.js.map +1 -0
  423. package/dist/scripts/fix-keywords-localization.d.ts +18 -0
  424. package/dist/scripts/fix-keywords-localization.d.ts.map +1 -0
  425. package/dist/scripts/fix-keywords-localization.js +270 -0
  426. package/dist/scripts/fix-keywords-localization.js.map +1 -0
  427. package/dist/scripts/fix-old-articles-branding.d.ts +17 -0
  428. package/dist/scripts/fix-old-articles-branding.d.ts.map +1 -0
  429. package/dist/scripts/fix-old-articles-branding.js +229 -0
  430. package/dist/scripts/fix-old-articles-branding.js.map +1 -0
  431. package/dist/scripts/generate-news-backport.d.ts +16 -0
  432. package/dist/scripts/generate-news-backport.d.ts.map +1 -0
  433. package/dist/scripts/generate-news-backport.js +379 -0
  434. package/dist/scripts/generate-news-backport.js.map +1 -0
  435. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts +124 -0
  436. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts.map +1 -0
  437. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js +529 -0
  438. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js.map +1 -0
  439. package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts +59 -0
  440. package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts.map +1 -0
  441. package/dist/scripts/generate-news-enhanced/analysis-cache.js +116 -0
  442. package/dist/scripts/generate-news-enhanced/analysis-cache.js.map +1 -0
  443. package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts +58 -0
  444. package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts.map +1 -0
  445. package/dist/scripts/generate-news-enhanced/analysis-labels.js +144 -0
  446. package/dist/scripts/generate-news-enhanced/analysis-labels.js.map +1 -0
  447. package/dist/scripts/generate-news-enhanced/config.d.ts +57 -0
  448. package/dist/scripts/generate-news-enhanced/config.d.ts.map +1 -0
  449. package/dist/scripts/generate-news-enhanced/config.js +286 -0
  450. package/dist/scripts/generate-news-enhanced/config.js.map +1 -0
  451. package/dist/scripts/generate-news-enhanced/generators.d.ts +119 -0
  452. package/dist/scripts/generate-news-enhanced/generators.d.ts.map +1 -0
  453. package/dist/scripts/generate-news-enhanced/generators.js +2108 -0
  454. package/dist/scripts/generate-news-enhanced/generators.js.map +1 -0
  455. package/dist/scripts/generate-news-enhanced/helpers.d.ts +123 -0
  456. package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +1 -0
  457. package/dist/scripts/generate-news-enhanced/helpers.js +438 -0
  458. package/dist/scripts/generate-news-enhanced/helpers.js.map +1 -0
  459. package/dist/scripts/generate-news-enhanced/index.d.ts +19 -0
  460. package/dist/scripts/generate-news-enhanced/index.d.ts.map +1 -0
  461. package/dist/scripts/generate-news-enhanced/index.js +221 -0
  462. package/dist/scripts/generate-news-enhanced/index.js.map +1 -0
  463. package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +35 -0
  464. package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +1 -0
  465. package/dist/scripts/generate-news-enhanced/swot-analyzer.js +1179 -0
  466. package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +1 -0
  467. package/dist/scripts/generate-news-enhanced/types.d.ts +34 -0
  468. package/dist/scripts/generate-news-enhanced/types.d.ts.map +1 -0
  469. package/dist/scripts/generate-news-enhanced/types.js +9 -0
  470. package/dist/scripts/generate-news-enhanced/types.js.map +1 -0
  471. package/dist/scripts/generate-news-enhanced.d.ts +25 -0
  472. package/dist/scripts/generate-news-enhanced.d.ts.map +1 -0
  473. package/dist/scripts/generate-news-enhanced.js +37 -0
  474. package/dist/scripts/generate-news-enhanced.js.map +1 -0
  475. package/dist/scripts/generate-news-indexes/constants.d.ts +20 -0
  476. package/dist/scripts/generate-news-indexes/constants.d.ts.map +1 -0
  477. package/dist/scripts/generate-news-indexes/constants.js +308 -0
  478. package/dist/scripts/generate-news-indexes/constants.js.map +1 -0
  479. package/dist/scripts/generate-news-indexes/helpers.d.ts +73 -0
  480. package/dist/scripts/generate-news-indexes/helpers.d.ts.map +1 -0
  481. package/dist/scripts/generate-news-indexes/helpers.js +352 -0
  482. package/dist/scripts/generate-news-indexes/helpers.js.map +1 -0
  483. package/dist/scripts/generate-news-indexes/index.d.ts +20 -0
  484. package/dist/scripts/generate-news-indexes/index.d.ts.map +1 -0
  485. package/dist/scripts/generate-news-indexes/index.js +75 -0
  486. package/dist/scripts/generate-news-indexes/index.js.map +1 -0
  487. package/dist/scripts/generate-news-indexes/template.d.ts +25 -0
  488. package/dist/scripts/generate-news-indexes/template.d.ts.map +1 -0
  489. package/dist/scripts/generate-news-indexes/template.js +644 -0
  490. package/dist/scripts/generate-news-indexes/template.js.map +1 -0
  491. package/dist/scripts/generate-news-indexes/types.d.ts +96 -0
  492. package/dist/scripts/generate-news-indexes/types.d.ts.map +1 -0
  493. package/dist/scripts/generate-news-indexes/types.js +9 -0
  494. package/dist/scripts/generate-news-indexes/types.js.map +1 -0
  495. package/dist/scripts/generate-news-indexes.d.ts +20 -0
  496. package/dist/scripts/generate-news-indexes.d.ts.map +1 -0
  497. package/dist/scripts/generate-news-indexes.js +19 -0
  498. package/dist/scripts/generate-news-indexes.js.map +1 -0
  499. package/dist/scripts/generate-rss.d.ts +48 -0
  500. package/dist/scripts/generate-rss.d.ts.map +1 -0
  501. package/dist/scripts/generate-rss.js +299 -0
  502. package/dist/scripts/generate-rss.js.map +1 -0
  503. package/dist/scripts/generate-sitemap-html.d.ts +79 -0
  504. package/dist/scripts/generate-sitemap-html.d.ts.map +1 -0
  505. package/dist/scripts/generate-sitemap-html.js +878 -0
  506. package/dist/scripts/generate-sitemap-html.js.map +1 -0
  507. package/dist/scripts/generate-sitemap.d.ts +23 -0
  508. package/dist/scripts/generate-sitemap.d.ts.map +1 -0
  509. package/dist/scripts/generate-sitemap.js +476 -0
  510. package/dist/scripts/generate-sitemap.js.map +1 -0
  511. package/dist/scripts/generate-types-from-cia-schemas.d.ts +176 -0
  512. package/dist/scripts/generate-types-from-cia-schemas.d.ts.map +1 -0
  513. package/dist/scripts/generate-types-from-cia-schemas.js +318 -0
  514. package/dist/scripts/generate-types-from-cia-schemas.js.map +1 -0
  515. package/dist/scripts/government-role-validator.d.ts +65 -0
  516. package/dist/scripts/government-role-validator.d.ts.map +1 -0
  517. package/dist/scripts/government-role-validator.js +217 -0
  518. package/dist/scripts/government-role-validator.js.map +1 -0
  519. package/dist/scripts/html-utils.d.ts +17 -0
  520. package/dist/scripts/html-utils.d.ts.map +1 -0
  521. package/dist/scripts/html-utils.js +29 -0
  522. package/dist/scripts/html-utils.js.map +1 -0
  523. package/dist/scripts/load-cia-stats.d.ts +89 -0
  524. package/dist/scripts/load-cia-stats.d.ts.map +1 -0
  525. package/dist/scripts/load-cia-stats.js +400 -0
  526. package/dist/scripts/load-cia-stats.js.map +1 -0
  527. package/dist/scripts/mcp-client/client.d.ts +73 -0
  528. package/dist/scripts/mcp-client/client.d.ts.map +1 -0
  529. package/dist/scripts/mcp-client/client.js +526 -0
  530. package/dist/scripts/mcp-client/client.js.map +1 -0
  531. package/dist/scripts/mcp-client/document-types.d.ts +23 -0
  532. package/dist/scripts/mcp-client/document-types.d.ts.map +1 -0
  533. package/dist/scripts/mcp-client/document-types.js +62 -0
  534. package/dist/scripts/mcp-client/document-types.js.map +1 -0
  535. package/dist/scripts/mcp-client/index.d.ts +34 -0
  536. package/dist/scripts/mcp-client/index.d.ts.map +1 -0
  537. package/dist/scripts/mcp-client/index.js +67 -0
  538. package/dist/scripts/mcp-client/index.js.map +1 -0
  539. package/dist/scripts/mcp-client/transport.d.ts +32 -0
  540. package/dist/scripts/mcp-client/transport.d.ts.map +1 -0
  541. package/dist/scripts/mcp-client/transport.js +102 -0
  542. package/dist/scripts/mcp-client/transport.js.map +1 -0
  543. package/dist/scripts/mcp-client.d.ts +18 -0
  544. package/dist/scripts/mcp-client.d.ts.map +1 -0
  545. package/dist/scripts/mcp-client.js +18 -0
  546. package/dist/scripts/mcp-client.js.map +1 -0
  547. package/dist/scripts/mcp-query-cli.d.ts +25 -0
  548. package/dist/scripts/mcp-query-cli.d.ts.map +1 -0
  549. package/dist/scripts/mcp-query-cli.js +66 -0
  550. package/dist/scripts/mcp-query-cli.js.map +1 -0
  551. package/dist/scripts/news-types/breaking-news.d.ts +178 -0
  552. package/dist/scripts/news-types/breaking-news.d.ts.map +1 -0
  553. package/dist/scripts/news-types/breaking-news.js +428 -0
  554. package/dist/scripts/news-types/breaking-news.js.map +1 -0
  555. package/dist/scripts/news-types/committee-reports.d.ts +212 -0
  556. package/dist/scripts/news-types/committee-reports.d.ts.map +1 -0
  557. package/dist/scripts/news-types/committee-reports.js +404 -0
  558. package/dist/scripts/news-types/committee-reports.js.map +1 -0
  559. package/dist/scripts/news-types/month-ahead.d.ts +71 -0
  560. package/dist/scripts/news-types/month-ahead.d.ts.map +1 -0
  561. package/dist/scripts/news-types/month-ahead.js +392 -0
  562. package/dist/scripts/news-types/month-ahead.js.map +1 -0
  563. package/dist/scripts/news-types/monthly-review.d.ts +61 -0
  564. package/dist/scripts/news-types/monthly-review.d.ts.map +1 -0
  565. package/dist/scripts/news-types/monthly-review.js +417 -0
  566. package/dist/scripts/news-types/monthly-review.js.map +1 -0
  567. package/dist/scripts/news-types/motions.d.ts +214 -0
  568. package/dist/scripts/news-types/motions.d.ts.map +1 -0
  569. package/dist/scripts/news-types/motions.js +447 -0
  570. package/dist/scripts/news-types/motions.js.map +1 -0
  571. package/dist/scripts/news-types/propositions.d.ts +204 -0
  572. package/dist/scripts/news-types/propositions.d.ts.map +1 -0
  573. package/dist/scripts/news-types/propositions.js +401 -0
  574. package/dist/scripts/news-types/propositions.js.map +1 -0
  575. package/dist/scripts/news-types/week-ahead.d.ts +231 -0
  576. package/dist/scripts/news-types/week-ahead.d.ts.map +1 -0
  577. package/dist/scripts/news-types/week-ahead.js +441 -0
  578. package/dist/scripts/news-types/week-ahead.js.map +1 -0
  579. package/dist/scripts/news-types/weekly-review/analysis.d.ts +47 -0
  580. package/dist/scripts/news-types/weekly-review/analysis.d.ts.map +1 -0
  581. package/dist/scripts/news-types/weekly-review/analysis.js +276 -0
  582. package/dist/scripts/news-types/weekly-review/analysis.js.map +1 -0
  583. package/dist/scripts/news-types/weekly-review/data-loader.d.ts +51 -0
  584. package/dist/scripts/news-types/weekly-review/data-loader.d.ts.map +1 -0
  585. package/dist/scripts/news-types/weekly-review/data-loader.js +298 -0
  586. package/dist/scripts/news-types/weekly-review/data-loader.js.map +1 -0
  587. package/dist/scripts/news-types/weekly-review/generator.d.ts +18 -0
  588. package/dist/scripts/news-types/weekly-review/generator.d.ts.map +1 -0
  589. package/dist/scripts/news-types/weekly-review/generator.js +284 -0
  590. package/dist/scripts/news-types/weekly-review/generator.js.map +1 -0
  591. package/dist/scripts/news-types/weekly-review/index.d.ts +20 -0
  592. package/dist/scripts/news-types/weekly-review/index.d.ts.map +1 -0
  593. package/dist/scripts/news-types/weekly-review/index.js +23 -0
  594. package/dist/scripts/news-types/weekly-review/index.js.map +1 -0
  595. package/dist/scripts/news-types/weekly-review/types.d.ts +72 -0
  596. package/dist/scripts/news-types/weekly-review/types.d.ts.map +1 -0
  597. package/dist/scripts/news-types/weekly-review/types.js +20 -0
  598. package/dist/scripts/news-types/weekly-review/types.js.map +1 -0
  599. package/dist/scripts/news-types/weekly-review/validation.d.ts +10 -0
  600. package/dist/scripts/news-types/weekly-review/validation.d.ts.map +1 -0
  601. package/dist/scripts/news-types/weekly-review/validation.js +95 -0
  602. package/dist/scripts/news-types/weekly-review/validation.js.map +1 -0
  603. package/dist/scripts/news-types/weekly-review.d.ts +15 -0
  604. package/dist/scripts/news-types/weekly-review.d.ts.map +1 -0
  605. package/dist/scripts/news-types/weekly-review.js +14 -0
  606. package/dist/scripts/news-types/weekly-review.js.map +1 -0
  607. package/dist/scripts/party-variants.d.ts +23 -0
  608. package/dist/scripts/party-variants.d.ts.map +1 -0
  609. package/dist/scripts/party-variants.js +50 -0
  610. package/dist/scripts/party-variants.js.map +1 -0
  611. package/dist/scripts/pipeline/index.d.ts +19 -0
  612. package/dist/scripts/pipeline/index.d.ts.map +1 -0
  613. package/dist/scripts/pipeline/index.js +17 -0
  614. package/dist/scripts/pipeline/index.js.map +1 -0
  615. package/dist/scripts/pipeline/orchestrator.d.ts +56 -0
  616. package/dist/scripts/pipeline/orchestrator.d.ts.map +1 -0
  617. package/dist/scripts/pipeline/orchestrator.js +147 -0
  618. package/dist/scripts/pipeline/orchestrator.js.map +1 -0
  619. package/dist/scripts/pipeline/types.d.ts +117 -0
  620. package/dist/scripts/pipeline/types.d.ts.map +1 -0
  621. package/dist/scripts/pipeline/types.js +13 -0
  622. package/dist/scripts/pipeline/types.js.map +1 -0
  623. package/dist/scripts/pipeline/validation.d.ts +66 -0
  624. package/dist/scripts/pipeline/validation.d.ts.map +1 -0
  625. package/dist/scripts/pipeline/validation.js +129 -0
  626. package/dist/scripts/pipeline/validation.js.map +1 -0
  627. package/dist/scripts/populate-analysis-data.d.ts +41 -0
  628. package/dist/scripts/populate-analysis-data.d.ts.map +1 -0
  629. package/dist/scripts/populate-analysis-data.js +255 -0
  630. package/dist/scripts/populate-analysis-data.js.map +1 -0
  631. package/dist/scripts/pre-article-analysis/data-downloader.d.ts +80 -0
  632. package/dist/scripts/pre-article-analysis/data-downloader.d.ts.map +1 -0
  633. package/dist/scripts/pre-article-analysis/data-downloader.js +230 -0
  634. package/dist/scripts/pre-article-analysis/data-downloader.js.map +1 -0
  635. package/dist/scripts/pre-article-analysis/data-persistence.d.ts +141 -0
  636. package/dist/scripts/pre-article-analysis/data-persistence.d.ts.map +1 -0
  637. package/dist/scripts/pre-article-analysis/data-persistence.js +345 -0
  638. package/dist/scripts/pre-article-analysis/data-persistence.js.map +1 -0
  639. package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +95 -0
  640. package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +1 -0
  641. package/dist/scripts/pre-article-analysis/markdown-serializer.js +648 -0
  642. package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +1 -0
  643. package/dist/scripts/pre-article-analysis/pdf-converter.d.ts +58 -0
  644. package/dist/scripts/pre-article-analysis/pdf-converter.d.ts.map +1 -0
  645. package/dist/scripts/pre-article-analysis/pdf-converter.js +142 -0
  646. package/dist/scripts/pre-article-analysis/pdf-converter.js.map +1 -0
  647. package/dist/scripts/pre-article-analysis.d.ts +41 -0
  648. package/dist/scripts/pre-article-analysis.d.ts.map +1 -0
  649. package/dist/scripts/pre-article-analysis.js +578 -0
  650. package/dist/scripts/pre-article-analysis.js.map +1 -0
  651. package/dist/scripts/scb-client.d.ts +104 -0
  652. package/dist/scripts/scb-client.d.ts.map +1 -0
  653. package/dist/scripts/scb-client.js +286 -0
  654. package/dist/scripts/scb-client.js.map +1 -0
  655. package/dist/scripts/scb-context.d.ts +88 -0
  656. package/dist/scripts/scb-context.d.ts.map +1 -0
  657. package/dist/scripts/scb-context.js +307 -0
  658. package/dist/scripts/scb-context.js.map +1 -0
  659. package/dist/scripts/shared/version.d.ts +9 -0
  660. package/dist/scripts/shared/version.d.ts.map +1 -0
  661. package/dist/scripts/shared/version.js +28 -0
  662. package/dist/scripts/shared/version.js.map +1 -0
  663. package/dist/scripts/statistical-claims-detector.d.ts +119 -0
  664. package/dist/scripts/statistical-claims-detector.d.ts.map +1 -0
  665. package/dist/scripts/statistical-claims-detector.js +391 -0
  666. package/dist/scripts/statistical-claims-detector.js.map +1 -0
  667. package/dist/scripts/sync-cia-schemas.d.ts +52 -0
  668. package/dist/scripts/sync-cia-schemas.d.ts.map +1 -0
  669. package/dist/scripts/sync-cia-schemas.js +195 -0
  670. package/dist/scripts/sync-cia-schemas.js.map +1 -0
  671. package/dist/scripts/translation-dictionary.d.ts +45 -0
  672. package/dist/scripts/translation-dictionary.d.ts.map +1 -0
  673. package/dist/scripts/translation-dictionary.js +3642 -0
  674. package/dist/scripts/translation-dictionary.js.map +1 -0
  675. package/dist/scripts/types/article.d.ts +362 -0
  676. package/dist/scripts/types/article.d.ts.map +1 -0
  677. package/dist/scripts/types/article.js +6 -0
  678. package/dist/scripts/types/article.js.map +1 -0
  679. package/dist/scripts/types/content.d.ts +167 -0
  680. package/dist/scripts/types/content.d.ts.map +1 -0
  681. package/dist/scripts/types/content.js +6 -0
  682. package/dist/scripts/types/content.js.map +1 -0
  683. package/dist/scripts/types/editorial.d.ts +17 -0
  684. package/dist/scripts/types/editorial.d.ts.map +1 -0
  685. package/dist/scripts/types/editorial.js +6 -0
  686. package/dist/scripts/types/editorial.js.map +1 -0
  687. package/dist/scripts/types/language.d.ts +7 -0
  688. package/dist/scripts/types/language.d.ts.map +1 -0
  689. package/dist/scripts/types/language.js +6 -0
  690. package/dist/scripts/types/language.js.map +1 -0
  691. package/dist/scripts/types/mcp.d.ts +117 -0
  692. package/dist/scripts/types/mcp.d.ts.map +1 -0
  693. package/dist/scripts/types/mcp.js +6 -0
  694. package/dist/scripts/types/mcp.js.map +1 -0
  695. package/dist/scripts/types/party.d.ts +9 -0
  696. package/dist/scripts/types/party.d.ts.map +1 -0
  697. package/dist/scripts/types/party.js +6 -0
  698. package/dist/scripts/types/party.js.map +1 -0
  699. package/dist/scripts/types/validation.d.ts +136 -0
  700. package/dist/scripts/types/validation.d.ts.map +1 -0
  701. package/dist/scripts/types/validation.js +6 -0
  702. package/dist/scripts/types/validation.js.map +1 -0
  703. package/dist/scripts/types/workflow.d.ts +78 -0
  704. package/dist/scripts/types/workflow.d.ts.map +1 -0
  705. package/dist/scripts/types/workflow.js +6 -0
  706. package/dist/scripts/types/workflow.js.map +1 -0
  707. package/dist/scripts/update-stats-from-cia.d.ts +44 -0
  708. package/dist/scripts/update-stats-from-cia.d.ts.map +1 -0
  709. package/dist/scripts/update-stats-from-cia.js +310 -0
  710. package/dist/scripts/update-stats-from-cia.js.map +1 -0
  711. package/dist/scripts/validate-against-cia-schemas.d.ts +126 -0
  712. package/dist/scripts/validate-against-cia-schemas.d.ts.map +1 -0
  713. package/dist/scripts/validate-against-cia-schemas.js +299 -0
  714. package/dist/scripts/validate-against-cia-schemas.js.map +1 -0
  715. package/dist/scripts/validate-cross-references.d.ts +49 -0
  716. package/dist/scripts/validate-cross-references.d.ts.map +1 -0
  717. package/dist/scripts/validate-cross-references.js +183 -0
  718. package/dist/scripts/validate-cross-references.js.map +1 -0
  719. package/dist/scripts/validate-file-ownership.d.ts +68 -0
  720. package/dist/scripts/validate-file-ownership.d.ts.map +1 -0
  721. package/dist/scripts/validate-file-ownership.js +135 -0
  722. package/dist/scripts/validate-file-ownership.js.map +1 -0
  723. package/dist/scripts/validate-news-translations.d.ts +27 -0
  724. package/dist/scripts/validate-news-translations.d.ts.map +1 -0
  725. package/dist/scripts/validate-news-translations.js +258 -0
  726. package/dist/scripts/validate-news-translations.js.map +1 -0
  727. package/dist/scripts/validate-translations.d.ts +162 -0
  728. package/dist/scripts/validate-translations.d.ts.map +1 -0
  729. package/dist/scripts/validate-translations.js +378 -0
  730. package/dist/scripts/validate-translations.js.map +1 -0
  731. package/dist/scripts/workflow-state-coordinator.d.ts +354 -0
  732. package/dist/scripts/workflow-state-coordinator.d.ts.map +1 -0
  733. package/dist/scripts/workflow-state-coordinator.js +876 -0
  734. package/dist/scripts/workflow-state-coordinator.js.map +1 -0
  735. package/dist/scripts/world-bank-client.d.ts +122 -0
  736. package/dist/scripts/world-bank-client.d.ts.map +1 -0
  737. package/dist/scripts/world-bank-client.js +192 -0
  738. package/dist/scripts/world-bank-client.js.map +1 -0
  739. package/dist/scripts/world-bank-context.d.ts +88 -0
  740. package/dist/scripts/world-bank-context.d.ts.map +1 -0
  741. package/dist/scripts/world-bank-context.js +331 -0
  742. package/dist/scripts/world-bank-context.js.map +1 -0
  743. package/package.json +32 -7
  744. package/dist/lib/chart-factory.d.ts.map +0 -1
  745. package/dist/lib/chart-factory.js.map +0 -1
  746. package/dist/lib/data-loader.d.ts.map +0 -1
  747. package/dist/lib/data-loader.js.map +0 -1
  748. package/dist/lib/dom-utils.d.ts.map +0 -1
  749. package/dist/lib/dom-utils.js.map +0 -1
  750. package/dist/lib/error-boundary.d.ts.map +0 -1
  751. package/dist/lib/error-boundary.js.map +0 -1
  752. package/dist/lib/fallback-ui.d.ts.map +0 -1
  753. package/dist/lib/fallback-ui.js.map +0 -1
  754. package/dist/lib/index.d.ts.map +0 -1
  755. package/dist/lib/index.js.map +0 -1
  756. package/dist/lib/logger.d.ts.map +0 -1
  757. package/dist/lib/logger.js.map +0 -1
  758. package/dist/lib/theme.d.ts.map +0 -1
  759. package/dist/lib/theme.js.map +0 -1
  760. package/dist/lib/types.d.ts.map +0 -1
  761. package/dist/lib/types.js.map +0 -1
  762. /package/dist/lib/{chart-factory.d.ts → shared/chart-factory.d.ts} +0 -0
  763. /package/dist/lib/{chart-factory.js → shared/chart-factory.js} +0 -0
  764. /package/dist/lib/{data-loader.d.ts → shared/data-loader.d.ts} +0 -0
  765. /package/dist/lib/{data-loader.js → shared/data-loader.js} +0 -0
  766. /package/dist/lib/{dom-utils.d.ts → shared/dom-utils.d.ts} +0 -0
  767. /package/dist/lib/{dom-utils.js → shared/dom-utils.js} +0 -0
  768. /package/dist/lib/{error-boundary.d.ts → shared/error-boundary.d.ts} +0 -0
  769. /package/dist/lib/{error-boundary.js → shared/error-boundary.js} +0 -0
  770. /package/dist/lib/{fallback-ui.d.ts → shared/fallback-ui.d.ts} +0 -0
  771. /package/dist/lib/{fallback-ui.js → shared/fallback-ui.js} +0 -0
  772. /package/dist/lib/{index.d.ts → shared/index.d.ts} +0 -0
  773. /package/dist/lib/{index.js → shared/index.js} +0 -0
  774. /package/dist/lib/{logger.d.ts → shared/logger.d.ts} +0 -0
  775. /package/dist/lib/{logger.js → shared/logger.js} +0 -0
  776. /package/dist/lib/{theme.d.ts → shared/theme.d.ts} +0 -0
  777. /package/dist/lib/{theme.js → shared/theme.js} +0 -0
  778. /package/dist/lib/{types.d.ts → shared/types.d.ts} +0 -0
  779. /package/dist/lib/{types.js → shared/types.js} +0 -0
@@ -0,0 +1,686 @@
1
+ /**
2
+ * @module data-transformers/policy-analysis
3
+ * @description Policy domain detection and analysis for parliamentary
4
+ * documents. Detects fiscal, defence, environmental, education, healthcare,
5
+ * migration, EU, justice, labour, housing, transport, and trade domains
6
+ * using keyword matching against Swedish document titles.
7
+ *
8
+ * Also provides confidence level assessment for intelligence analysis.
9
+ *
10
+ * @author Hack23 AB
11
+ * @license Apache-2.0
12
+ */
13
+ /**
14
+ * Assess the confidence level of an intelligence analysis based on
15
+ * the number of corroborating evidence items and the quality of sources.
16
+ *
17
+ * @param evidenceCount - Number of distinct evidence items supporting the assessment
18
+ * @param sourceQuality - Quality score of sources (0-100, higher = better)
19
+ * @returns Confidence level classification
20
+ */
21
+ export function assessConfidenceLevel(evidenceCount, sourceQuality) {
22
+ const normalizedEvidence = Math.max(0, evidenceCount);
23
+ const normalizedQuality = Math.max(0, Math.min(100, sourceQuality));
24
+ // HIGH: Multiple evidence items with good-quality sources
25
+ if (normalizedEvidence >= 5 && normalizedQuality >= 70)
26
+ return 'HIGH';
27
+ if (normalizedEvidence >= 3 && normalizedQuality >= 85)
28
+ return 'HIGH';
29
+ // LOW: Very few evidence items or very poor source quality
30
+ if (normalizedEvidence === 0)
31
+ return 'LOW';
32
+ if (normalizedEvidence <= 1 && normalizedQuality < 50)
33
+ return 'LOW';
34
+ if (normalizedQuality < 30)
35
+ return 'LOW';
36
+ // MEDIUM: everything in between
37
+ return 'MEDIUM';
38
+ }
39
+ import { escapeHtml } from '../html-utils.js';
40
+ import { COMMITTEE_NAMES } from './constants.js';
41
+ import { L, svSpan, cleanMotionText, isPersonProfileText, extractKeyPassage, getCommitteeName, } from './helpers.js';
42
+ const DOMAIN_NAMES = {
43
+ fiscal: {
44
+ en: 'fiscal policy', sv: 'finanspolitik', da: 'finanspolitik', no: 'finanspolitikk',
45
+ fi: 'finanssipolitiikka', de: 'Finanzpolitik', fr: 'politique fiscale',
46
+ es: 'política fiscal', nl: 'begrotingsbeleid', ar: 'السياسة المالية',
47
+ he: 'מדיניות פיסקלית', ja: '財政政策', ko: '재정 정책', zh: '财政政策',
48
+ },
49
+ defence: {
50
+ en: 'defence and security policy', sv: 'försvars- och säkerhetspolitik',
51
+ da: 'forsvars- og sikkerhedspolitik', no: 'forsvars- og sikkerhetspolitikk',
52
+ fi: 'puolustus- ja turvallisuuspolitiikka', de: 'Verteidigungs- und Sicherheitspolitik',
53
+ fr: 'politique de défense et de sécurité', es: 'política de defensa y seguridad',
54
+ nl: 'defensie- en veiligheidsbeleid', ar: 'سياسة الدفاع والأمن',
55
+ he: 'מדיניות ביטחון והגנה', ja: '防衛・安全保障政策', ko: '국방·안보 정책', zh: '国防和安全政策',
56
+ },
57
+ environment: {
58
+ en: 'environmental and climate policy', sv: 'miljö- och klimatpolitik',
59
+ da: 'miljø- og klimapolitik', no: 'miljø- og klimapolitikk',
60
+ fi: 'ympäristö- ja ilmastopolitiikka', de: 'Umwelt- und Klimapolitik',
61
+ fr: 'politique environnementale et climatique', es: 'política medioambiental y climática',
62
+ nl: 'milieu- en klimaatbeleid', ar: 'سياسة البيئة والمناخ',
63
+ he: 'מדיניות סביבה ואקלים', ja: '環境・気候政策', ko: '환경·기후 정책', zh: '环境和气候政策',
64
+ },
65
+ education: {
66
+ en: 'education policy', sv: 'utbildningspolitik', da: 'uddannelsespolitik',
67
+ no: 'utdanningspolitikk', fi: 'koulutuspolitiikka', de: 'Bildungspolitik',
68
+ fr: 'politique éducative', es: 'política educativa', nl: 'onderwijsbeleid',
69
+ ar: 'سياسة التعليم', he: 'מדיניות חינוך', ja: '教育政策', ko: '교육 정책', zh: '教育政策',
70
+ },
71
+ healthcare: {
72
+ en: 'healthcare policy', sv: 'hälso- och sjukvårdspolitik',
73
+ da: 'sundhedspolitik', no: 'helsepolitikk', fi: 'terveyspolitiikka',
74
+ de: 'Gesundheitspolitik', fr: 'politique de santé', es: 'política sanitaria',
75
+ nl: 'gezondheidsbeleid', ar: 'سياسة الرعاية الصحية', he: 'מדיניות בריאות',
76
+ ja: '医療政策', ko: '보건 정책', zh: '医疗政策',
77
+ },
78
+ migration: {
79
+ en: 'migration policy', sv: 'migrationspolitik', da: 'migrationspolitik',
80
+ no: 'migrasjonspolitikk', fi: 'maahanmuuttopolitiikka', de: 'Migrationspolitik',
81
+ fr: 'politique migratoire', es: 'política migratoria', nl: 'migratiebeleid',
82
+ ar: 'سياسة الهجرة', he: 'מדיניות הגירה', ja: '移民政策', ko: '이민 정책', zh: '移民政策',
83
+ },
84
+ 'eu-foreign': {
85
+ en: 'EU and foreign affairs', sv: 'EU- och utrikespolitik',
86
+ da: 'EU- og udenrigspolitik', no: 'EU- og utenrikspolitikk',
87
+ fi: 'EU- ja ulkopolitiikka', de: 'EU- und Außenpolitik',
88
+ fr: 'affaires européennes et étrangères', es: 'asuntos europeos y exteriores',
89
+ nl: 'EU- en buitenlands beleid', ar: 'شؤون الاتحاد الأوروبي والخارجية',
90
+ he: 'יחסי חוץ ואיחוד אירופי', ja: 'EU・外交政策', ko: 'EU·외교 정책', zh: '欧盟和外交事务',
91
+ },
92
+ justice: {
93
+ en: 'justice policy', sv: 'rättspolitik', da: 'retspolitik',
94
+ no: 'justispolitikk', fi: 'oikeuspolitiikka', de: 'Justizpolitik',
95
+ fr: 'politique judiciaire', es: 'política judicial', nl: 'justitiebeleid',
96
+ ar: 'سياسة العدالة', he: 'מדיניות משפט', ja: '司法政策', ko: '사법 정책', zh: '司法政策',
97
+ },
98
+ labour: {
99
+ en: 'labour market policy', sv: 'arbetsmarknadspolitik',
100
+ da: 'arbejdsmarkedspolitik', no: 'arbeidsmarkedspolitikk',
101
+ fi: 'työmarkkinapolitiikka', de: 'Arbeitsmarktpolitik',
102
+ fr: 'politique du marché du travail', es: 'política del mercado laboral',
103
+ nl: 'arbeidsmarktbeleid', ar: 'سياسة سوق العمل', he: 'מדיניות שוק העבודה',
104
+ ja: '労働市場政策', ko: '노동시장 정책', zh: '劳动市场政策',
105
+ },
106
+ housing: {
107
+ en: 'housing policy', sv: 'bostadspolitik', da: 'boligpolitik',
108
+ no: 'boligpolitikk', fi: 'asuntopolitiikka', de: 'Wohnungspolitik',
109
+ fr: 'politique du logement', es: 'política de vivienda', nl: 'woningbeleid',
110
+ ar: 'سياسة الإسكان', he: 'מדיניות דיור', ja: '住宅政策', ko: '주택 정책', zh: '住房政策',
111
+ },
112
+ transport: {
113
+ en: 'transport policy', sv: 'transportpolitik', da: 'transportpolitik',
114
+ no: 'transportpolitikk', fi: 'liikennepolitiikka', de: 'Verkehrspolitik',
115
+ fr: 'politique des transports', es: 'política de transporte', nl: 'vervoersbeleid',
116
+ ar: 'سياسة النقل', he: 'מדיניות תחבורה', ja: '交通政策', ko: '교통 정책', zh: '交通政策',
117
+ },
118
+ trade: {
119
+ en: 'trade and industry policy', sv: 'näringspolitik',
120
+ da: 'erhvervspolitik', no: 'næringspolitikk', fi: 'elinkeino- ja kauppapolitiikka',
121
+ de: 'Wirtschafts- und Handelspolitik', fr: 'politique commerciale et industrielle',
122
+ es: 'política comercial e industrial', nl: 'handels- en industriebeleid',
123
+ ar: 'سياسة التجارة والصناعة', he: 'מדיניות מסחר ותעשייה',
124
+ ja: '通商・産業政策', ko: '통상·산업 정책', zh: '贸易和产业政策',
125
+ },
126
+ };
127
+ /**
128
+ * Map from canonical domain key to its English display name.
129
+ * Single source of truth — mirrors DOMAIN_NAMES[key].en for each key.
130
+ */
131
+ export const DOMAIN_KEY_TO_EN = Object.fromEntries(Object.entries(DOMAIN_NAMES).map(([key, translations]) => [key, translations.en]));
132
+ /**
133
+ * Reverse lookup: map any localised domain display name back to its canonical key.
134
+ * Covers all 14 languages so callers can reliably derive the key from any
135
+ * string returned by `detectPolicyDomains()`.
136
+ */
137
+ export const DOMAIN_NAME_TO_KEY = (() => {
138
+ const m = {};
139
+ for (const [key, translations] of Object.entries(DOMAIN_NAMES)) {
140
+ for (const localisedName of Object.values(translations)) {
141
+ m[localisedName] = key;
142
+ m[localisedName.toLowerCase()] = key;
143
+ }
144
+ }
145
+ return m;
146
+ })();
147
+ function domainName(key, lang) {
148
+ return DOMAIN_NAMES[key][lang] ?? DOMAIN_NAMES[key].en;
149
+ }
150
+ /**
151
+ * Detect policy domains from a document's title and committee code.
152
+ * Returns a deduplicated array of localised domain strings.
153
+ */
154
+ export function detectPolicyDomains(doc, lang = 'en') {
155
+ const title = (doc.titel || doc.title || '').toLowerCase();
156
+ const organ = doc.organ || doc.committee || '';
157
+ const set = new Set();
158
+ if (title.includes('skatt') || title.includes('tax') || title.includes('budget') || title.includes('finans')
159
+ || title.includes('makrotillsyn') || title.includes('macroprudential')
160
+ || title.includes('moms') || title.includes('mervärd') || title.includes('skattebedrägeri')
161
+ || title.includes('e-id') || title.includes('e-legitimation') || title.includes('verklig huvudman')
162
+ || title.includes('penningtvätt') || /\bbeneficial owner(ship)?\b/.test(title) || title.includes('fakturabedrägeri')
163
+ || organ === 'SkU' || organ === 'FiU')
164
+ set.add(domainName('fiscal', lang));
165
+ if (title.includes('försvar') || title.includes('defen') || title.includes('militär') || title.includes('nato')
166
+ || title.includes('vapen') || title.includes('beredskap') || title.includes('totalförsvar')
167
+ || title.includes('krigsmateriel') || title.includes('säkerhetsskydd') || title.includes('preparedness')
168
+ || title.includes('weapon')
169
+ || organ === 'FöU')
170
+ set.add(domainName('defence', lang));
171
+ if (title.includes('miljö') || title.includes('klimat') || title.includes('environ') || title.includes('energi')
172
+ || title.includes('förnybart') || title.includes('renewable') || title.includes('koldioxid')
173
+ || title.includes('hållbar') || title.includes('sustain')
174
+ || organ === 'MJU')
175
+ set.add(domainName('environment', lang));
176
+ if (title.includes('utbildning') || title.includes('educ') || title.includes('skola') || title.includes('högskola')
177
+ || organ === 'UbU')
178
+ set.add(domainName('education', lang));
179
+ if (title.includes('vård') || title.includes('hälsa') || title.includes('health') || title.includes('omsorg')
180
+ || organ === 'SoU')
181
+ set.add(domainName('healthcare', lang));
182
+ if (title.includes('migration') || title.includes('invandring') || title.includes('asyl') || title.includes('utlänning')
183
+ || title.includes('uppehållstillstånd') || title.includes('medborgarskap') || title.includes('citizenship')
184
+ || title.includes('utvisning') || title.includes('statslöshet')
185
+ || organ === 'SfU')
186
+ set.add(domainName('migration', lang));
187
+ if (/\beu\b/.test(title) || title.includes('europa') || title.includes('utrik') || title.includes('foreign')
188
+ || organ === 'UU')
189
+ set.add(domainName('eu-foreign', lang));
190
+ if (title.includes('brott') || title.includes('straff') || title.includes('polis') || title.includes('justice')
191
+ || title.includes('kriminal') || organ === 'JuU')
192
+ set.add(domainName('justice', lang));
193
+ if (title.includes('arbetsmarknad') || title.includes('labour') || title.includes('anställning')
194
+ || title.includes('facklig') || /\bilo\b/.test(title) || title.includes('trakasserier')
195
+ || title.includes('kollektivavtal') || title.includes('lönediskriminering') || title.includes('harassment')
196
+ || organ === 'AU')
197
+ set.add(domainName('labour', lang));
198
+ if (title.includes('bostad') || title.includes('housing') || title.includes('hyra') || title.includes('bostadsrätt')
199
+ || title.includes('lagfart') || title.includes('fastighet')
200
+ || organ === 'CU')
201
+ set.add(domainName('housing', lang));
202
+ if (title.includes('trafik') || title.includes('transport') || title.includes('järnväg') || title.includes('väg')
203
+ || organ === 'TU')
204
+ set.add(domainName('transport', lang));
205
+ if (title.includes('näring') || title.includes('handel') || title.includes('trade') || title.includes('industri')
206
+ || title.includes('företag') || title.includes('jordbruk') || title.includes('lantbruk')
207
+ || title.includes('veterinär') || title.includes('djur') || organ === 'NU')
208
+ set.add(domainName('trade', lang));
209
+ return Array.from(set);
210
+ }
211
+ /**
212
+ * Detect dominant narrative frames in a document title.
213
+ * Narrative framing reveals which rhetorical strategies are being employed
214
+ * regardless of the specific policy domain.
215
+ *
216
+ * @param doc - Document to analyse
217
+ * @returns Array of detected narrative frames (deduplicated)
218
+ */
219
+ export function detectNarrativeFrames(doc) {
220
+ const title = (doc.titel || doc.title || '').toLowerCase();
221
+ const frames = new Set();
222
+ // Law-and-order: crime, punishment, police
223
+ if (title.includes('brott') || title.includes('straff') || title.includes('polis') ||
224
+ title.includes('kriminal') || title.includes('gäng') || /\bsäker(het)?\b/.test(title))
225
+ frames.add('law-and-order');
226
+ // Welfare-state defence: healthcare, social services, welfare
227
+ if (title.includes('välfärd') || title.includes('omsorg') || title.includes('social') ||
228
+ title.includes('pension') || title.includes('bidrag') || title.includes('trygghet'))
229
+ frames.add('welfare-state-defence');
230
+ // Fiscal responsibility: budgets, debt, taxes
231
+ if (title.includes('budget') || title.includes('skuld') || title.includes('bespar') ||
232
+ title.includes('effektiv') || title.includes('kostnad') || title.includes('överskott'))
233
+ frames.add('fiscal-responsibility');
234
+ // Green transition: climate, environment, energy
235
+ if (title.includes('klimat') || title.includes('hållbar') || title.includes('grön') ||
236
+ title.includes('utsläpp') || title.includes('förnybar') || title.includes('energiomstäl'))
237
+ frames.add('green-transition');
238
+ // National security: defence, preparedness, NATO
239
+ if (title.includes('försvar') || title.includes('nato') || title.includes('beredskap') ||
240
+ title.includes('totalförsvar') || title.includes('säkerhetsskydd'))
241
+ frames.add('national-security');
242
+ // Integration challenge: migration, asylum, citizenship
243
+ if (title.includes('integration') || title.includes('integrera') || title.includes('migration') || title.includes('invandring') ||
244
+ title.includes('asyl') || title.includes('utvisning'))
245
+ frames.add('integration-challenge');
246
+ // EU sovereignty: EU, European, sovereignty
247
+ if (/\beu\b/.test(title) || title.includes('europa') || title.includes('suveränitet') ||
248
+ title.includes('direktiv') || title.includes('förordning'))
249
+ frames.add('eu-sovereignty');
250
+ // Workers' rights: labour, unions, wages
251
+ if (title.includes('facklig') || title.includes('lön') || title.includes('arbetsrätt') ||
252
+ title.includes('kollektivavtal') || title.includes('strejk'))
253
+ frames.add('workers-rights');
254
+ return Array.from(frames);
255
+ }
256
+ /**
257
+ * Reverse lookup from any localised domain name to the English display name.
258
+ * Derived from `DOMAIN_NAME_TO_KEY` + `DOMAIN_KEY_TO_EN` to avoid maintaining
259
+ * a second translation table that could drift from the canonical source.
260
+ */
261
+ const _LOCALISED_TO_EN = (() => {
262
+ const m = {};
263
+ for (const [localised, key] of Object.entries(DOMAIN_NAME_TO_KEY)) {
264
+ m[localised] = DOMAIN_KEY_TO_EN[key];
265
+ }
266
+ return m;
267
+ })();
268
+ /** Module-level constant — allocated once, shared across all calls. */
269
+ const DOMAIN_ANALYSES = {
270
+ 'fiscal policy': {
271
+ en: {
272
+ mot: 'Fiscal policy motions directly challenge the government\'s budget assumptions and signal opposition readiness to contest tax and spending priorities.',
273
+ bet: 'The Finance Committee\'s position on fiscal matters is usually decisive — the chamber almost always follows its recommendation on budgetary questions.',
274
+ ip: 'This interpellation demands government accountability on fiscal policy, compelling the minister to defend budget assumptions or explain spending deviations before parliament.',
275
+ default: 'Government fiscal proposals must clear rigorous Finance Committee scrutiny and align with Sweden\'s fiscal surplus rule, making the committee\'s verdict pivotal.'
276
+ },
277
+ sv: {
278
+ mot: 'Finanspolitiska motioner utmanar direkt regeringens budgetantaganden och signalerar oppositionens beredskap att bestrida skatte- och utgiftsprioriteringar.',
279
+ bet: 'Finansutskottets ståndpunkt i finanspolitiska frågor är i regel avgörande – kammaren följer nästan alltid utskottets rekommendation.',
280
+ ip: 'Denna interpellation kräver regeringens ansvarighet i finanspolitiken och tvingar ministern att försvara budgetantaganden eller förklara utgiftsavvikelser inför riksdagen.',
281
+ default: 'Regeringens finanspolitiska förslag måste klara finansutskottets granskning och harmonisera med överskottsmålet för att nå bifall.'
282
+ },
283
+ de: { default: 'Haushaltspolitische Vorschläge müssen die strenge Prüfung des Finanzausschusses bestehen und die schwedische Überschussregel einhalten.' },
284
+ fr: { default: 'Les propositions fiscales doivent passer l\'examen rigoureux de la commission des finances et s\'aligner sur la règle d\'excédent budgétaire suédoise.' },
285
+ es: { default: 'Las propuestas fiscales deben superar el riguroso escrutinio del comité de finanzas y alinearse con la regla de superávit fiscal sueca.' },
286
+ },
287
+ 'defence and security policy': {
288
+ en: {
289
+ mot: 'Defence motions carry heightened strategic significance following Sweden\'s NATO accession, pressing the government on long-term security commitments.',
290
+ bet: 'Committee reports on defence shape Sweden\'s military posture and NATO integration trajectory — decisions here have multi-decade consequences.',
291
+ ip: 'This interpellation exercises parliamentary oversight on defence and security, pressing the minister to account for strategic decisions or gaps in military preparedness.',
292
+ default: 'Defence proposals engage Sweden\'s NATO obligations and cross-party consensus-building mechanisms for national security legislation.'
293
+ },
294
+ sv: {
295
+ mot: 'Försvarsrelaterade motioner har förhöjd strategisk betydelse efter Sveriges NATO-inträde och pressar regeringen om långsiktiga säkerhetsåtaganden.',
296
+ bet: 'Utskottsbetänkanden om försvar formar Sveriges militära inriktning och NATO-integration – besluten har konsekvenser i decennier.',
297
+ ip: 'Denna interpellation utövar parlamentarisk kontroll över försvars- och säkerhetspolitiken och kräver att ministern redogör för strategiska beslut eller brister i beredskapen.',
298
+ default: 'Försvarspropositioner engagerar Sveriges NATO-förpliktelser och mekanismer för brett partistöd inom säkerhetspolitiken.'
299
+ },
300
+ de: { default: 'Verteidigungsvorschläge berühren Schwedens NATO-Verpflichtungen und Mechanismen zur parteiübergreifenden Konsensfindung in der nationalen Sicherheitspolitik.' },
301
+ fr: { default: 'Les propositions de défense engagent les obligations de la Suède envers l\'OTAN et les mécanismes de consensus multipartite pour la législation de sécurité nationale.' },
302
+ es: { default: 'Las propuestas de defensa comprometen las obligaciones de Suecia con la OTAN y los mecanismos de consenso multipartidario para la legislación de seguridad nacional.' },
303
+ },
304
+ 'environmental and climate policy': {
305
+ en: {
306
+ mot: 'Climate motions reflect growing parliamentary pressure for faster decarbonisation, often targeting specific industries or the pace of policy implementation.',
307
+ bet: 'The Environment Committee\'s recommendations balance climate ambition against economic competitiveness — its position sets the legislative baseline.',
308
+ ip: 'This interpellation holds the government accountable on climate commitments, demanding the minister explain policy pace, emission targets, or regulatory gaps.',
309
+ default: 'Environmental proposals must navigate competing interests from industry, regional governments, and EU climate commitments, making parliamentary support critical.'
310
+ },
311
+ sv: {
312
+ mot: 'Klimatmotioner speglar växande parlamentariskt tryck för snabbare koldioxidminskning och riktar sig ofta mot specifika branscher.',
313
+ bet: 'Miljöutskottet väger klimatambition mot ekonomisk konkurrenskraft – dess rekommendation sätter lagstiftningens utgångspunkt.',
314
+ ip: 'Denna interpellation ställer regeringen till svars för klimatåtaganden och kräver att ministern förklarar insatstakten, utsläppsmål eller regleringsbrister.',
315
+ default: 'Miljöförslag måste navigera konkurrerande intressen från industrin, regionerna och EU:s klimatåtaganden.'
316
+ },
317
+ de: { default: 'Umweltvorschläge müssen konkurrierende Interessen aus Industrie, regionalen Regierungen und EU-Klimaverpflichtungen ausbalancieren.' },
318
+ fr: { default: 'Les propositions environnementales doivent naviguer entre les intérêts concurrents de l\'industrie, des gouvernements régionaux et des engagements climatiques de l\'UE.' },
319
+ es: { default: 'Las propuestas medioambientales deben navegar entre los intereses en competencia de la industria, los gobiernos regionales y los compromisos climáticos de la UE.' },
320
+ },
321
+ 'healthcare policy': {
322
+ en: {
323
+ mot: 'Healthcare motions typically target gaps in regional service delivery, pressing for national minimum standards, additional funding, or new patient rights.',
324
+ bet: 'Social Affairs Committee reports on healthcare set the framework for Sweden\'s regionally delivered but nationally financed health system.',
325
+ ip: 'This interpellation demands ministerial accountability on healthcare, pressing for answers on waiting times, staffing shortages, or regional disparities in care quality.',
326
+ default: 'Healthcare proposals require coordination between national government, regional councils, and professional bodies — a complexity that shapes the legislative timeline.'
327
+ },
328
+ sv: {
329
+ mot: 'Hälso- och sjukvårdsmotioner riktar sig typiskt mot brister i regionala tjänster och driver på för nationella miniminivåer eller nya patienträttigheter.',
330
+ bet: 'Socialutskottets betänkanden om hälso- och sjukvård sätter ramarna för det regionalt levererade men nationellt finansierade hälsosystemet.',
331
+ ip: 'Denna interpellation kräver ministerns ansvarighet i hälso- och sjukvårdsfrågor och efterfrågar svar om väntetider, personalbrist eller regionala kvalitetsskillnader.',
332
+ default: 'Hälso- och sjukvårdspropositioner kräver samordning mellan stat, regioner och professioner – en komplexitet som formar lagstiftningens tidslinje.'
333
+ },
334
+ de: { default: 'Gesundheitsvorschläge erfordern Koordination zwischen nationaler Regierung, Regionalräten und Fachverbänden — eine Komplexität, die den Gesetzgebungszeitplan prägt.' },
335
+ fr: { default: 'Les propositions en matière de santé nécessitent une coordination entre le gouvernement national, les conseils régionaux et les organismes professionnels.' },
336
+ es: { default: 'Las propuestas sanitarias requieren coordinación entre el gobierno nacional, los consejos regionales y los organismos profesionales — una complejidad que determina el calendario legislativo.' },
337
+ },
338
+ 'migration policy': {
339
+ en: {
340
+ mot: 'Migration motions reflect one of Sweden\'s most contested policy areas, with parties divided on asylum rules, integration requirements, and deportation procedures.',
341
+ bet: 'The Social Insurance Committee\'s migration reports navigate Sweden\'s EU law obligations and UN Refugee Convention commitments alongside domestic political pressures.',
342
+ ip: 'This interpellation scrutinises government migration policy, compelling the minister to defend asylum processing timelines, integration outcomes, or border control measures.',
343
+ default: 'Migration proposals must balance EU regulatory obligations with national political imperatives, making cross-party support essential for durable legislation.'
344
+ },
345
+ sv: {
346
+ mot: 'Migrationsmotioner speglar ett av Sveriges mest omtvistade politikområden, med partier delade om asylregler, integrationskrav och återvändanderutiner.',
347
+ bet: 'Socialförsäkringsutskottets migrationsbetänkanden navigerar Sveriges åtaganden enligt EU-rätten och FN:s flyktingkonvention.',
348
+ ip: 'Denna interpellation granskar regeringens migrationspolitik och kräver att ministern försvarar handläggningstider, integrationsresultat eller gränskontrollåtgärder.',
349
+ default: 'Migrationspropositioner måste balansera EU-rättsliga förpliktelser med nationella politiska imperativ.'
350
+ },
351
+ de: { default: 'Migrationsvorschläge müssen EU-Regulierungsverpflichtungen mit nationalen politischen Erfordernissen in Einklang bringen — parteiübergreifende Unterstützung ist für dauerhafte Gesetzgebung unerlässlich.' },
352
+ fr: { default: 'Les propositions migratoires doivent équilibrer les obligations réglementaires de l\'UE et les impératifs politiques nationaux — le soutien multipartite est essentiel pour une législation durable.' },
353
+ es: { default: 'Las propuestas migratorias deben equilibrar las obligaciones regulatorias de la UE con los imperativos políticos nacionales, siendo el apoyo multipartidario esencial para una legislación duradera.' },
354
+ },
355
+ 'EU and foreign affairs': {
356
+ en: {
357
+ mot: 'EU and foreign affairs motions signal parliamentary expectations for government negotiating positions — influential despite executive prerogative in external relations.',
358
+ bet: 'The Foreign Affairs Committee\'s reports on EU matters reflect Sweden\'s positioning within the bloc and may bind future negotiating postures.',
359
+ ip: 'This interpellation exercises parliamentary oversight on foreign affairs, demanding the minister clarify Sweden\'s diplomatic stance or EU negotiating position on a specific issue.',
360
+ default: 'EU and foreign affairs proposals engage Sweden\'s treaty obligations and often require coordination with European partners before domestic enactment.'
361
+ },
362
+ sv: {
363
+ mot: 'EU- och utrikespolitiska motioner signalerar parlamentets förväntningar på regeringens förhandlingspositioner.',
364
+ bet: 'Utrikesutskottets betänkanden om EU-frågor speglar Sveriges positionering inom unionen och kan binda framtida förhandlingslinjer.',
365
+ ip: 'Denna interpellation utövar parlamentarisk kontroll över utrikespolitiken och kräver att ministern klargör Sveriges diplomatiska hållning eller EU-förhandlingsposition.',
366
+ default: 'EU- och utrikespropositioner engagerar Sveriges fördragsförpliktelser och kräver samordning med europeiska partner.'
367
+ },
368
+ de: { default: 'EU- und Außenpolitikvorschläge berühren Schwedens Vertragserpflichtungen und erfordern oft eine Koordination mit europäischen Partnern.' },
369
+ fr: { default: 'Les propositions en matière d\'UE et d\'affaires étrangères engagent les obligations conventionnelles de la Suède et nécessitent souvent une coordination avec les partenaires européens.' },
370
+ es: { default: 'Las propuestas de la UE y de asuntos exteriores comprometen las obligaciones convencionales de Suecia y a menudo requieren coordinación con los socios europeos.' },
371
+ },
372
+ 'justice policy': {
373
+ en: {
374
+ mot: 'Justice motions address crime, sentencing, and policing — areas with high public salience where opposition parties frequently press for tougher or more targeted measures.',
375
+ bet: 'The Justice Committee shapes the criminal law framework; its reports on sentencing and policing directly affect prosecution practice and enforcement priorities.',
376
+ ip: 'This interpellation holds the justice minister accountable on crime, sentencing, or policing — demanding specific answers on policy outcomes or enforcement gaps.',
377
+ default: 'Justice proposals balance rule-of-law principles, human rights obligations, and public safety demands — requiring careful drafting to withstand constitutional scrutiny.'
378
+ },
379
+ sv: {
380
+ mot: 'Rättsliga motioner rör brott, straff och polis – frågor med hög allmän relevans där oppositionen ofta driver på för hårdare åtgärder.',
381
+ bet: 'Justitieutskottet formar den straffrättsliga ramen; dess betänkanden om straffsatser och polisverksamhet påverkar direkt åklagarnas praxis.',
382
+ ip: 'Denna interpellation ställer justitieministern till svars för brotts-, straff- eller polisfrågor och kräver specifika svar om policyresultat eller verkställighetsbrister.',
383
+ default: 'Rättsliga propositioner balanserar rättsstatsprinciper, mänskliga rättigheter och allmän säkerhet.'
384
+ },
385
+ de: { default: 'Justizvorschläge balancieren Rechtsstaatsprinzipien, Menschenrechtsverpflichtungen und öffentliche Sicherheitsforderungen — sorgfältige Ausarbeitung ist erforderlich, um der verfassungsrechtlichen Prüfung standzuhalten.' },
386
+ fr: { default: 'Les propositions de justice équilibrent les principes de l\'État de droit, les obligations en matière de droits de l\'homme et les exigences de sécurité publique.' },
387
+ es: { default: 'Las propuestas de justicia equilibran los principios del Estado de derecho, las obligaciones de derechos humanos y las demandas de seguridad pública — requiriendo una redacción cuidadosa para resistir el escrutinio constitucional.' },
388
+ },
389
+ 'labour market policy': {
390
+ en: {
391
+ mot: 'Labour market motions engage sensitive negotiations between employers, unions, and the state — every motion sends a signal to Sweden\'s social partners.',
392
+ bet: 'The Labour Committee\'s reports on workplace legislation must navigate collective bargaining autonomy while setting minimum statutory floors.',
393
+ ip: 'This interpellation demands government accountability on labour market policy, pressing the minister to explain employment outcomes, working conditions, or regulatory changes.',
394
+ default: 'Labour market proposals enter an arena where tripartite negotiation shapes the final legislative outcome as much as parliamentary votes.'
395
+ },
396
+ sv: {
397
+ mot: 'Arbetsmarknadsmotioner engagerar känsliga förhandlingar mellan arbetsgivare, fackförbund och stat – varje motion signalerar till parterna.',
398
+ bet: 'Arbetsmarknadsutskottets betänkanden om arbetsplatslagar måste navigera kollektivavtalens självständighet.',
399
+ ip: 'Denna interpellation kräver regeringens ansvarighet i arbetsmarknadspolitiken och pressar ministern att förklara sysselsättningsresultat, arbetsvillkor eller regeländringar.',
400
+ default: 'Arbetsmarknadspropositioner träder in i en arena där trepartsförhandlingar formar det slutliga lagstiftningsresultatet.'
401
+ },
402
+ de: { default: 'Arbeitsmarktvorschläge betreten eine Arena, in der Tarifverhandlungen das Gesetzgebungsergebnis ebenso stark prägen wie Parlamentsabstimmungen.' },
403
+ fr: { default: 'Les propositions sur le marché du travail entrent dans une arène où la négociation tripartite détermine le résultat législatif autant que les votes parlementaires.' },
404
+ es: { default: 'Las propuestas del mercado laboral entran en una arena donde la negociación tripartita determina el resultado legislativo tanto como los votos parlamentarios.' },
405
+ },
406
+ 'housing policy': {
407
+ en: {
408
+ mot: 'Housing motions reflect structural tension between demand for affordable homes and constraints of planning law, rent regulation, and construction cost pressures.',
409
+ bet: 'The Civil Affairs Committee\'s housing reports address one of Sweden\'s most persistent policy challenges, where committee decisions unlock or block major regulatory change.',
410
+ ip: 'This interpellation scrutinises government housing policy, demanding the minister address affordability crises, construction targets, or rent regulation gaps.',
411
+ default: 'Housing proposals must reconcile competing interests from municipalities, property owners, tenants, and developers — a coalition rarely achieved quickly.'
412
+ },
413
+ sv: {
414
+ mot: 'Bostadsmotioner speglar strukturell spänning mellan efterfrågan på prisvärda bostäder och begränsningarna i plan- och hyreslagstiftning.',
415
+ bet: 'Civilutskottets bostadsbetänkanden hanterar en av Sveriges mest ihållande politiska utmaningar.',
416
+ ip: 'Denna interpellation granskar regeringens bostadspolitik och kräver att ministern besvarar frågor om tillgänglighetskriser, byggmål eller brister i hyresreglering.',
417
+ default: 'Bostadspropositioner måste balansera konkurrerande intressen från kommuner, fastighetsägare, hyresgäster och byggföretag.'
418
+ },
419
+ de: { default: 'Wohnungsvorschläge müssen konkurrierende Interessen von Gemeinden, Eigentümern, Mietern und Bauträgern in Einklang bringen.' },
420
+ fr: { default: 'Les propositions de logement doivent concilier les intérêts concurrents des municipalités, propriétaires, locataires et promoteurs.' },
421
+ es: { default: 'Las propuestas de vivienda deben conciliar los intereses en competencia de municipios, propietarios, inquilinos y promotores.' },
422
+ },
423
+ 'transport policy': {
424
+ en: {
425
+ mot: 'Transport motions address infrastructure investment, road safety, and public transit — areas where regional and national interests frequently diverge.',
426
+ bet: 'The Transport Committee\'s reports guide Sweden\'s national infrastructure planning cycle, directly affecting long-term investment priorities.',
427
+ ip: 'This interpellation demands accountability on transport policy, pressing the minister to justify infrastructure priorities, maintenance backlogs, or transit funding decisions.',
428
+ default: 'Transport proposals engage the national infrastructure budget, regional equity, and climate transition targets — all must be balanced in committee deliberation.'
429
+ },
430
+ sv: {
431
+ mot: 'Transportmotioner rör infrastrukturinvesteringar, trafiksäkerhet och kollektivtrafik – frågor där regionala och nationella intressen ofta divergerar.',
432
+ bet: 'Trafikutskottets betänkanden vägleder Sveriges nationella infrastrukturplanering och påverkar direkt långsiktiga investeringsprioriteringar.',
433
+ ip: 'Denna interpellation kräver ansvarighet i transportpolitiken och pressar ministern att motivera infrastrukturprioriteringar, underhållsskulder eller kollektivtrafikfinansiering.',
434
+ default: 'Transportpropositioner engagerar den nationella infrastrukturbudgeten, regional jämlikhet och klimatomställningsmål.'
435
+ },
436
+ de: { default: 'Verkehrsvorschläge betreffen den nationalen Infrastrukturhaushalt, regionale Gerechtigkeit und Klimaübergangsziele.' },
437
+ fr: { default: 'Les propositions de transport concernent le budget national d\'infrastructure, l\'équité régionale et les objectifs de transition climatique.' },
438
+ es: { default: 'Las propuestas de transporte implican el presupuesto nacional de infraestructura, la equidad regional y los objetivos de transición climática.' },
439
+ },
440
+ 'trade and industry policy': {
441
+ en: {
442
+ mot: 'Industry and trade motions often target competitiveness, innovation, or trade agreements — signalling party positions ahead of EU-level or bilateral negotiations.',
443
+ bet: 'The Committee on Industry and Trade shapes Sweden\'s business environment through reports that set conditions for investment, innovation, and exports.',
444
+ ip: 'This interpellation demands government accountability on trade and industry, pressing the minister to explain competitiveness measures, innovation spending, or trade negotiation outcomes.',
445
+ default: 'Industry and trade proposals engage international commitments, EU single-market rules, and domestic competitiveness imperatives simultaneously.'
446
+ },
447
+ sv: {
448
+ mot: 'Näringspolitiska motioner riktar sig ofta mot konkurrenskraft, innovation eller handelsavtal och signalerar partipositioner inför förhandlingar.',
449
+ bet: 'Näringsutskottets betänkanden formar Sveriges affärsmiljö och sätter villkoren för investeringar och export.',
450
+ ip: 'Denna interpellation kräver regeringens ansvarighet i närings- och handelspolitiken och pressar ministern att förklara konkurrenskraftsåtgärder, innovationssatsningar eller handelsförhandlingsresultat.',
451
+ default: 'Näringspolitiska propositioner engagerar internationella åtaganden, EU:s inre marknadsregler och inhemsk konkurrenskraft.'
452
+ },
453
+ de: { default: 'Industrie- und Handelsvorschläge berühren gleichzeitig internationale Verpflichtungen, EU-Binnenmarktregeln und inländische Wettbewerbserfordernisse.' },
454
+ fr: { default: 'Les propositions industrielles et commerciales engagent simultanément des engagements internationaux, les règles du marché unique européen et les impératifs de compétitivité nationale.' },
455
+ es: { default: 'Las propuestas industriales y comerciales comprometen simultáneamente compromisos internacionales, normas del mercado único europeo e imperativos de competitividad nacional.' },
456
+ },
457
+ 'education policy': {
458
+ en: {
459
+ mot: 'Education motions reflect deep disagreements on school standards, teacher pay, and the role of independent schools — one of Sweden\'s most contested domestic debates.',
460
+ bet: 'The Education Committee\'s reports directly shape curriculum standards, funding formulas, and school regulation — decisions with long generational consequences.',
461
+ ip: 'This interpellation scrutinises education policy, pressing the minister to account for school quality, teacher shortages, or the regulation of independent schools.',
462
+ default: 'Education proposals must balance national curriculum standards with municipal delivery autonomy and the contested role of private providers in the Swedish school system.'
463
+ },
464
+ sv: {
465
+ mot: 'Utbildningsmotioner speglar djupa meningsskiljaktigheter om skolstandard, lärarlöner och friskolornas roll.',
466
+ bet: 'Utbildningsutskottets betänkanden formar direkt läroplaner, finansieringsmodeller och skolreglering.',
467
+ ip: 'Denna interpellation granskar utbildningspolitiken och kräver att ministern redovisar skolkvalitet, lärarbrist eller regleringen av fristående skolor.',
468
+ default: 'Utbildningspropositioner måste balansera nationella läroplaner med kommunalt leveransansvar och de privata aktörernas omstridda roll.'
469
+ },
470
+ de: { default: 'Bildungsvorschläge müssen nationale Lehrplanstandards mit kommunaler Durchführungsautonomie und der umstrittenen Rolle privater Anbieter im schwedischen Schulsystem ausbalancieren.' },
471
+ fr: { default: 'Les propositions éducatives doivent équilibrer les normes nationales de programme avec l\'autonomie de prestation municipale et le rôle controversé des prestataires privés dans le système scolaire suédois.' },
472
+ es: { default: 'Las propuestas educativas deben equilibrar los estándares curriculares nacionales con la autonomía de prestación municipal y el controvertido papel de los proveedores privados en el sistema escolar sueco.' },
473
+ }
474
+ };
475
+ /** Module-level constant — reverse lookup from any localised domain name to English key. */
476
+ const EN_DOMAIN_MAP = _LOCALISED_TO_EN;
477
+ /**
478
+ * Return a substantive domain-specific and type-specific analysis sentence.
479
+ * Each of 12 policy domains has tailored text for motions (mot), committee
480
+ * reports (bet), interpellations (ip), and propositions/default. English and
481
+ * Swedish are always present; other languages fall back per-key to English.
482
+ */
483
+ export function getDomainSpecificAnalysis(primaryDomain, doktyp, lang) {
484
+ const lookupKey = EN_DOMAIN_MAP[primaryDomain] ?? primaryDomain;
485
+ const entry = DOMAIN_ANALYSES[lookupKey];
486
+ if (!entry)
487
+ return '';
488
+ // Per-key fallback: prefer entry[lang][typeKey], else entry.en[typeKey],
489
+ // then entry[lang].default, then entry.en.default.
490
+ const langKey = lang;
491
+ const typeKey = (doktyp === 'mot' || doktyp === 'bet' || doktyp === 'ip') ? doktyp : 'default';
492
+ const langEntry = entry[langKey];
493
+ if (langEntry?.[typeKey])
494
+ return langEntry[typeKey];
495
+ if (entry.en[typeKey])
496
+ return entry.en[typeKey];
497
+ if (langEntry?.['default'])
498
+ return langEntry['default'];
499
+ return entry.en['default'] ?? '';
500
+ }
501
+ /**
502
+ * Localised interpellation fallback text: references minister obligation
503
+ * to respond, not committee review. Hoisted to module-level to avoid
504
+ * per-call allocation inside generatePolicySignificance().
505
+ */
506
+ const IP_FALLBACK = {
507
+ sv: 'Interpellationen debatteras i kammaren där ministern är skyldig att svara och förklara sina beslut.',
508
+ da: 'Interpellationen debatteres i Riksdagens kammare, hvor ministeren er forpligtet til at svare og stå til ansvar.',
509
+ no: 'Interpellasjonen debatteres i Riksdagens kammare, der ministeren er forpliktet til å svare og stå til ansvar.',
510
+ fi: 'Välikysymys käsitellään Riksdagin täysistunnossa, jossa ministerin on vastattava ja oltava tilivelvollinen.',
511
+ de: 'Die Interpellation wird in der Kammer debattiert, wobei der Minister verpflichtet ist, Rede und Antwort zu stehen.',
512
+ fr: "L'interpellation est débattue en séance plénière, où le ministre est tenu de répondre et de rendre des comptes.",
513
+ es: 'La interpelación se debate en el pleno, donde el ministro está obligado a responder y rendir cuentas.',
514
+ nl: 'De interpellatie wordt besproken in de Kamer, waar de minister verplicht is te antwoorden en verantwoording af te leggen.',
515
+ ar: 'تتم مناقشة الاستجواب في الجلسة العامة حيث يتعين على الوزير الرد وتحمل المسؤولية.',
516
+ he: 'האינטרפלציה נדונה במליאה, שם השר מחויב להשיב ולתת דין וחשבון.',
517
+ ja: '質問主意書は本会議で審議され、大臣は答弁と説明責任を果たす義務があります。',
518
+ ko: '대정부질문은 본회의에서 논의되며, 장관은 답변하고 책임을 져야 할 의무가 있습니다.',
519
+ zh: '质询在全体会议上进行辩论,部长有义务回应并承担责任。',
520
+ };
521
+ /**
522
+ * Generate policy significance context for a document based on its metadata.
523
+ * Uses the localised policySignificanceTouches label plus a domain-specific
524
+ * analysis sentence instead of generic boilerplate.
525
+ * Falls back to a committee-specific sentence (derived from COMMITTEE_NAMES)
526
+ * when no domain keyword matches but the document's organ field identifies a
527
+ * known Riksdag committee.
528
+ * @param impliedDoktyp - document type inferred from the calling context
529
+ * ('mot', 'bet', 'prop', 'ip') when doc.doktyp / doc.documentType is absent.
530
+ */
531
+ export function generatePolicySignificance(doc, lang, impliedDoktyp) {
532
+ const domains = detectPolicyDomains(doc, lang);
533
+ if (domains.length > 0) {
534
+ const domainsStr = domains.join(', ');
535
+ const touchesFn = L(lang, 'policySignificanceTouches');
536
+ const baseText = typeof touchesFn === 'function'
537
+ ? touchesFn(escapeHtml(domainsStr))
538
+ : `Touches on ${escapeHtml(domainsStr)}.`;
539
+ const doktyp = doc.doktyp || doc.documentType || impliedDoktyp || '';
540
+ const deepAnalysis = getDomainSpecificAnalysis(domains[0] ?? '', doktyp, lang);
541
+ return deepAnalysis ? `${baseText} ${deepAnalysis}` : baseText;
542
+ }
543
+ // Secondary: committee-specific context when organ is present but no domain matched
544
+ const organ = doc.organ || doc.committee || '';
545
+ if (organ) {
546
+ const organEntry = COMMITTEE_NAMES[organ];
547
+ if (organEntry) {
548
+ const committeeRefTemplates = {
549
+ sv: (n) => `Ärendet behandlas av ${n.toLowerCase()} för parlamentarisk beredning.`,
550
+ da: (n) => `Sagen behandles af ${n} til parlamentarisk behandling.`,
551
+ no: (n) => `Saken behandles av ${n} for parlamentarisk behandling.`,
552
+ fi: (n) => `Asia käsitellään valiokunnassa ${n} parlamentaarista käsittelyä varten.`,
553
+ de: (n) => `Die Angelegenheit wird dem ${n} zur parlamentarischen Prüfung überwiesen.`,
554
+ fr: (n) => `L'affaire est renvoyée à la ${n} pour examen parlementaire.`,
555
+ es: (n) => `El asunto se remite a la ${n} para examen parlamentario.`,
556
+ nl: (n) => `De zaak wordt verwezen naar de ${n} voor parlementaire behandeling.`,
557
+ ar: (n) => `تم إحالة الموضوع إلى ${n} للنظر البرلماني.`,
558
+ he: (n) => `הנושא הועבר ל${n} לבחינה פרלמנטרית.`,
559
+ ja: (n) => `この件は${n}に付託され、議会審議が行われます。`,
560
+ ko: (n) => `이 안건은 ${n}에 회부되어 의회 심의를 받습니다.`,
561
+ zh: (n) => `此事项已移交${n}进行议会审查。`,
562
+ };
563
+ // Use getCommitteeName for consistent localization: Swedish name for sv,
564
+ // English name for all others (client-side data-translate handles further l10n)
565
+ const committeeName = getCommitteeName(organ, lang);
566
+ const tpl = committeeRefTemplates[lang];
567
+ return tpl
568
+ ? tpl(committeeName)
569
+ : `This matter is referred to the ${organEntry.en} for parliamentary examination.`;
570
+ }
571
+ }
572
+ // Interpellation-specific fallback: references minister obligation, not committee review
573
+ const doktyp2 = doc.doktyp || doc.documentType || impliedDoktyp || '';
574
+ if (doktyp2 === 'ip') {
575
+ return IP_FALLBACK[lang]
576
+ ?? 'The interpellation is debated in the chamber, where the minister is obliged to respond and be held accountable.';
577
+ }
578
+ // Generic significance when no domain detected and no known committee
579
+ const genericVal = L(lang, 'policySignificanceGeneric');
580
+ return typeof genericVal === 'string' ? genericVal : 'Requires committee review and chamber debate before a decision is reached.';
581
+ }
582
+ /**
583
+ * Generate deep policy analysis for a single document entry.
584
+ * Only uses `fullText` / `fullContent` (enriched content fetched separately)
585
+ * as the passage source — summary/notis are already shown in the summary line
586
+ * above in structured views and must not be duplicated here.
587
+ * Falls back to generatePolicySignificance when no enriched text is available.
588
+ * @param impliedDoktyp - document type inferred from the calling context
589
+ * ('mot', 'bet', 'prop', 'ip') when doc.doktyp / doc.documentType is absent.
590
+ */
591
+ export function generateDeepPolicyAnalysis(doc, lang, impliedDoktyp, maxPassageChars = 300) {
592
+ const effectiveDoktyp = doc.doktyp || doc.documentType || impliedDoktyp || '';
593
+ const rawText = doc.fullText || doc.fullContent || '';
594
+ if (rawText && !isPersonProfileText(rawText)) {
595
+ const cleanedText = (effectiveDoktyp === 'mot' && rawText.includes('Motion till riksdagen'))
596
+ ? cleanMotionText(rawText)
597
+ : rawText;
598
+ const passage = extractKeyPassage(cleanedText, maxPassageChars);
599
+ if (passage) {
600
+ const isSwedishSource = !!(doc.titel && !doc.title);
601
+ const passageHtml = isSwedishSource
602
+ ? svSpan(escapeHtml(passage), lang)
603
+ : escapeHtml(passage);
604
+ return `${passageHtml} ${generatePolicySignificance(doc, lang, impliedDoktyp)}`;
605
+ }
606
+ }
607
+ return generatePolicySignificance(doc, lang, impliedDoktyp);
608
+ }
609
+ // ---------------------------------------------------------------------------
610
+ // SCB (Statistics Sweden) table mapping for policy domains
611
+ // ---------------------------------------------------------------------------
612
+ /**
613
+ * Maps policy domain keys to relevant SCB table IDs and search queries
614
+ * for enriching political analysis with official statistics.
615
+ *
616
+ * Each entry contains:
617
+ * - `query` — Swedish-language search terms for `search_tables()` SCB MCP tool
618
+ * - `tables` — Known SCB table IDs (e.g. "TAB5765" for unemployment) for `get_table_data()`
619
+ * - `indicators` — Human-readable indicator names expected from the tables
620
+ *
621
+ * SCB MCP tools: search_tables, get_table_data, get_table_variables, preview_data, find_region_code
622
+ * Source: https://scb-mcp.onrender.com/mcp (PxWebAPI 2.0)
623
+ */
624
+ export const SCB_DOMAIN_TABLES = {
625
+ fiscal: {
626
+ query: 'skatter statsbudget offentliga finanser',
627
+ tables: ['TAB1291', 'TAB1292'],
628
+ indicators: ['Government revenue', 'Government expenditure', 'Budget balance'],
629
+ },
630
+ defence: {
631
+ query: 'försvar militär offentliga utgifter',
632
+ tables: [],
633
+ indicators: ['Defence spending as % of GDP'],
634
+ },
635
+ environment: {
636
+ query: 'växthusgaser utsläpp miljö',
637
+ tables: ['TAB5404', 'TAB5407'],
638
+ indicators: ['GHG emissions (kt CO₂e)', 'Renewable energy share'],
639
+ },
640
+ education: {
641
+ query: 'utbildning studenter skola',
642
+ tables: ['TAB4787', 'TAB4790'],
643
+ indicators: ['Student enrollment', 'Graduation rates', 'Education spending'],
644
+ },
645
+ healthcare: {
646
+ query: 'hälsa sjukvård vård',
647
+ tables: [],
648
+ indicators: ['Healthcare spending', 'Hospital beds per capita'],
649
+ },
650
+ migration: {
651
+ query: 'invandring utvandring migration befolkning',
652
+ tables: ['TAB637', 'TAB4230'],
653
+ indicators: ['Immigration', 'Emigration', 'Net migration'],
654
+ },
655
+ 'eu-foreign': {
656
+ query: 'utrikeshandel export import',
657
+ tables: ['TAB2661'],
658
+ indicators: ['Export value', 'Import value', 'Trade balance'],
659
+ },
660
+ justice: {
661
+ query: 'brott lagföringar kriminalstatistik',
662
+ tables: ['TAB1172'],
663
+ indicators: ['Reported crimes', 'Conviction rate'],
664
+ },
665
+ labour: {
666
+ query: 'sysselsättning arbetslöshet arbetsmarknad',
667
+ tables: ['TAB5765', 'TAB5616'],
668
+ indicators: ['Unemployment rate', 'Employment rate', 'Labour force participation'],
669
+ },
670
+ housing: {
671
+ query: 'bostäder nybyggnation hyror',
672
+ tables: ['TAB2052', 'TAB4709'],
673
+ indicators: ['Housing starts', 'Housing prices index'],
674
+ },
675
+ transport: {
676
+ query: 'trafik transport infrastruktur',
677
+ tables: [],
678
+ indicators: ['Road traffic volume', 'Public transport ridership'],
679
+ },
680
+ trade: {
681
+ query: 'näringsliv företag BNP',
682
+ tables: ['TAB5802', 'TAB5803'],
683
+ indicators: ['GDP growth', 'Business starts', 'Industrial production index'],
684
+ },
685
+ };
686
+ //# sourceMappingURL=policy-analysis.js.map