riksdagsmonitor 0.8.14 → 0.8.17

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 (663) 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 +645 -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 +701 -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/{chart-factory.d.ts → shared/chart-factory.d.ts} +9 -2
  70. package/dist/lib/shared/chart-factory.d.ts.map +1 -0
  71. package/dist/lib/{chart-factory.js → shared/chart-factory.js} +9 -2
  72. package/dist/lib/shared/chart-factory.js.map +1 -0
  73. package/dist/lib/shared/data-loader.d.ts.map +1 -0
  74. package/dist/lib/shared/data-loader.js.map +1 -0
  75. package/dist/lib/shared/dom-utils.d.ts.map +1 -0
  76. package/dist/lib/shared/dom-utils.js.map +1 -0
  77. package/dist/lib/shared/error-boundary.d.ts.map +1 -0
  78. package/dist/lib/shared/error-boundary.js.map +1 -0
  79. package/dist/lib/shared/fallback-ui.d.ts.map +1 -0
  80. package/dist/lib/shared/fallback-ui.js.map +1 -0
  81. package/dist/lib/shared/index.d.ts.map +1 -0
  82. package/dist/lib/shared/index.js.map +1 -0
  83. package/dist/lib/shared/logger.d.ts.map +1 -0
  84. package/dist/lib/shared/logger.js.map +1 -0
  85. package/dist/lib/shared/register-globals.d.ts +14 -0
  86. package/dist/lib/shared/register-globals.d.ts.map +1 -0
  87. package/dist/lib/shared/register-globals.js +21 -0
  88. package/dist/lib/shared/register-globals.js.map +1 -0
  89. package/dist/lib/{theme.d.ts → shared/theme.d.ts} +1 -18
  90. package/dist/lib/shared/theme.d.ts.map +1 -0
  91. package/dist/lib/{theme.js → shared/theme.js} +1 -18
  92. package/dist/lib/shared/theme.js.map +1 -0
  93. package/dist/lib/shared/types.d.ts.map +1 -0
  94. package/dist/lib/shared/types.js.map +1 -0
  95. package/dist/lib/ui/back-to-top.d.ts +13 -0
  96. package/dist/lib/ui/back-to-top.d.ts.map +1 -0
  97. package/dist/lib/ui/back-to-top.js +48 -0
  98. package/dist/lib/ui/back-to-top.js.map +1 -0
  99. package/dist/scripts/analysis-reader.d.ts +241 -0
  100. package/dist/scripts/analysis-reader.d.ts.map +1 -0
  101. package/dist/scripts/analysis-reader.js +495 -0
  102. package/dist/scripts/analysis-reader.js.map +1 -0
  103. package/dist/scripts/article-quality-enhancer.d.ts +148 -0
  104. package/dist/scripts/article-quality-enhancer.d.ts.map +1 -0
  105. package/dist/scripts/article-quality-enhancer.js +430 -0
  106. package/dist/scripts/article-quality-enhancer.js.map +1 -0
  107. package/dist/scripts/article-template/constants.d.ts +104 -0
  108. package/dist/scripts/article-template/constants.d.ts.map +1 -0
  109. package/dist/scripts/article-template/constants.js +225 -0
  110. package/dist/scripts/article-template/constants.js.map +1 -0
  111. package/dist/scripts/article-template/helpers.d.ts +83 -0
  112. package/dist/scripts/article-template/helpers.d.ts.map +1 -0
  113. package/dist/scripts/article-template/helpers.js +236 -0
  114. package/dist/scripts/article-template/helpers.js.map +1 -0
  115. package/dist/scripts/article-template/index.d.ts +39 -0
  116. package/dist/scripts/article-template/index.d.ts.map +1 -0
  117. package/dist/scripts/article-template/index.js +37 -0
  118. package/dist/scripts/article-template/index.js.map +1 -0
  119. package/dist/scripts/article-template/registry.d.ts +64 -0
  120. package/dist/scripts/article-template/registry.d.ts.map +1 -0
  121. package/dist/scripts/article-template/registry.js +405 -0
  122. package/dist/scripts/article-template/registry.js.map +1 -0
  123. package/dist/scripts/article-template/template.d.ts +18 -0
  124. package/dist/scripts/article-template/template.d.ts.map +1 -0
  125. package/dist/scripts/article-template/template.js +359 -0
  126. package/dist/scripts/article-template/template.js.map +1 -0
  127. package/dist/scripts/article-template/types.d.ts +90 -0
  128. package/dist/scripts/article-template/types.d.ts.map +1 -0
  129. package/dist/scripts/article-template/types.js +96 -0
  130. package/dist/scripts/article-template/types.js.map +1 -0
  131. package/dist/scripts/article-template.d.ts +18 -0
  132. package/dist/scripts/article-template.d.ts.map +1 -0
  133. package/dist/scripts/article-template.js +18 -0
  134. package/dist/scripts/article-template.js.map +1 -0
  135. package/dist/scripts/catalog-downloaded-data.d.ts +66 -0
  136. package/dist/scripts/catalog-downloaded-data.d.ts.map +1 -0
  137. package/dist/scripts/catalog-downloaded-data.js +239 -0
  138. package/dist/scripts/catalog-downloaded-data.js.map +1 -0
  139. package/dist/scripts/check-cia-schema-updates.d.ts +186 -0
  140. package/dist/scripts/check-cia-schema-updates.d.ts.map +1 -0
  141. package/dist/scripts/check-cia-schema-updates.js +363 -0
  142. package/dist/scripts/check-cia-schema-updates.js.map +1 -0
  143. package/dist/scripts/data-transformers/calendar.d.ts +16 -0
  144. package/dist/scripts/data-transformers/calendar.d.ts.map +1 -0
  145. package/dist/scripts/data-transformers/calendar.js +137 -0
  146. package/dist/scripts/data-transformers/calendar.js.map +1 -0
  147. package/dist/scripts/data-transformers/constants/committee-names.d.ts +15 -0
  148. package/dist/scripts/data-transformers/constants/committee-names.d.ts.map +1 -0
  149. package/dist/scripts/data-transformers/constants/committee-names.js +30 -0
  150. package/dist/scripts/data-transformers/constants/committee-names.js.map +1 -0
  151. package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts +11 -0
  152. package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts.map +1 -0
  153. package/dist/scripts/data-transformers/constants/content-labels-part1.js +900 -0
  154. package/dist/scripts/data-transformers/constants/content-labels-part1.js.map +1 -0
  155. package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts +11 -0
  156. package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts.map +1 -0
  157. package/dist/scripts/data-transformers/constants/content-labels-part2.js +900 -0
  158. package/dist/scripts/data-transformers/constants/content-labels-part2.js.map +1 -0
  159. package/dist/scripts/data-transformers/constants/content-labels.d.ts +13 -0
  160. package/dist/scripts/data-transformers/constants/content-labels.d.ts.map +1 -0
  161. package/dist/scripts/data-transformers/constants/content-labels.js +18 -0
  162. package/dist/scripts/data-transformers/constants/content-labels.js.map +1 -0
  163. package/dist/scripts/data-transformers/constants/index.d.ts +15 -0
  164. package/dist/scripts/data-transformers/constants/index.d.ts.map +1 -0
  165. package/dist/scripts/data-transformers/constants/index.js +15 -0
  166. package/dist/scripts/data-transformers/constants/index.js.map +1 -0
  167. package/dist/scripts/data-transformers/constants/locale-map.d.ts +13 -0
  168. package/dist/scripts/data-transformers/constants/locale-map.d.ts.map +1 -0
  169. package/dist/scripts/data-transformers/constants/locale-map.js +17 -0
  170. package/dist/scripts/data-transformers/constants/locale-map.js.map +1 -0
  171. package/dist/scripts/data-transformers/constants.d.ts +14 -0
  172. package/dist/scripts/data-transformers/constants.d.ts.map +1 -0
  173. package/dist/scripts/data-transformers/constants.js +14 -0
  174. package/dist/scripts/data-transformers/constants.js.map +1 -0
  175. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts +64 -0
  176. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts.map +1 -0
  177. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js +805 -0
  178. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js.map +1 -0
  179. package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts +50 -0
  180. package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts.map +1 -0
  181. package/dist/scripts/data-transformers/content-generators/cia-overview-section.js +310 -0
  182. package/dist/scripts/data-transformers/content-generators/cia-overview-section.js.map +1 -0
  183. package/dist/scripts/data-transformers/content-generators/committee.d.ts +12 -0
  184. package/dist/scripts/data-transformers/content-generators/committee.d.ts.map +1 -0
  185. package/dist/scripts/data-transformers/content-generators/committee.js +247 -0
  186. package/dist/scripts/data-transformers/content-generators/committee.js.map +1 -0
  187. package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts +124 -0
  188. package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts.map +1 -0
  189. package/dist/scripts/data-transformers/content-generators/dashboard-section.js +564 -0
  190. package/dist/scripts/data-transformers/content-generators/dashboard-section.js.map +1 -0
  191. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts +82 -0
  192. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts.map +1 -0
  193. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js +321 -0
  194. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js.map +1 -0
  195. package/dist/scripts/data-transformers/content-generators/generic.d.ts +12 -0
  196. package/dist/scripts/data-transformers/content-generators/generic.d.ts.map +1 -0
  197. package/dist/scripts/data-transformers/content-generators/generic.js +295 -0
  198. package/dist/scripts/data-transformers/content-generators/generic.js.map +1 -0
  199. package/dist/scripts/data-transformers/content-generators/index.d.ts +84 -0
  200. package/dist/scripts/data-transformers/content-generators/index.d.ts.map +1 -0
  201. package/dist/scripts/data-transformers/content-generators/index.js +47 -0
  202. package/dist/scripts/data-transformers/content-generators/index.js.map +1 -0
  203. package/dist/scripts/data-transformers/content-generators/interpellations.d.ts +12 -0
  204. package/dist/scripts/data-transformers/content-generators/interpellations.d.ts.map +1 -0
  205. package/dist/scripts/data-transformers/content-generators/interpellations.js +124 -0
  206. package/dist/scripts/data-transformers/content-generators/interpellations.js.map +1 -0
  207. package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts +137 -0
  208. package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts.map +1 -0
  209. package/dist/scripts/data-transformers/content-generators/mindmap-section.js +286 -0
  210. package/dist/scripts/data-transformers/content-generators/mindmap-section.js.map +1 -0
  211. package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts +17 -0
  212. package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts.map +1 -0
  213. package/dist/scripts/data-transformers/content-generators/month-ahead.js +212 -0
  214. package/dist/scripts/data-transformers/content-generators/month-ahead.js.map +1 -0
  215. package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts +17 -0
  216. package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts.map +1 -0
  217. package/dist/scripts/data-transformers/content-generators/monthly-review.js +173 -0
  218. package/dist/scripts/data-transformers/content-generators/monthly-review.js.map +1 -0
  219. package/dist/scripts/data-transformers/content-generators/motions.d.ts +12 -0
  220. package/dist/scripts/data-transformers/content-generators/motions.d.ts.map +1 -0
  221. package/dist/scripts/data-transformers/content-generators/motions.js +158 -0
  222. package/dist/scripts/data-transformers/content-generators/motions.js.map +1 -0
  223. package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts +52 -0
  224. package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts.map +1 -0
  225. package/dist/scripts/data-transformers/content-generators/newsworthiness.js +244 -0
  226. package/dist/scripts/data-transformers/content-generators/newsworthiness.js.map +1 -0
  227. package/dist/scripts/data-transformers/content-generators/propositions.d.ts +12 -0
  228. package/dist/scripts/data-transformers/content-generators/propositions.d.ts.map +1 -0
  229. package/dist/scripts/data-transformers/content-generators/propositions.js +263 -0
  230. package/dist/scripts/data-transformers/content-generators/propositions.js.map +1 -0
  231. package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts +92 -0
  232. package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts.map +1 -0
  233. package/dist/scripts/data-transformers/content-generators/sankey-section.js +257 -0
  234. package/dist/scripts/data-transformers/content-generators/sankey-section.js.map +1 -0
  235. package/dist/scripts/data-transformers/content-generators/shared.d.ts +123 -0
  236. package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +1 -0
  237. package/dist/scripts/data-transformers/content-generators/shared.js +919 -0
  238. package/dist/scripts/data-transformers/content-generators/shared.js.map +1 -0
  239. package/dist/scripts/data-transformers/content-generators/swot-section.d.ts +50 -0
  240. package/dist/scripts/data-transformers/content-generators/swot-section.d.ts.map +1 -0
  241. package/dist/scripts/data-transformers/content-generators/swot-section.js +177 -0
  242. package/dist/scripts/data-transformers/content-generators/swot-section.js.map +1 -0
  243. package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts +12 -0
  244. package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts.map +1 -0
  245. package/dist/scripts/data-transformers/content-generators/week-ahead.js +332 -0
  246. package/dist/scripts/data-transformers/content-generators/week-ahead.js.map +1 -0
  247. package/dist/scripts/data-transformers/content-generators.d.ts +15 -0
  248. package/dist/scripts/data-transformers/content-generators.d.ts.map +1 -0
  249. package/dist/scripts/data-transformers/content-generators.js +14 -0
  250. package/dist/scripts/data-transformers/content-generators.js.map +1 -0
  251. package/dist/scripts/data-transformers/document-analysis.d.ts +58 -0
  252. package/dist/scripts/data-transformers/document-analysis.d.ts.map +1 -0
  253. package/dist/scripts/data-transformers/document-analysis.js +396 -0
  254. package/dist/scripts/data-transformers/document-analysis.js.map +1 -0
  255. package/dist/scripts/data-transformers/helpers.d.ts +144 -0
  256. package/dist/scripts/data-transformers/helpers.d.ts.map +1 -0
  257. package/dist/scripts/data-transformers/helpers.js +408 -0
  258. package/dist/scripts/data-transformers/helpers.js.map +1 -0
  259. package/dist/scripts/data-transformers/index.d.ts +45 -0
  260. package/dist/scripts/data-transformers/index.d.ts.map +1 -0
  261. package/dist/scripts/data-transformers/index.js +66 -0
  262. package/dist/scripts/data-transformers/index.js.map +1 -0
  263. package/dist/scripts/data-transformers/metadata.d.ts +42 -0
  264. package/dist/scripts/data-transformers/metadata.d.ts.map +1 -0
  265. package/dist/scripts/data-transformers/metadata.js +385 -0
  266. package/dist/scripts/data-transformers/metadata.js.map +1 -0
  267. package/dist/scripts/data-transformers/policy-analysis.d.ts +105 -0
  268. package/dist/scripts/data-transformers/policy-analysis.d.ts.map +1 -0
  269. package/dist/scripts/data-transformers/policy-analysis.js +686 -0
  270. package/dist/scripts/data-transformers/policy-analysis.js.map +1 -0
  271. package/dist/scripts/data-transformers/risk-analysis.d.ts +104 -0
  272. package/dist/scripts/data-transformers/risk-analysis.d.ts.map +1 -0
  273. package/dist/scripts/data-transformers/risk-analysis.js +279 -0
  274. package/dist/scripts/data-transformers/risk-analysis.js.map +1 -0
  275. package/dist/scripts/data-transformers/types.d.ts +260 -0
  276. package/dist/scripts/data-transformers/types.d.ts.map +1 -0
  277. package/dist/scripts/data-transformers/types.js +11 -0
  278. package/dist/scripts/data-transformers/types.js.map +1 -0
  279. package/dist/scripts/data-transformers.d.ts +23 -0
  280. package/dist/scripts/data-transformers.d.ts.map +1 -0
  281. package/dist/scripts/data-transformers.js +35 -0
  282. package/dist/scripts/data-transformers.js.map +1 -0
  283. package/dist/scripts/deep-inspection/index.d.ts +55 -0
  284. package/dist/scripts/deep-inspection/index.d.ts.map +1 -0
  285. package/dist/scripts/deep-inspection/index.js +66 -0
  286. package/dist/scripts/deep-inspection/index.js.map +1 -0
  287. package/dist/scripts/detect-swedish-leakage.d.ts +69 -0
  288. package/dist/scripts/detect-swedish-leakage.d.ts.map +1 -0
  289. package/dist/scripts/detect-swedish-leakage.js +417 -0
  290. package/dist/scripts/detect-swedish-leakage.js.map +1 -0
  291. package/dist/scripts/editorial-framework.d.ts +121 -0
  292. package/dist/scripts/editorial-framework.d.ts.map +1 -0
  293. package/dist/scripts/editorial-framework.js +364 -0
  294. package/dist/scripts/editorial-framework.js.map +1 -0
  295. package/dist/scripts/editorial-pillars.d.ts +43 -0
  296. package/dist/scripts/editorial-pillars.d.ts.map +1 -0
  297. package/dist/scripts/editorial-pillars.js +215 -0
  298. package/dist/scripts/editorial-pillars.js.map +1 -0
  299. package/dist/scripts/extract-news-metadata.d.ts +12 -0
  300. package/dist/scripts/extract-news-metadata.d.ts.map +1 -0
  301. package/dist/scripts/extract-news-metadata.js +107 -0
  302. package/dist/scripts/extract-news-metadata.js.map +1 -0
  303. package/dist/scripts/extract-vocabulary.d.ts +15 -0
  304. package/dist/scripts/extract-vocabulary.d.ts.map +1 -0
  305. package/dist/scripts/extract-vocabulary.js +255 -0
  306. package/dist/scripts/extract-vocabulary.js.map +1 -0
  307. package/dist/scripts/fix-article-navigation.d.ts +37 -0
  308. package/dist/scripts/fix-article-navigation.d.ts.map +1 -0
  309. package/dist/scripts/fix-article-navigation.js +198 -0
  310. package/dist/scripts/fix-article-navigation.js.map +1 -0
  311. package/dist/scripts/fix-keywords-localization.d.ts +18 -0
  312. package/dist/scripts/fix-keywords-localization.d.ts.map +1 -0
  313. package/dist/scripts/fix-keywords-localization.js +270 -0
  314. package/dist/scripts/fix-keywords-localization.js.map +1 -0
  315. package/dist/scripts/fix-old-articles-branding.d.ts +17 -0
  316. package/dist/scripts/fix-old-articles-branding.d.ts.map +1 -0
  317. package/dist/scripts/fix-old-articles-branding.js +229 -0
  318. package/dist/scripts/fix-old-articles-branding.js.map +1 -0
  319. package/dist/scripts/generate-news-backport.d.ts +16 -0
  320. package/dist/scripts/generate-news-backport.d.ts.map +1 -0
  321. package/dist/scripts/generate-news-backport.js +379 -0
  322. package/dist/scripts/generate-news-backport.js.map +1 -0
  323. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts +124 -0
  324. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts.map +1 -0
  325. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js +529 -0
  326. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js.map +1 -0
  327. package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts +59 -0
  328. package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts.map +1 -0
  329. package/dist/scripts/generate-news-enhanced/analysis-cache.js +116 -0
  330. package/dist/scripts/generate-news-enhanced/analysis-cache.js.map +1 -0
  331. package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts +58 -0
  332. package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts.map +1 -0
  333. package/dist/scripts/generate-news-enhanced/analysis-labels.js +144 -0
  334. package/dist/scripts/generate-news-enhanced/analysis-labels.js.map +1 -0
  335. package/dist/scripts/generate-news-enhanced/config.d.ts +58 -0
  336. package/dist/scripts/generate-news-enhanced/config.d.ts.map +1 -0
  337. package/dist/scripts/generate-news-enhanced/config.js +286 -0
  338. package/dist/scripts/generate-news-enhanced/config.js.map +1 -0
  339. package/dist/scripts/generate-news-enhanced/generators.d.ts +119 -0
  340. package/dist/scripts/generate-news-enhanced/generators.d.ts.map +1 -0
  341. package/dist/scripts/generate-news-enhanced/generators.js +2131 -0
  342. package/dist/scripts/generate-news-enhanced/generators.js.map +1 -0
  343. package/dist/scripts/generate-news-enhanced/helpers.d.ts +122 -0
  344. package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +1 -0
  345. package/dist/scripts/generate-news-enhanced/helpers.js +468 -0
  346. package/dist/scripts/generate-news-enhanced/helpers.js.map +1 -0
  347. package/dist/scripts/generate-news-enhanced/index.d.ts +19 -0
  348. package/dist/scripts/generate-news-enhanced/index.d.ts.map +1 -0
  349. package/dist/scripts/generate-news-enhanced/index.js +221 -0
  350. package/dist/scripts/generate-news-enhanced/index.js.map +1 -0
  351. package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +46 -0
  352. package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +1 -0
  353. package/dist/scripts/generate-news-enhanced/swot-analyzer.js +1227 -0
  354. package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +1 -0
  355. package/dist/scripts/generate-news-enhanced/types.d.ts +34 -0
  356. package/dist/scripts/generate-news-enhanced/types.d.ts.map +1 -0
  357. package/dist/scripts/generate-news-enhanced/types.js +9 -0
  358. package/dist/scripts/generate-news-enhanced/types.js.map +1 -0
  359. package/dist/scripts/generate-news-enhanced.d.ts +25 -0
  360. package/dist/scripts/generate-news-enhanced.d.ts.map +1 -0
  361. package/dist/scripts/generate-news-enhanced.js +37 -0
  362. package/dist/scripts/generate-news-enhanced.js.map +1 -0
  363. package/dist/scripts/generate-news-indexes/constants.d.ts +20 -0
  364. package/dist/scripts/generate-news-indexes/constants.d.ts.map +1 -0
  365. package/dist/scripts/generate-news-indexes/constants.js +308 -0
  366. package/dist/scripts/generate-news-indexes/constants.js.map +1 -0
  367. package/dist/scripts/generate-news-indexes/helpers.d.ts +73 -0
  368. package/dist/scripts/generate-news-indexes/helpers.d.ts.map +1 -0
  369. package/dist/scripts/generate-news-indexes/helpers.js +352 -0
  370. package/dist/scripts/generate-news-indexes/helpers.js.map +1 -0
  371. package/dist/scripts/generate-news-indexes/index.d.ts +20 -0
  372. package/dist/scripts/generate-news-indexes/index.d.ts.map +1 -0
  373. package/dist/scripts/generate-news-indexes/index.js +75 -0
  374. package/dist/scripts/generate-news-indexes/index.js.map +1 -0
  375. package/dist/scripts/generate-news-indexes/template.d.ts +25 -0
  376. package/dist/scripts/generate-news-indexes/template.d.ts.map +1 -0
  377. package/dist/scripts/generate-news-indexes/template.js +644 -0
  378. package/dist/scripts/generate-news-indexes/template.js.map +1 -0
  379. package/dist/scripts/generate-news-indexes/types.d.ts +96 -0
  380. package/dist/scripts/generate-news-indexes/types.d.ts.map +1 -0
  381. package/dist/scripts/generate-news-indexes/types.js +9 -0
  382. package/dist/scripts/generate-news-indexes/types.js.map +1 -0
  383. package/dist/scripts/generate-news-indexes.d.ts +20 -0
  384. package/dist/scripts/generate-news-indexes.d.ts.map +1 -0
  385. package/dist/scripts/generate-news-indexes.js +19 -0
  386. package/dist/scripts/generate-news-indexes.js.map +1 -0
  387. package/dist/scripts/generate-rss.d.ts +48 -0
  388. package/dist/scripts/generate-rss.d.ts.map +1 -0
  389. package/dist/scripts/generate-rss.js +299 -0
  390. package/dist/scripts/generate-rss.js.map +1 -0
  391. package/dist/scripts/generate-sitemap-html.d.ts +79 -0
  392. package/dist/scripts/generate-sitemap-html.d.ts.map +1 -0
  393. package/dist/scripts/generate-sitemap-html.js +878 -0
  394. package/dist/scripts/generate-sitemap-html.js.map +1 -0
  395. package/dist/scripts/generate-sitemap.d.ts +23 -0
  396. package/dist/scripts/generate-sitemap.d.ts.map +1 -0
  397. package/dist/scripts/generate-sitemap.js +476 -0
  398. package/dist/scripts/generate-sitemap.js.map +1 -0
  399. package/dist/scripts/generate-types-from-cia-schemas.d.ts +176 -0
  400. package/dist/scripts/generate-types-from-cia-schemas.d.ts.map +1 -0
  401. package/dist/scripts/generate-types-from-cia-schemas.js +318 -0
  402. package/dist/scripts/generate-types-from-cia-schemas.js.map +1 -0
  403. package/dist/scripts/government-role-validator.d.ts +65 -0
  404. package/dist/scripts/government-role-validator.d.ts.map +1 -0
  405. package/dist/scripts/government-role-validator.js +217 -0
  406. package/dist/scripts/government-role-validator.js.map +1 -0
  407. package/dist/scripts/html-utils.d.ts +17 -0
  408. package/dist/scripts/html-utils.d.ts.map +1 -0
  409. package/dist/scripts/html-utils.js +29 -0
  410. package/dist/scripts/html-utils.js.map +1 -0
  411. package/dist/scripts/load-cia-stats.d.ts +89 -0
  412. package/dist/scripts/load-cia-stats.d.ts.map +1 -0
  413. package/dist/scripts/load-cia-stats.js +400 -0
  414. package/dist/scripts/load-cia-stats.js.map +1 -0
  415. package/dist/scripts/mcp-client/client.d.ts +73 -0
  416. package/dist/scripts/mcp-client/client.d.ts.map +1 -0
  417. package/dist/scripts/mcp-client/client.js +526 -0
  418. package/dist/scripts/mcp-client/client.js.map +1 -0
  419. package/dist/scripts/mcp-client/document-types.d.ts +23 -0
  420. package/dist/scripts/mcp-client/document-types.d.ts.map +1 -0
  421. package/dist/scripts/mcp-client/document-types.js +62 -0
  422. package/dist/scripts/mcp-client/document-types.js.map +1 -0
  423. package/dist/scripts/mcp-client/index.d.ts +34 -0
  424. package/dist/scripts/mcp-client/index.d.ts.map +1 -0
  425. package/dist/scripts/mcp-client/index.js +67 -0
  426. package/dist/scripts/mcp-client/index.js.map +1 -0
  427. package/dist/scripts/mcp-client/transport.d.ts +32 -0
  428. package/dist/scripts/mcp-client/transport.d.ts.map +1 -0
  429. package/dist/scripts/mcp-client/transport.js +102 -0
  430. package/dist/scripts/mcp-client/transport.js.map +1 -0
  431. package/dist/scripts/mcp-client.d.ts +18 -0
  432. package/dist/scripts/mcp-client.d.ts.map +1 -0
  433. package/dist/scripts/mcp-client.js +18 -0
  434. package/dist/scripts/mcp-client.js.map +1 -0
  435. package/dist/scripts/mcp-query-cli.d.ts +25 -0
  436. package/dist/scripts/mcp-query-cli.d.ts.map +1 -0
  437. package/dist/scripts/mcp-query-cli.js +66 -0
  438. package/dist/scripts/mcp-query-cli.js.map +1 -0
  439. package/dist/scripts/news-types/breaking-news.d.ts +178 -0
  440. package/dist/scripts/news-types/breaking-news.d.ts.map +1 -0
  441. package/dist/scripts/news-types/breaking-news.js +432 -0
  442. package/dist/scripts/news-types/breaking-news.js.map +1 -0
  443. package/dist/scripts/news-types/committee-reports.d.ts +212 -0
  444. package/dist/scripts/news-types/committee-reports.d.ts.map +1 -0
  445. package/dist/scripts/news-types/committee-reports.js +404 -0
  446. package/dist/scripts/news-types/committee-reports.js.map +1 -0
  447. package/dist/scripts/news-types/month-ahead.d.ts +71 -0
  448. package/dist/scripts/news-types/month-ahead.d.ts.map +1 -0
  449. package/dist/scripts/news-types/month-ahead.js +392 -0
  450. package/dist/scripts/news-types/month-ahead.js.map +1 -0
  451. package/dist/scripts/news-types/monthly-review.d.ts +61 -0
  452. package/dist/scripts/news-types/monthly-review.d.ts.map +1 -0
  453. package/dist/scripts/news-types/monthly-review.js +417 -0
  454. package/dist/scripts/news-types/monthly-review.js.map +1 -0
  455. package/dist/scripts/news-types/motions.d.ts +214 -0
  456. package/dist/scripts/news-types/motions.d.ts.map +1 -0
  457. package/dist/scripts/news-types/motions.js +447 -0
  458. package/dist/scripts/news-types/motions.js.map +1 -0
  459. package/dist/scripts/news-types/propositions.d.ts +204 -0
  460. package/dist/scripts/news-types/propositions.d.ts.map +1 -0
  461. package/dist/scripts/news-types/propositions.js +401 -0
  462. package/dist/scripts/news-types/propositions.js.map +1 -0
  463. package/dist/scripts/news-types/week-ahead.d.ts +231 -0
  464. package/dist/scripts/news-types/week-ahead.d.ts.map +1 -0
  465. package/dist/scripts/news-types/week-ahead.js +441 -0
  466. package/dist/scripts/news-types/week-ahead.js.map +1 -0
  467. package/dist/scripts/news-types/weekly-review/analysis.d.ts +47 -0
  468. package/dist/scripts/news-types/weekly-review/analysis.d.ts.map +1 -0
  469. package/dist/scripts/news-types/weekly-review/analysis.js +276 -0
  470. package/dist/scripts/news-types/weekly-review/analysis.js.map +1 -0
  471. package/dist/scripts/news-types/weekly-review/data-loader.d.ts +51 -0
  472. package/dist/scripts/news-types/weekly-review/data-loader.d.ts.map +1 -0
  473. package/dist/scripts/news-types/weekly-review/data-loader.js +298 -0
  474. package/dist/scripts/news-types/weekly-review/data-loader.js.map +1 -0
  475. package/dist/scripts/news-types/weekly-review/generator.d.ts +18 -0
  476. package/dist/scripts/news-types/weekly-review/generator.d.ts.map +1 -0
  477. package/dist/scripts/news-types/weekly-review/generator.js +284 -0
  478. package/dist/scripts/news-types/weekly-review/generator.js.map +1 -0
  479. package/dist/scripts/news-types/weekly-review/index.d.ts +20 -0
  480. package/dist/scripts/news-types/weekly-review/index.d.ts.map +1 -0
  481. package/dist/scripts/news-types/weekly-review/index.js +23 -0
  482. package/dist/scripts/news-types/weekly-review/index.js.map +1 -0
  483. package/dist/scripts/news-types/weekly-review/types.d.ts +72 -0
  484. package/dist/scripts/news-types/weekly-review/types.d.ts.map +1 -0
  485. package/dist/scripts/news-types/weekly-review/types.js +20 -0
  486. package/dist/scripts/news-types/weekly-review/types.js.map +1 -0
  487. package/dist/scripts/news-types/weekly-review/validation.d.ts +10 -0
  488. package/dist/scripts/news-types/weekly-review/validation.d.ts.map +1 -0
  489. package/dist/scripts/news-types/weekly-review/validation.js +95 -0
  490. package/dist/scripts/news-types/weekly-review/validation.js.map +1 -0
  491. package/dist/scripts/news-types/weekly-review.d.ts +15 -0
  492. package/dist/scripts/news-types/weekly-review.d.ts.map +1 -0
  493. package/dist/scripts/news-types/weekly-review.js +14 -0
  494. package/dist/scripts/news-types/weekly-review.js.map +1 -0
  495. package/dist/scripts/party-variants.d.ts +23 -0
  496. package/dist/scripts/party-variants.d.ts.map +1 -0
  497. package/dist/scripts/party-variants.js +50 -0
  498. package/dist/scripts/party-variants.js.map +1 -0
  499. package/dist/scripts/pipeline/index.d.ts +19 -0
  500. package/dist/scripts/pipeline/index.d.ts.map +1 -0
  501. package/dist/scripts/pipeline/index.js +17 -0
  502. package/dist/scripts/pipeline/index.js.map +1 -0
  503. package/dist/scripts/pipeline/orchestrator.d.ts +56 -0
  504. package/dist/scripts/pipeline/orchestrator.d.ts.map +1 -0
  505. package/dist/scripts/pipeline/orchestrator.js +147 -0
  506. package/dist/scripts/pipeline/orchestrator.js.map +1 -0
  507. package/dist/scripts/pipeline/types.d.ts +117 -0
  508. package/dist/scripts/pipeline/types.d.ts.map +1 -0
  509. package/dist/scripts/pipeline/types.js +13 -0
  510. package/dist/scripts/pipeline/types.js.map +1 -0
  511. package/dist/scripts/pipeline/validation.d.ts +66 -0
  512. package/dist/scripts/pipeline/validation.d.ts.map +1 -0
  513. package/dist/scripts/pipeline/validation.js +129 -0
  514. package/dist/scripts/pipeline/validation.js.map +1 -0
  515. package/dist/scripts/populate-analysis-data.d.ts +41 -0
  516. package/dist/scripts/populate-analysis-data.d.ts.map +1 -0
  517. package/dist/scripts/populate-analysis-data.js +255 -0
  518. package/dist/scripts/populate-analysis-data.js.map +1 -0
  519. package/dist/scripts/pre-article-analysis/data-downloader.d.ts +80 -0
  520. package/dist/scripts/pre-article-analysis/data-downloader.d.ts.map +1 -0
  521. package/dist/scripts/pre-article-analysis/data-downloader.js +230 -0
  522. package/dist/scripts/pre-article-analysis/data-downloader.js.map +1 -0
  523. package/dist/scripts/pre-article-analysis/data-persistence.d.ts +141 -0
  524. package/dist/scripts/pre-article-analysis/data-persistence.d.ts.map +1 -0
  525. package/dist/scripts/pre-article-analysis/data-persistence.js +345 -0
  526. package/dist/scripts/pre-article-analysis/data-persistence.js.map +1 -0
  527. package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +158 -0
  528. package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +1 -0
  529. package/dist/scripts/pre-article-analysis/markdown-serializer.js +648 -0
  530. package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +1 -0
  531. package/dist/scripts/pre-article-analysis/pdf-converter.d.ts +58 -0
  532. package/dist/scripts/pre-article-analysis/pdf-converter.d.ts.map +1 -0
  533. package/dist/scripts/pre-article-analysis/pdf-converter.js +142 -0
  534. package/dist/scripts/pre-article-analysis/pdf-converter.js.map +1 -0
  535. package/dist/scripts/pre-article-analysis.d.ts +41 -0
  536. package/dist/scripts/pre-article-analysis.d.ts.map +1 -0
  537. package/dist/scripts/pre-article-analysis.js +591 -0
  538. package/dist/scripts/pre-article-analysis.js.map +1 -0
  539. package/dist/scripts/scb-client.d.ts +104 -0
  540. package/dist/scripts/scb-client.d.ts.map +1 -0
  541. package/dist/scripts/scb-client.js +286 -0
  542. package/dist/scripts/scb-client.js.map +1 -0
  543. package/dist/scripts/scb-context.d.ts +88 -0
  544. package/dist/scripts/scb-context.d.ts.map +1 -0
  545. package/dist/scripts/scb-context.js +307 -0
  546. package/dist/scripts/scb-context.js.map +1 -0
  547. package/dist/scripts/shared/version.d.ts +9 -0
  548. package/dist/scripts/shared/version.d.ts.map +1 -0
  549. package/dist/scripts/shared/version.js +28 -0
  550. package/dist/scripts/shared/version.js.map +1 -0
  551. package/dist/scripts/statistical-claims-detector.d.ts +119 -0
  552. package/dist/scripts/statistical-claims-detector.d.ts.map +1 -0
  553. package/dist/scripts/statistical-claims-detector.js +391 -0
  554. package/dist/scripts/statistical-claims-detector.js.map +1 -0
  555. package/dist/scripts/sync-cia-schemas.d.ts +52 -0
  556. package/dist/scripts/sync-cia-schemas.d.ts.map +1 -0
  557. package/dist/scripts/sync-cia-schemas.js +195 -0
  558. package/dist/scripts/sync-cia-schemas.js.map +1 -0
  559. package/dist/scripts/translation-dictionary.d.ts +45 -0
  560. package/dist/scripts/translation-dictionary.d.ts.map +1 -0
  561. package/dist/scripts/translation-dictionary.js +3642 -0
  562. package/dist/scripts/translation-dictionary.js.map +1 -0
  563. package/dist/scripts/types/article.d.ts +392 -0
  564. package/dist/scripts/types/article.d.ts.map +1 -0
  565. package/dist/scripts/types/article.js +6 -0
  566. package/dist/scripts/types/article.js.map +1 -0
  567. package/dist/scripts/types/content.d.ts +167 -0
  568. package/dist/scripts/types/content.d.ts.map +1 -0
  569. package/dist/scripts/types/content.js +6 -0
  570. package/dist/scripts/types/content.js.map +1 -0
  571. package/dist/scripts/types/editorial.d.ts +17 -0
  572. package/dist/scripts/types/editorial.d.ts.map +1 -0
  573. package/dist/scripts/types/editorial.js +6 -0
  574. package/dist/scripts/types/editorial.js.map +1 -0
  575. package/dist/scripts/types/language.d.ts +7 -0
  576. package/dist/scripts/types/language.d.ts.map +1 -0
  577. package/dist/scripts/types/language.js +6 -0
  578. package/dist/scripts/types/language.js.map +1 -0
  579. package/dist/scripts/types/mcp.d.ts +117 -0
  580. package/dist/scripts/types/mcp.d.ts.map +1 -0
  581. package/dist/scripts/types/mcp.js +6 -0
  582. package/dist/scripts/types/mcp.js.map +1 -0
  583. package/dist/scripts/types/party.d.ts +9 -0
  584. package/dist/scripts/types/party.d.ts.map +1 -0
  585. package/dist/scripts/types/party.js +6 -0
  586. package/dist/scripts/types/party.js.map +1 -0
  587. package/dist/scripts/types/validation.d.ts +136 -0
  588. package/dist/scripts/types/validation.d.ts.map +1 -0
  589. package/dist/scripts/types/validation.js +6 -0
  590. package/dist/scripts/types/validation.js.map +1 -0
  591. package/dist/scripts/types/workflow.d.ts +78 -0
  592. package/dist/scripts/types/workflow.d.ts.map +1 -0
  593. package/dist/scripts/types/workflow.js +6 -0
  594. package/dist/scripts/types/workflow.js.map +1 -0
  595. package/dist/scripts/update-stats-from-cia.d.ts +44 -0
  596. package/dist/scripts/update-stats-from-cia.d.ts.map +1 -0
  597. package/dist/scripts/update-stats-from-cia.js +310 -0
  598. package/dist/scripts/update-stats-from-cia.js.map +1 -0
  599. package/dist/scripts/validate-against-cia-schemas.d.ts +126 -0
  600. package/dist/scripts/validate-against-cia-schemas.d.ts.map +1 -0
  601. package/dist/scripts/validate-against-cia-schemas.js +299 -0
  602. package/dist/scripts/validate-against-cia-schemas.js.map +1 -0
  603. package/dist/scripts/validate-cross-references.d.ts +49 -0
  604. package/dist/scripts/validate-cross-references.d.ts.map +1 -0
  605. package/dist/scripts/validate-cross-references.js +183 -0
  606. package/dist/scripts/validate-cross-references.js.map +1 -0
  607. package/dist/scripts/validate-file-ownership.d.ts +68 -0
  608. package/dist/scripts/validate-file-ownership.d.ts.map +1 -0
  609. package/dist/scripts/validate-file-ownership.js +135 -0
  610. package/dist/scripts/validate-file-ownership.js.map +1 -0
  611. package/dist/scripts/validate-news-translations.d.ts +27 -0
  612. package/dist/scripts/validate-news-translations.d.ts.map +1 -0
  613. package/dist/scripts/validate-news-translations.js +258 -0
  614. package/dist/scripts/validate-news-translations.js.map +1 -0
  615. package/dist/scripts/validate-translations.d.ts +162 -0
  616. package/dist/scripts/validate-translations.d.ts.map +1 -0
  617. package/dist/scripts/validate-translations.js +378 -0
  618. package/dist/scripts/validate-translations.js.map +1 -0
  619. package/dist/scripts/workflow-state-coordinator.d.ts +354 -0
  620. package/dist/scripts/workflow-state-coordinator.d.ts.map +1 -0
  621. package/dist/scripts/workflow-state-coordinator.js +876 -0
  622. package/dist/scripts/workflow-state-coordinator.js.map +1 -0
  623. package/dist/scripts/world-bank-client.d.ts +122 -0
  624. package/dist/scripts/world-bank-client.d.ts.map +1 -0
  625. package/dist/scripts/world-bank-client.js +192 -0
  626. package/dist/scripts/world-bank-client.js.map +1 -0
  627. package/dist/scripts/world-bank-context.d.ts +88 -0
  628. package/dist/scripts/world-bank-context.d.ts.map +1 -0
  629. package/dist/scripts/world-bank-context.js +331 -0
  630. package/dist/scripts/world-bank-context.js.map +1 -0
  631. package/package.json +33 -8
  632. package/dist/lib/chart-factory.d.ts.map +0 -1
  633. package/dist/lib/chart-factory.js.map +0 -1
  634. package/dist/lib/data-loader.d.ts.map +0 -1
  635. package/dist/lib/data-loader.js.map +0 -1
  636. package/dist/lib/dom-utils.d.ts.map +0 -1
  637. package/dist/lib/dom-utils.js.map +0 -1
  638. package/dist/lib/error-boundary.d.ts.map +0 -1
  639. package/dist/lib/error-boundary.js.map +0 -1
  640. package/dist/lib/fallback-ui.d.ts.map +0 -1
  641. package/dist/lib/fallback-ui.js.map +0 -1
  642. package/dist/lib/index.d.ts.map +0 -1
  643. package/dist/lib/index.js.map +0 -1
  644. package/dist/lib/logger.d.ts.map +0 -1
  645. package/dist/lib/logger.js.map +0 -1
  646. package/dist/lib/theme.d.ts.map +0 -1
  647. package/dist/lib/theme.js.map +0 -1
  648. package/dist/lib/types.d.ts.map +0 -1
  649. package/dist/lib/types.js.map +0 -1
  650. /package/dist/lib/{data-loader.d.ts → shared/data-loader.d.ts} +0 -0
  651. /package/dist/lib/{data-loader.js → shared/data-loader.js} +0 -0
  652. /package/dist/lib/{dom-utils.d.ts → shared/dom-utils.d.ts} +0 -0
  653. /package/dist/lib/{dom-utils.js → shared/dom-utils.js} +0 -0
  654. /package/dist/lib/{error-boundary.d.ts → shared/error-boundary.d.ts} +0 -0
  655. /package/dist/lib/{error-boundary.js → shared/error-boundary.js} +0 -0
  656. /package/dist/lib/{fallback-ui.d.ts → shared/fallback-ui.d.ts} +0 -0
  657. /package/dist/lib/{fallback-ui.js → shared/fallback-ui.js} +0 -0
  658. /package/dist/lib/{index.d.ts → shared/index.d.ts} +0 -0
  659. /package/dist/lib/{index.js → shared/index.js} +0 -0
  660. /package/dist/lib/{logger.d.ts → shared/logger.d.ts} +0 -0
  661. /package/dist/lib/{logger.js → shared/logger.js} +0 -0
  662. /package/dist/lib/{types.d.ts → shared/types.d.ts} +0 -0
  663. /package/dist/lib/{types.js → shared/types.js} +0 -0
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @module pre-article-analysis/data-persistence
3
+ * @description Persists raw MCP data to a structured, version-controlled
4
+ * directory tree under `analysis/data/`. Every document, vote, event, or
5
+ * MP record fetched from MCP tools is written here with a consistent
6
+ * filename derived from its official Riksdag identifier (e.g. `dok_id`,
7
+ * `intressent_id`, `bet`).
8
+ *
9
+ * **Collision-free design** (v2):
10
+ * - **Data files** (`{id}.json`) contain ONLY the raw source data — no
11
+ * injected metadata. Two parallel workflows writing the same document
12
+ * produce byte-identical output, eliminating git merge conflicts.
13
+ * - **Sidecar metadata** (`{id}.meta.json`) tracks provenance (at minimum
14
+ * fetch timestamp and MCP tool name) in a separate file that is safely
15
+ * overwritten on each run. Riksdag/Riksdag-regeringen documents also
16
+ * include `riksmöte` and `documentType`, while external MCP tools
17
+ * (World Bank, SCB, etc.) use tool-specific fields (e.g. indicator /
18
+ * country, tableId / query) instead.
19
+ * - **All MCP tools**: riksdag-regering, World Bank, SCB, and any other
20
+ * MCP tool responses are stored under `analysis/data/`.
21
+ *
22
+ * Design principles:
23
+ * - **Upsert**: writes overwrite existing files (mutable data like MP
24
+ * profiles) or create new ones (immutable data like dated votes).
25
+ * - **Provenance**: sidecar `.meta.json` files track fetch origin.
26
+ * - **Date-stamped**: time-bound data (votes, events) is stored under
27
+ * `analysis/data/{type}/YYYY-MM-DD/` subdirectories.
28
+ * - **Side-effect-aware**: this module intentionally writes to disk;
29
+ * callers control when persistence is triggered.
30
+ *
31
+ * @author Hack23 AB
32
+ * @license Apache-2.0
33
+ */
34
+ import type { RawDocument } from '../data-transformers/types.js';
35
+ import type { DownloadedData, DocumentTypeKey } from './data-downloader.js';
36
+ /** All known document/data types that appear in sidecar metadata. */
37
+ export type PersistenceDocumentType = DocumentTypeKey | 'events' | 'mps' | 'government' | 'worldbank' | 'scb' | string;
38
+ /** Sidecar metadata written alongside data files. */
39
+ export interface PersistenceMetadata {
40
+ fetchedAt: string;
41
+ mcpTool: string;
42
+ riksmote: string;
43
+ documentType: PersistenceDocumentType;
44
+ }
45
+ /** Summary returned after a persistence run. */
46
+ export interface PersistenceResult {
47
+ /**
48
+ * Total logical records persisted.
49
+ *
50
+ * Note: a single logical record may produce multiple physical files or
51
+ * data/sidecar pairs (for example, votes written under both
52
+ * `documents/votes/` and `votes/{date}/`), but it is counted once here.
53
+ */
54
+ written: number;
55
+ /** Total null/empty entries skipped. */
56
+ skipped: number;
57
+ /** Root directory the data was written to. */
58
+ dataRoot: string;
59
+ }
60
+ /** Description of an MCP tool call for generic response storage. */
61
+ export interface MCPToolCall {
62
+ /** MCP tool name (e.g. 'get_propositioner', 'search_tables', 'get-country-info') */
63
+ tool: string;
64
+ /** Parameters passed to the tool */
65
+ params: Record<string, unknown>;
66
+ /** MCP server identifier (e.g. 'riksdag-regering', 'scb', 'world-bank') */
67
+ server: string;
68
+ }
69
+ /**
70
+ * Resolve the best identifier for a document.
71
+ * Falls back through the standard candidate chain.
72
+ */
73
+ export declare function resolveDocId(doc: RawDocument, index: number): string;
74
+ /**
75
+ * Persist all downloaded MCP data to the structured `analysis/data/` tree.
76
+ *
77
+ * Documents are organised by type under `analysis/data/documents/{type}/`.
78
+ * Date-stamped data (votes, events) is further partitioned by date.
79
+ *
80
+ * Data files contain only raw source data (no metadata injection) to ensure
81
+ * parallel workflows writing the same document produce identical output,
82
+ * preventing git merge conflicts.
83
+ *
84
+ * @param data - Downloaded data collections from `downloadAllDocuments()`
85
+ * @param riksmote - Current riksmöte identifier (e.g. "2025/26")
86
+ * @param mcpToolMap - Map of document type → MCP tool name for provenance
87
+ * @param dataRoot - Override for the data root directory (for testing)
88
+ * @returns Summary of files written and skipped.
89
+ */
90
+ export declare function persistDownloadedData(data: DownloadedData, riksmote: string, mcpToolMap?: Partial<Record<DocumentTypeKey, string>>, dataRoot?: string): PersistenceResult;
91
+ /**
92
+ * Persist a set of calendar events to `analysis/data/events/{date}/`.
93
+ * @param dataRoot - Override for the data root directory (for testing)
94
+ */
95
+ export declare function persistEvents(events: RawDocument[], riksmote: string, dataRoot?: string): PersistenceResult;
96
+ /**
97
+ * Persist MP profiles to `analysis/data/mps/`.
98
+ * @param dataRoot - Override for the data root directory (for testing)
99
+ */
100
+ export declare function persistMPs(mps: RawDocument[], riksmote: string, dataRoot?: string): PersistenceResult;
101
+ /**
102
+ * Persist a generic MCP tool response. Supports any MCP server (riksdag,
103
+ * SCB, World Bank, etc.). Responses are stored under:
104
+ * `analysis/data/mcp-responses/{server}/{tool}/{id}.json`
105
+ *
106
+ * The response data is stored as-is (no metadata injection). A sidecar
107
+ * `.meta.json` tracks provenance.
108
+ *
109
+ * @param call - Description of the MCP tool call
110
+ * @param response - Raw response data from the MCP tool
111
+ * @param id - Unique identifier for this response (e.g. dok_id, table_id, country code)
112
+ * @param dataRoot - Override for the data root directory (for testing)
113
+ * @returns The absolute path where the response was written.
114
+ */
115
+ export declare function persistMCPResponse(call: MCPToolCall, response: unknown, id: string, dataRoot?: string, riksmote?: string): string;
116
+ /**
117
+ * Persist World Bank API response data.
118
+ * Stored under `analysis/data/worldbank/{indicator}/{country}.json`
119
+ *
120
+ * @param indicator - World Bank indicator ID (e.g. 'NY.GDP.MKTP.CD')
121
+ * @param country - Country code (e.g. 'SWE')
122
+ * @param response - Raw API response data
123
+ * @param dataRoot - Override for the data root directory (for testing)
124
+ */
125
+ export declare function persistWorldBankData(indicator: string, country: string, response: unknown, dataRoot?: string): string;
126
+ /**
127
+ * Persist SCB (Statistics Sweden) table data.
128
+ * Stored under `analysis/data/scb/{tableId}.json`
129
+ *
130
+ * @param tableId - SCB table identifier (e.g. 'BE0101A')
131
+ * @param response - Raw SCB API response data
132
+ * @param query - Optional query parameters used for provenance
133
+ * @param dataRoot - Override for the data root directory (for testing)
134
+ */
135
+ export declare function persistSCBData(tableId: string, response: unknown, query?: Record<string, unknown>, dataRoot?: string): string;
136
+ /**
137
+ * Return the absolute path to the data repository root.
138
+ * Useful for callers that need to reference persisted files.
139
+ */
140
+ export declare function getDataRoot(): string;
141
+ //# sourceMappingURL=data-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-persistence.d.ts","sourceRoot":"","sources":["../../../scripts/pre-article-analysis/data-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAiB5E,qEAAqE;AACrE,MAAM,MAAM,uBAAuB,GAC/B,eAAe,GACf,QAAQ,GACR,KAAK,GACL,YAAY,GACZ,WAAW,GACX,KAAK,GACL,MAAM,CAAC;AAEX,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,uBAAuB,CAAC;CACvC;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcpE;AAiCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,EACrD,QAAQ,GAAE,MAAkB,GAC3B,iBAAiB,CA8EnB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAkB,GAC3B,iBAAiB,CA8BnB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAAE,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAkB,GAC3B,iBAAiB,CAwBnB;AAwBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,OAAO,EACjB,EAAE,EAAE,MAAM,EACV,QAAQ,GAAE,MAAkB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAiCR;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,QAAQ,GAAE,MAAkB,GAC3B,MAAM,CAwBR;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,GAAE,MAAkB,GAC3B,MAAM,CAyBR;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,345 @@
1
+ /**
2
+ * @module pre-article-analysis/data-persistence
3
+ * @description Persists raw MCP data to a structured, version-controlled
4
+ * directory tree under `analysis/data/`. Every document, vote, event, or
5
+ * MP record fetched from MCP tools is written here with a consistent
6
+ * filename derived from its official Riksdag identifier (e.g. `dok_id`,
7
+ * `intressent_id`, `bet`).
8
+ *
9
+ * **Collision-free design** (v2):
10
+ * - **Data files** (`{id}.json`) contain ONLY the raw source data — no
11
+ * injected metadata. Two parallel workflows writing the same document
12
+ * produce byte-identical output, eliminating git merge conflicts.
13
+ * - **Sidecar metadata** (`{id}.meta.json`) tracks provenance (at minimum
14
+ * fetch timestamp and MCP tool name) in a separate file that is safely
15
+ * overwritten on each run. Riksdag/Riksdag-regeringen documents also
16
+ * include `riksmöte` and `documentType`, while external MCP tools
17
+ * (World Bank, SCB, etc.) use tool-specific fields (e.g. indicator /
18
+ * country, tableId / query) instead.
19
+ * - **All MCP tools**: riksdag-regering, World Bank, SCB, and any other
20
+ * MCP tool responses are stored under `analysis/data/`.
21
+ *
22
+ * Design principles:
23
+ * - **Upsert**: writes overwrite existing files (mutable data like MP
24
+ * profiles) or create new ones (immutable data like dated votes).
25
+ * - **Provenance**: sidecar `.meta.json` files track fetch origin.
26
+ * - **Date-stamped**: time-bound data (votes, events) is stored under
27
+ * `analysis/data/{type}/YYYY-MM-DD/` subdirectories.
28
+ * - **Side-effect-aware**: this module intentionally writes to disk;
29
+ * callers control when persistence is triggered.
30
+ *
31
+ * @author Hack23 AB
32
+ * @license Apache-2.0
33
+ */
34
+ import crypto from 'node:crypto';
35
+ import fs from 'node:fs';
36
+ import path from 'node:path';
37
+ import { fileURLToPath } from 'node:url';
38
+ import { sanitizeDokId } from './markdown-serializer.js';
39
+ // ---------------------------------------------------------------------------
40
+ // Constants
41
+ // ---------------------------------------------------------------------------
42
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
43
+ const REPO_ROOT = path.resolve(__dirname, '../..');
44
+ const DATA_ROOT = path.join(REPO_ROOT, 'analysis', 'data');
45
+ /** ISO 8601 date format pattern (YYYY-MM-DD). Checks format only, not date validity. */
46
+ const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
47
+ // ---------------------------------------------------------------------------
48
+ // Helpers
49
+ // ---------------------------------------------------------------------------
50
+ function ensureDir(dir) {
51
+ fs.mkdirSync(dir, { recursive: true });
52
+ }
53
+ /**
54
+ * Resolve the best identifier for a document.
55
+ * Falls back through the standard candidate chain.
56
+ */
57
+ export function resolveDocId(doc, index) {
58
+ const record = doc;
59
+ const candidates = [
60
+ record['dok_id'],
61
+ record['dokument_id'],
62
+ record['id'],
63
+ record['rel_dok_id'],
64
+ record['titel'],
65
+ record['title'],
66
+ ];
67
+ const id = candidates.find((c) => typeof c === 'string' && c.trim().length > 0)?.trim() ?? `unknown-${index + 1}`;
68
+ return sanitizeDokId(id) || `unknown-${index + 1}`;
69
+ }
70
+ /**
71
+ * Write raw data to disk as pretty-printed JSON (NO metadata injection).
72
+ * Metadata is written to a separate sidecar file to prevent merge conflicts
73
+ * when parallel workflows persist the same document.
74
+ */
75
+ function writeDocumentAndMeta(dir, baseFilename, doc, metadata) {
76
+ ensureDir(dir);
77
+ // Write raw data only — deterministic across parallel workflow runs
78
+ fs.writeFileSync(path.join(dir, baseFilename), JSON.stringify(doc, null, 2), 'utf8');
79
+ // Write provenance sidecar — safe to overwrite (non-conflicting)
80
+ const metaFilename = baseFilename.replace(/\.json$/, '.meta.json');
81
+ fs.writeFileSync(path.join(dir, metaFilename), JSON.stringify(metadata, null, 2), 'utf8');
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Public API — Riksdag documents
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Persist all downloaded MCP data to the structured `analysis/data/` tree.
88
+ *
89
+ * Documents are organised by type under `analysis/data/documents/{type}/`.
90
+ * Date-stamped data (votes, events) is further partitioned by date.
91
+ *
92
+ * Data files contain only raw source data (no metadata injection) to ensure
93
+ * parallel workflows writing the same document produce identical output,
94
+ * preventing git merge conflicts.
95
+ *
96
+ * @param data - Downloaded data collections from `downloadAllDocuments()`
97
+ * @param riksmote - Current riksmöte identifier (e.g. "2025/26")
98
+ * @param mcpToolMap - Map of document type → MCP tool name for provenance
99
+ * @param dataRoot - Override for the data root directory (for testing)
100
+ * @returns Summary of files written and skipped.
101
+ */
102
+ export function persistDownloadedData(data, riksmote, mcpToolMap, dataRoot = DATA_ROOT) {
103
+ const defaultToolMap = {
104
+ propositions: 'get_propositioner',
105
+ motions: 'get_motioner',
106
+ committeeReports: 'get_betankanden',
107
+ votes: 'search_voteringar',
108
+ speeches: 'search_anforanden',
109
+ questions: 'get_fragor',
110
+ interpellations: 'get_interpellationer',
111
+ };
112
+ const toolMap = { ...defaultToolMap, ...mcpToolMap };
113
+ const fetchedAt = new Date().toISOString();
114
+ let written = 0;
115
+ let skipped = 0;
116
+ const docTypes = [
117
+ 'propositions',
118
+ 'motions',
119
+ 'committeeReports',
120
+ 'votes',
121
+ 'speeches',
122
+ 'questions',
123
+ 'interpellations',
124
+ ];
125
+ for (const docType of docTypes) {
126
+ const docs = data[docType];
127
+ if (!docs || docs.length === 0) {
128
+ continue;
129
+ }
130
+ const typeDir = path.join(dataRoot, 'documents', docType);
131
+ const metadata = {
132
+ fetchedAt,
133
+ mcpTool: toolMap[docType],
134
+ riksmote,
135
+ documentType: docType,
136
+ };
137
+ const seenIds = new Set();
138
+ for (let i = 0; i < docs.length; i++) {
139
+ const doc = docs[i];
140
+ if (!doc) {
141
+ skipped++;
142
+ continue;
143
+ }
144
+ let docId = resolveDocId(doc, i);
145
+ // Collision avoidance: append suffix if ID already used in this batch
146
+ if (seenIds.has(docId)) {
147
+ let suffix = 1;
148
+ while (seenIds.has(`${docId}-${suffix}`))
149
+ suffix++;
150
+ docId = `${docId}-${suffix}`;
151
+ }
152
+ seenIds.add(docId);
153
+ const filename = `${docId}.json`;
154
+ // For date-stamped vote ballots, also persist under votes/{date}/
155
+ if (docType === 'votes' && doc.datum) {
156
+ const voteDate = typeof doc.datum === 'string'
157
+ ? doc.datum.slice(0, 10)
158
+ : '';
159
+ if (ISO_DATE_RE.test(voteDate)) {
160
+ const voteDateDir = path.join(dataRoot, 'votes', voteDate);
161
+ writeDocumentAndMeta(voteDateDir, filename, doc, {
162
+ ...metadata,
163
+ documentType: 'votes',
164
+ });
165
+ }
166
+ }
167
+ writeDocumentAndMeta(typeDir, filename, doc, metadata);
168
+ written++;
169
+ }
170
+ }
171
+ return { written, skipped, dataRoot: dataRoot };
172
+ }
173
+ /**
174
+ * Persist a set of calendar events to `analysis/data/events/{date}/`.
175
+ * @param dataRoot - Override for the data root directory (for testing)
176
+ */
177
+ export function persistEvents(events, riksmote, dataRoot = DATA_ROOT) {
178
+ const fetchedAt = new Date().toISOString();
179
+ let written = 0;
180
+ let skipped = 0;
181
+ for (let i = 0; i < events.length; i++) {
182
+ const event = events[i];
183
+ if (!event) {
184
+ skipped++;
185
+ continue;
186
+ }
187
+ const record = event;
188
+ const dateStr = typeof record['datum'] === 'string'
189
+ ? record['datum'].slice(0, 10)
190
+ : typeof record['from'] === 'string'
191
+ ? record['from'].slice(0, 10)
192
+ : '';
193
+ const eventDate = ISO_DATE_RE.test(dateStr) ? dateStr : 'undated';
194
+ const eventDir = path.join(dataRoot, 'events', eventDate);
195
+ const eventId = resolveDocId(event, i);
196
+ writeDocumentAndMeta(eventDir, `${eventId}.json`, event, {
197
+ fetchedAt,
198
+ mcpTool: 'get_calendar_events',
199
+ riksmote,
200
+ documentType: 'events',
201
+ });
202
+ written++;
203
+ }
204
+ return { written, skipped, dataRoot: dataRoot };
205
+ }
206
+ /**
207
+ * Persist MP profiles to `analysis/data/mps/`.
208
+ * @param dataRoot - Override for the data root directory (for testing)
209
+ */
210
+ export function persistMPs(mps, riksmote, dataRoot = DATA_ROOT) {
211
+ const fetchedAt = new Date().toISOString();
212
+ let written = 0;
213
+ let skipped = 0;
214
+ for (let i = 0; i < mps.length; i++) {
215
+ const mp = mps[i];
216
+ if (!mp) {
217
+ skipped++;
218
+ continue;
219
+ }
220
+ const record = mp;
221
+ const id = (typeof record['intressent_id'] === 'string' && record['intressent_id'])
222
+ || resolveDocId(mp, i);
223
+ const sanitized = sanitizeDokId(id) || `mp-${i + 1}`;
224
+ writeDocumentAndMeta(path.join(dataRoot, 'mps'), `${sanitized}.json`, mp, {
225
+ fetchedAt,
226
+ mcpTool: 'search_ledamoter',
227
+ riksmote,
228
+ documentType: 'mps',
229
+ });
230
+ written++;
231
+ }
232
+ return { written, skipped, dataRoot: dataRoot };
233
+ }
234
+ // ---------------------------------------------------------------------------
235
+ // Public API — Generic MCP response storage
236
+ // ---------------------------------------------------------------------------
237
+ /**
238
+ * Sanitize a path segment to prevent path traversal.
239
+ * Preserves underscores (common in MCP tool names like get_voting_group)
240
+ * but removes slashes, null bytes, and dots-only sequences.
241
+ */
242
+ function sanitizePathSegment(segment) {
243
+ // Remove path separators and null bytes
244
+ let safe = segment.replace(/[/\\:\0]/g, '_');
245
+ // Collapse dots-only segments (e.g. "..", ".")
246
+ if (/^\.+$/.test(safe))
247
+ safe = '_dots_';
248
+ // Remove characters that are unsafe in paths but preserve underscores
249
+ safe = safe.replace(/[^a-zA-Z0-9_\-åäöÅÄÖ]/g, '_')
250
+ .replace(/_+/g, '_')
251
+ .replace(/^_|_$/g, '')
252
+ .slice(0, 100);
253
+ return safe || 'unknown';
254
+ }
255
+ /**
256
+ * Persist a generic MCP tool response. Supports any MCP server (riksdag,
257
+ * SCB, World Bank, etc.). Responses are stored under:
258
+ * `analysis/data/mcp-responses/{server}/{tool}/{id}.json`
259
+ *
260
+ * The response data is stored as-is (no metadata injection). A sidecar
261
+ * `.meta.json` tracks provenance.
262
+ *
263
+ * @param call - Description of the MCP tool call
264
+ * @param response - Raw response data from the MCP tool
265
+ * @param id - Unique identifier for this response (e.g. dok_id, table_id, country code)
266
+ * @param dataRoot - Override for the data root directory (for testing)
267
+ * @returns The absolute path where the response was written.
268
+ */
269
+ export function persistMCPResponse(call, response, id, dataRoot = DATA_ROOT, riksmote) {
270
+ const sanitized = sanitizeDokId(id) || `response-${crypto.randomUUID()}`;
271
+ const safeServer = sanitizePathSegment(call.server);
272
+ const safeTool = sanitizePathSegment(call.tool);
273
+ const dir = path.join(dataRoot, 'mcp-responses', safeServer, safeTool);
274
+ ensureDir(dir);
275
+ const filename = `${sanitized}.json`;
276
+ fs.writeFileSync(path.join(dir, filename), JSON.stringify(response, null, 2), 'utf8');
277
+ // Derive riksmöte: explicit param > call.params.rm > empty
278
+ const resolvedRiksmote = riksmote
279
+ ?? (typeof call.params.rm === 'string' ? call.params.rm : '');
280
+ const metaFilename = `${sanitized}.meta.json`;
281
+ const metadata = {
282
+ fetchedAt: new Date().toISOString(),
283
+ mcpTool: call.tool,
284
+ riksmote: resolvedRiksmote,
285
+ documentType: call.server,
286
+ params: call.params,
287
+ };
288
+ fs.writeFileSync(path.join(dir, metaFilename), JSON.stringify(metadata, null, 2), 'utf8');
289
+ return path.join(dir, filename);
290
+ }
291
+ /**
292
+ * Persist World Bank API response data.
293
+ * Stored under `analysis/data/worldbank/{indicator}/{country}.json`
294
+ *
295
+ * @param indicator - World Bank indicator ID (e.g. 'NY.GDP.MKTP.CD')
296
+ * @param country - Country code (e.g. 'SWE')
297
+ * @param response - Raw API response data
298
+ * @param dataRoot - Override for the data root directory (for testing)
299
+ */
300
+ export function persistWorldBankData(indicator, country, response, dataRoot = DATA_ROOT) {
301
+ const dir = path.join(dataRoot, 'worldbank', sanitizeDokId(indicator));
302
+ ensureDir(dir);
303
+ const filename = `${sanitizeDokId(country)}.json`;
304
+ fs.writeFileSync(path.join(dir, filename), JSON.stringify(response, null, 2), 'utf8');
305
+ const metaFilename = `${sanitizeDokId(country)}.meta.json`;
306
+ fs.writeFileSync(path.join(dir, metaFilename), JSON.stringify({
307
+ fetchedAt: new Date().toISOString(),
308
+ mcpTool: 'world-bank-api',
309
+ indicator,
310
+ country,
311
+ }, null, 2), 'utf8');
312
+ return path.join(dir, filename);
313
+ }
314
+ /**
315
+ * Persist SCB (Statistics Sweden) table data.
316
+ * Stored under `analysis/data/scb/{tableId}.json`
317
+ *
318
+ * @param tableId - SCB table identifier (e.g. 'BE0101A')
319
+ * @param response - Raw SCB API response data
320
+ * @param query - Optional query parameters used for provenance
321
+ * @param dataRoot - Override for the data root directory (for testing)
322
+ */
323
+ export function persistSCBData(tableId, response, query, dataRoot = DATA_ROOT) {
324
+ const dir = path.join(dataRoot, 'scb');
325
+ ensureDir(dir);
326
+ const sanitized = sanitizeDokId(tableId);
327
+ const filename = `${sanitized}.json`;
328
+ fs.writeFileSync(path.join(dir, filename), JSON.stringify(response, null, 2), 'utf8');
329
+ const metaFilename = `${sanitized}.meta.json`;
330
+ fs.writeFileSync(path.join(dir, metaFilename), JSON.stringify({
331
+ fetchedAt: new Date().toISOString(),
332
+ mcpTool: 'scb-pxweb',
333
+ tableId,
334
+ ...(query ? { query } : {}),
335
+ }, null, 2), 'utf8');
336
+ return path.join(dir, filename);
337
+ }
338
+ /**
339
+ * Return the absolute path to the data repository root.
340
+ * Useful for callers that need to reference persisted files.
341
+ */
342
+ export function getDataRoot() {
343
+ return DATA_ROOT;
344
+ }
345
+ //# sourceMappingURL=data-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-persistence.js","sourceRoot":"","sources":["../../../scripts/pre-article-analysis/data-persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * @module pre-article-analysis/markdown-serializer
3
+ * @description Serializes analysis framework results as structured markdown
4
+ * files for persistence in `analysis/daily/YYYY-MM-DD/`.
5
+ *
6
+ * Each output file follows the standard analysis template:
7
+ * ```markdown
8
+ * # [Analysis Type] — YYYY-MM-DD
9
+ * **Generated**: YYYY-MM-DD HH:MM UTC
10
+ * **Data Sources**: [list]
11
+ * **Documents Analyzed**: N
12
+ * **Confidence**: HIGH/MEDIUM/LOW
13
+ * ## Summary / ## Detailed Analysis / ## Key Findings / ## Implications
14
+ * ```
15
+ *
16
+ * @author Hack23 AB
17
+ * @license Apache-2.0
18
+ */
19
+ interface SwotContribution {
20
+ quadrant: string;
21
+ text: string;
22
+ forStakeholder: string;
23
+ }
24
+ interface DashboardMetric {
25
+ label: string;
26
+ value: number | string;
27
+ unit?: string;
28
+ metricName: string;
29
+ }
30
+ interface MindmapNode {
31
+ label: string;
32
+ children?: MindmapNode[];
33
+ }
34
+ interface PerspectiveAnalysis {
35
+ lens: string;
36
+ summary: string;
37
+ impact: string;
38
+ sentiment: string;
39
+ swotContribution: SwotContribution[];
40
+ dashboardMetrics: DashboardMetric[];
41
+ mindmapNodes: MindmapNode[];
42
+ confidence: number;
43
+ keyActors: string[];
44
+ relatedPolicies: string[];
45
+ }
46
+ interface DocumentLink {
47
+ sourceId: string;
48
+ targetId: string;
49
+ type: string;
50
+ description: string;
51
+ confidence: number;
52
+ reason: string;
53
+ }
54
+ interface DocumentAnalysisResult {
55
+ document: {
56
+ dok_id?: string;
57
+ titel?: string;
58
+ title?: string;
59
+ doktyp?: string;
60
+ organ?: string;
61
+ committee?: string;
62
+ datum?: string;
63
+ intressent_namn?: string;
64
+ author?: string;
65
+ parti?: string;
66
+ rm?: string;
67
+ summary?: string;
68
+ rubrik?: string;
69
+ undertitel?: string;
70
+ notis?: string;
71
+ mottagare?: string;
72
+ fullText?: string;
73
+ fullContent?: string;
74
+ [key: string]: unknown;
75
+ };
76
+ overallSignificance: number;
77
+ perspectives: PerspectiveAnalysis[];
78
+ crossDocumentLinks: DocumentLink[];
79
+ keyInsights: string[];
80
+ confidenceScore: number;
81
+ }
82
+ export interface SerializationContext {
83
+ /** ISO date string, e.g. "2026-03-26" */
84
+ date: string;
85
+ /** UTC timestamp of generation */
86
+ generatedAt: string;
87
+ /** List of MCP tool names called to download data */
88
+ dataSources: string[];
89
+ }
90
+ export interface SignificanceEntry {
91
+ dok_id: string;
92
+ title: string;
93
+ score: number;
94
+ doctype: string;
95
+ }
96
+ export interface RiskAssessmentResult {
97
+ coalitionRiskScore: number;
98
+ riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
99
+ riskSummary: string;
100
+ anomalyFlags: Array<{
101
+ type: string;
102
+ severity: string;
103
+ description: string;
104
+ }>;
105
+ implications: string[];
106
+ }
107
+ export interface SwotSummary {
108
+ strengths: string[];
109
+ weaknesses: string[];
110
+ opportunities: string[];
111
+ threats: string[];
112
+ forStakeholder: string;
113
+ }
114
+ export interface CrossReferenceSummary {
115
+ docCount: number;
116
+ totalLinks: number;
117
+ links: DocumentLink[];
118
+ }
119
+ export interface SynthesisSummary {
120
+ totalDocs: number;
121
+ executiveSummary: string;
122
+ keyFindings: string[];
123
+ topDocuments: SignificanceEntry[];
124
+ overallConfidence: 'HIGH' | 'MEDIUM' | 'LOW';
125
+ aggregateRiskLevel: string;
126
+ }
127
+ export declare function serializeDataManifest(ctx: SerializationContext, docCounts: Record<string, number>, dateFilteredTotal?: number): string;
128
+ export declare function serializeClassificationResults(ctx: SerializationContext, results: DocumentAnalysisResult[]): string;
129
+ export declare function serializeRiskAssessment(ctx: SerializationContext, docCount: number, risk: RiskAssessmentResult): string;
130
+ export declare function serializeSwotAnalysis(ctx: SerializationContext, docCount: number, swots: SwotSummary[]): string;
131
+ export declare function serializeThreatAnalysis(ctx: SerializationContext, results: DocumentAnalysisResult[]): string;
132
+ export declare function serializeStakeholderPerspectives(ctx: SerializationContext, results: DocumentAnalysisResult[]): string;
133
+ export declare function serializeSignificanceScoring(ctx: SerializationContext, entries: SignificanceEntry[]): string;
134
+ export declare function serializeCrossReferenceMap(ctx: SerializationContext, summary: CrossReferenceSummary): string;
135
+ export declare function serializeSynthesisSummary(ctx: SerializationContext, synthesis: SynthesisSummary): string;
136
+ /**
137
+ * Serialize a per-document analysis markdown file.
138
+ *
139
+ * Each document gets its own analysis file with:
140
+ * - Full document metadata
141
+ * - Detailed SWOT analysis
142
+ * - Multi-lens stakeholder perspective analysis
143
+ * - Significance scoring factors
144
+ * - Cross-document references (where available)
145
+ * - Key insights
146
+ * - Data quality / methodology notes
147
+ *
148
+ * Note: Explicit risk indicator extraction and implications sections are
149
+ * produced at the synthesis level rather than by this per-document serializer.
150
+ */
151
+ export declare function serializeDocumentAnalysis(ctx: SerializationContext, result: DocumentAnalysisResult): string;
152
+ /**
153
+ * Sanitize a document identifier for use as a safe filename.
154
+ * Replaces non-alphanumeric characters with hyphens and lowercases.
155
+ */
156
+ export declare function sanitizeDokId(dokId: string): string;
157
+ export {};
158
+ //# sourceMappingURL=markdown-serializer.d.ts.map