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,495 @@
1
+ /**
2
+ * @module analysis-reader
3
+ * @description Reads pre-computed political intelligence analysis files from
4
+ * `analysis/daily/YYYY-MM-DD/` and provides a structured TypeScript API for
5
+ * article generators to consume classification, risk, SWOT, threat, and
6
+ * significance data.
7
+ *
8
+ * Falls back gracefully when analysis files are absent — backward compatible
9
+ * with article generators that do not yet consume pre-computed analysis.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { readDailyAnalysis } from './analysis-reader.js';
14
+ *
15
+ * const analysis = await readDailyAnalysis('2026-03-26');
16
+ * if (analysis.hasAnalysis) {
17
+ * const { classification, riskAssessment, significance } = analysis;
18
+ * // Enrich article generation with pre-computed intelligence
19
+ * }
20
+ * ```
21
+ *
22
+ * @author Hack23 AB
23
+ * @license Apache-2.0
24
+ */
25
+ import { readFile } from 'node:fs/promises';
26
+ import { join } from 'node:path';
27
+ import { existsSync } from 'node:fs';
28
+ // ---------------------------------------------------------------------------
29
+ // Constants
30
+ // ---------------------------------------------------------------------------
31
+ /** Regex pattern for matching Riksdag document IDs (e.g., H9011, H902A) */
32
+ const DOC_ID_PATTERN = /\b[A-Z]\d{3,7}[A-Z]?\b/g;
33
+ /** Default significance score when none is found in the markdown */
34
+ const DEFAULT_SIGNIFICANCE_SCORE = 50;
35
+ // ---------------------------------------------------------------------------
36
+ // Markdown parsing helpers
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Extract the first heading level 2 section content from markdown.
40
+ * Returns the text content between the heading and the next heading.
41
+ */
42
+ function extractSection(markdown, sectionName) {
43
+ const escapedName = sectionName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
44
+ const regex = new RegExp(`##\\s+${escapedName}\\s*\\n([\\s\\S]*?)(?=\\n##\\s|$)`, 'i');
45
+ const match = regex.exec(markdown);
46
+ return match?.[1]?.trim() ?? '';
47
+ }
48
+ /**
49
+ * Extract the value of a key-value pair from markdown.
50
+ * Supports formats: `**Key**: Value`, `- Key: Value`, `Key: Value`
51
+ */
52
+ function extractValue(markdown, key) {
53
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
54
+ const patterns = [
55
+ new RegExp(`\\*\\*${escapedKey}\\*\\*:\\s*(.+)`, 'i'),
56
+ new RegExp(`-\\s+${escapedKey}:\\s*(.+)`, 'i'),
57
+ new RegExp(`${escapedKey}:\\s*(.+)`, 'i'),
58
+ ];
59
+ for (const pattern of patterns) {
60
+ const match = pattern.exec(markdown);
61
+ if (match?.[1]) {
62
+ return match[1].trim().replace(/\*\*/g, '').replace(/`/g, '');
63
+ }
64
+ }
65
+ return '';
66
+ }
67
+ /**
68
+ * Extract a bullet list from a markdown section as an array of strings.
69
+ * Handles both `- item` and `* item` formats.
70
+ */
71
+ function extractBulletList(text) {
72
+ return text
73
+ .split('\n')
74
+ .map(line => line.replace(/^[\s\-*]+/, '').trim())
75
+ .filter(line => line.length > 0 && !line.startsWith('#'));
76
+ }
77
+ /**
78
+ * Extract items tagged with a specific emoji icon from text.
79
+ */
80
+ function extractIconTagged(text, icon) {
81
+ const results = [];
82
+ for (const line of text.split('\n')) {
83
+ if (line.includes(icon)) {
84
+ const cleaned = line.replace(/^[\s\-*]+/, '').trim();
85
+ if (cleaned)
86
+ results.push(cleaned);
87
+ }
88
+ }
89
+ return results;
90
+ }
91
+ /**
92
+ * Normalize a string to a ClassificationLevel.
93
+ * Returns 'MEDIUM' as default when unrecognized.
94
+ */
95
+ function toClassificationLevel(value) {
96
+ const upper = value.toUpperCase().trim();
97
+ if (upper === 'CRITICAL')
98
+ return 'CRITICAL';
99
+ if (upper === 'HIGH')
100
+ return 'HIGH';
101
+ if (upper === 'LOW')
102
+ return 'LOW';
103
+ return 'MEDIUM';
104
+ }
105
+ /**
106
+ * Normalize a string to a ConfidenceLabel.
107
+ * Returns 'MEDIUM' as default when unrecognized.
108
+ */
109
+ function toConfidenceLabel(value) {
110
+ const upper = value.toUpperCase().trim();
111
+ if (upper === 'HIGH')
112
+ return 'HIGH';
113
+ if (upper === 'LOW')
114
+ return 'LOW';
115
+ return 'MEDIUM';
116
+ }
117
+ /**
118
+ * Normalize a string to a RiskLevel.
119
+ * Returns 'moderate' as default when unrecognized.
120
+ */
121
+ function toRiskLevel(value) {
122
+ const lower = value.toLowerCase().trim();
123
+ if (lower === 'high')
124
+ return 'high';
125
+ if (lower === 'elevated')
126
+ return 'elevated';
127
+ if (lower === 'low')
128
+ return 'low';
129
+ return 'moderate';
130
+ }
131
+ /**
132
+ * Normalize a string to a DemocraticHealthLabel.
133
+ * Returns 'MEDIUM' as default when unrecognized.
134
+ */
135
+ function toDemocraticHealthLabel(value) {
136
+ const upper = value.toUpperCase().trim().replace(/[\s_-]+/g, '_');
137
+ if (upper === 'HIGH')
138
+ return 'HIGH';
139
+ if (upper === 'LOW')
140
+ return 'LOW';
141
+ if (upper === 'AT_RISK' || upper === 'ATRISK')
142
+ return 'AT_RISK';
143
+ return 'MEDIUM';
144
+ }
145
+ /**
146
+ * Normalize a string to a PriorityLevel.
147
+ * Returns 'standard' as default when unrecognized.
148
+ */
149
+ function toPriorityLevel(value) {
150
+ const lower = value.toLowerCase().trim();
151
+ if (lower === 'breaking')
152
+ return 'breaking';
153
+ if (lower === 'major')
154
+ return 'major';
155
+ if (lower === 'background')
156
+ return 'background';
157
+ return 'standard';
158
+ }
159
+ /**
160
+ * Normalize urgency labels to the known UrgencyLabel union.
161
+ * Returns 'standard' as safe default for unrecognized values.
162
+ */
163
+ function toUrgencyLabel(value) {
164
+ const lower = value.toLowerCase().trim();
165
+ if (lower === 'breaking')
166
+ return 'breaking';
167
+ if (lower === 'major')
168
+ return 'major';
169
+ if (lower === 'background')
170
+ return 'background';
171
+ return 'standard';
172
+ }
173
+ /**
174
+ * Parse SWOT entries from a markdown quadrant section.
175
+ */
176
+ function parseSwotEntries(sectionText) {
177
+ const entries = [];
178
+ const blocks = sectionText.split(/\n(?=[-*]|\d+\.)/);
179
+ for (const block of blocks) {
180
+ const text = block.replace(/^\s*(?:[-*]|\d+\.)\s+/, '').trim();
181
+ if (!text || text.startsWith('#'))
182
+ continue;
183
+ // Detect confidence: HIGH, MEDIUM, LOW in square brackets or inline
184
+ const confMatch = /\[(HIGH|MEDIUM|LOW)\]/i.exec(text);
185
+ const confidence = confMatch ? toConfidenceLabel(confMatch[1]) : 'MEDIUM';
186
+ // Detect impact
187
+ const impactMatch = /impact:\s*(high|medium|low)/i.exec(text);
188
+ const impact = impactMatch
189
+ ? impactMatch[1].toLowerCase()
190
+ : undefined;
191
+ // Detect source doc IDs (alphanumeric document ID patterns like H9011, H902A)
192
+ const docIdMatches = text.match(DOC_ID_PATTERN) ?? [];
193
+ entries.push({
194
+ text: text.replace(/\[(HIGH|MEDIUM|LOW)\]/gi, '').replace(/impact:\s*(high|medium|low)/gi, '').trim(),
195
+ confidence,
196
+ impact,
197
+ sourceDocIds: docIdMatches,
198
+ });
199
+ }
200
+ return entries.filter(e => e.text.length > 0);
201
+ }
202
+ // ---------------------------------------------------------------------------
203
+ // File parsers
204
+ // ---------------------------------------------------------------------------
205
+ /**
206
+ * Parse `classification-results.md` into a structured ClassificationResult.
207
+ */
208
+ export function parseClassificationResults(markdown) {
209
+ const level = toClassificationLevel(extractValue(markdown, 'Level') || extractValue(markdown, 'Classification Level'));
210
+ const priority = toPriorityLevel(extractValue(markdown, 'Priority'));
211
+ const confidence = toConfidenceLabel(extractValue(markdown, 'Confidence'));
212
+ // Extract document IDs mentioned in the text
213
+ const documentIds = Array.from(new Set(markdown.match(DOC_ID_PATTERN) ?? []));
214
+ // Extract domains from bullet list in Domains or Policy Domains section
215
+ const domainsSection = extractSection(markdown, 'Policy Domains') || extractSection(markdown, 'Domains');
216
+ const domains = domainsSection
217
+ ? extractBulletList(domainsSection)
218
+ : extractBulletList(extractSection(markdown, 'Classification') || '');
219
+ // Summary: prefer explicit `## Summary` section, fallback to first non-heading paragraph
220
+ const summarySection = extractSection(markdown, 'Summary');
221
+ const summary = (summarySection && summarySection.trim()) ||
222
+ /^(?!#)(.{30,})/m.exec(markdown)?.[1]?.trim() ||
223
+ markdown.split('\n').find(l => l.trim().length > 30)?.trim() ||
224
+ '';
225
+ return { level, priority, confidence, summary, documentIds, domains: domains.slice(0, 10) };
226
+ }
227
+ /**
228
+ * Parse `risk-assessment.md` into a structured RiskAssessment.
229
+ */
230
+ export function parseRiskAssessment(markdown) {
231
+ const level = toRiskLevel(extractValue(markdown, 'Overall Risk') || extractValue(markdown, 'Risk Level'));
232
+ const confidence = toConfidenceLabel(extractValue(markdown, 'Confidence'));
233
+ const factorsSection = extractSection(markdown, 'Risk Factors') || extractSection(markdown, 'Factors');
234
+ const factors = factorsSection ? extractBulletList(factorsSection) : [];
235
+ const indicators = extractIconTagged(markdown, '⚠️');
236
+ const summarySection = extractSection(markdown, 'Summary') || extractSection(markdown, 'Overview');
237
+ const summary = summarySection || markdown.split('\n').filter(l => l.trim().length > 30).slice(0, 2).join(' ');
238
+ return { level, factors: factors.slice(0, 10), indicators: indicators.slice(0, 8), confidence, summary };
239
+ }
240
+ /**
241
+ * Parse `swot-analysis.md` into a structured SwotAnalysisResult.
242
+ */
243
+ export function parseSwotAnalysis(markdown) {
244
+ const subject = extractValue(markdown, 'Subject') || 'Swedish Parliament';
245
+ const context = extractSection(markdown, 'Context') || undefined;
246
+ const strengthsSection = extractSection(markdown, 'Strengths') || extractSection(markdown, '💪 Strengths');
247
+ const weaknessesSection = extractSection(markdown, 'Weaknesses') || extractSection(markdown, '⚡ Weaknesses');
248
+ const opportunitiesSection = extractSection(markdown, 'Opportunities') || extractSection(markdown, '🚀 Opportunities');
249
+ const threatsSection = extractSection(markdown, 'Threats') || extractSection(markdown, '☁️ Threats');
250
+ return {
251
+ subject,
252
+ strengths: parseSwotEntries(strengthsSection),
253
+ weaknesses: parseSwotEntries(weaknessesSection),
254
+ opportunities: parseSwotEntries(opportunitiesSection),
255
+ threats: parseSwotEntries(threatsSection),
256
+ context,
257
+ };
258
+ }
259
+ /**
260
+ * Parse `threat-analysis.md` into a structured ThreatAnalysisResult.
261
+ */
262
+ export function parseThreatAnalysis(markdown) {
263
+ const indicators = extractIconTagged(markdown, '🎯');
264
+ const democraticHealth = toDemocraticHealthLabel(extractValue(markdown, 'Democratic Health') || extractValue(markdown, 'Health Status') || 'MEDIUM');
265
+ const confidence = toConfidenceLabel(extractValue(markdown, 'Confidence'));
266
+ const actorsSection = extractSection(markdown, 'Key Actors') || extractSection(markdown, 'Actors');
267
+ const actors = actorsSection ? extractBulletList(actorsSection) : [];
268
+ const summarySection = extractSection(markdown, 'Summary') || extractSection(markdown, 'Overview');
269
+ const summary = summarySection || markdown.split('\n').filter(l => l.trim().length > 30).slice(0, 2).join(' ');
270
+ return { indicators: indicators.slice(0, 8), democraticHealth, actors: actors.slice(0, 6), confidence, summary };
271
+ }
272
+ /**
273
+ * Parse `stakeholder-perspectives.md` into a structured StakeholderPerspectivesResult.
274
+ */
275
+ export function parseStakeholderPerspectives(markdown) {
276
+ const government = extractSection(markdown, '🏛️ Government') || extractSection(markdown, 'Government') || '';
277
+ const opposition = extractSection(markdown, '⚖️ Opposition') || extractSection(markdown, 'Opposition') || '';
278
+ const citizen = extractSection(markdown, '👥 Citizen') ||
279
+ extractSection(markdown, 'Citizen') ||
280
+ extractSection(markdown, 'Citizens') ||
281
+ '';
282
+ const economic = extractSection(markdown, '💰 Economic') || extractSection(markdown, 'Economic') || '';
283
+ const international = extractSection(markdown, '🌍 International') || extractSection(markdown, 'International') || '';
284
+ const media = extractSection(markdown, '📰 Media') || extractSection(markdown, 'Media') || '';
285
+ return {
286
+ government: government.split('\n').filter(l => l.trim()).join(' ').trim(),
287
+ opposition: opposition.split('\n').filter(l => l.trim()).join(' ').trim(),
288
+ citizen: citizen.split('\n').filter(l => l.trim()).join(' ').trim(),
289
+ economic: economic.split('\n').filter(l => l.trim()).join(' ').trim(),
290
+ international: international.split('\n').filter(l => l.trim()).join(' ').trim(),
291
+ media: media.split('\n').filter(l => l.trim()).join(' ').trim(),
292
+ };
293
+ }
294
+ /**
295
+ * Parse `significance-scoring.md` into a structured SignificanceScoringResult.
296
+ */
297
+ export function parseSignificanceScoring(markdown) {
298
+ const scoreStr = extractValue(markdown, 'Overall Score') || extractValue(markdown, 'Score');
299
+ const score = scoreStr ? Math.min(100, Math.max(0, parseInt(scoreStr, 10) || DEFAULT_SIGNIFICANCE_SCORE)) : DEFAULT_SIGNIFICANCE_SCORE;
300
+ const urgency = toUrgencyLabel(extractValue(markdown, 'Urgency') || 'standard');
301
+ const confidence = toConfidenceLabel(extractValue(markdown, 'Confidence'));
302
+ // Extract top documents from a list
303
+ const topDocumentsSection = extractSection(markdown, 'Top Documents') || extractSection(markdown, 'Significant Documents');
304
+ const topDocuments = [];
305
+ for (const line of topDocumentsSection.split('\n')) {
306
+ const match = /([A-Z]\d{3,7}[A-Z]?).*?(\d{1,3})(?:%|\s+points?|\s+score)?[:\s—-]+(.+)/i.exec(line.trim());
307
+ if (match) {
308
+ const rawScore = parseInt(match[2], 10);
309
+ topDocuments.push({
310
+ docId: match[1],
311
+ score: Math.min(100, Math.max(0, Number.isFinite(rawScore) ? rawScore : 0)),
312
+ reason: match[3].trim(),
313
+ });
314
+ }
315
+ }
316
+ return { score, urgency, topDocuments: topDocuments.slice(0, 5), confidence };
317
+ }
318
+ /**
319
+ * Parse `synthesis-summary.md` into a structured SynthesisSummaryResult.
320
+ */
321
+ export function parseSynthesisSummary(markdown) {
322
+ const narrativeDirection = extractSection(markdown, 'Narrative Direction') || extractSection(markdown, 'Primary Narrative') || '';
323
+ const articleFocus = extractSection(markdown, 'Article Focus') || extractSection(markdown, 'Focus') || '';
324
+ const themesSection = extractSection(markdown, 'Key Themes') || extractSection(markdown, 'Themes');
325
+ const keyThemes = themesSection ? extractBulletList(themesSection) : [];
326
+ const forwardSection = extractSection(markdown, 'Forward Indicators') || extractSection(markdown, 'What to Watch');
327
+ const forwardIndicators = forwardSection ? extractBulletList(forwardSection) : [];
328
+ return {
329
+ narrativeDirection: narrativeDirection.split('\n').filter(l => l.trim()).join(' ').trim(),
330
+ keyThemes: keyThemes.slice(0, 8),
331
+ articleFocus: articleFocus.split('\n').filter(l => l.trim()).join(' ').trim(),
332
+ forwardIndicators: forwardIndicators.slice(0, 5),
333
+ };
334
+ }
335
+ // ---------------------------------------------------------------------------
336
+ // File reading helpers
337
+ // ---------------------------------------------------------------------------
338
+ /** Base path for the analysis directory relative to project root */
339
+ const ANALYSIS_BASE_PATH = 'analysis/daily';
340
+ /** Analysis file names within a daily directory */
341
+ const ANALYSIS_FILES = {
342
+ classification: 'classification-results.md',
343
+ risk: 'risk-assessment.md',
344
+ swot: 'swot-analysis.md',
345
+ threat: 'threat-analysis.md',
346
+ stakeholders: 'stakeholder-perspectives.md',
347
+ significance: 'significance-scoring.md',
348
+ synthesis: 'synthesis-summary.md',
349
+ };
350
+ /** Strict YYYY-MM-DD format guard to prevent path traversal via `date`. */
351
+ const DATE_FORMAT_RE = /^\d{4}-\d{2}-\d{2}$/;
352
+ /**
353
+ * Attempt to read a markdown file from the analysis directory.
354
+ * Returns `null` if the file does not exist, cannot be read, or `date` is
355
+ * not a valid YYYY-MM-DD string (guards against path traversal).
356
+ */
357
+ async function readAnalysisFile(date, filename, basePath) {
358
+ if (!DATE_FORMAT_RE.test(date))
359
+ return null;
360
+ const resolvedBase = basePath ?? ANALYSIS_BASE_PATH;
361
+ const filePath = join(resolvedBase, date, filename);
362
+ try {
363
+ return await readFile(filePath, 'utf-8');
364
+ }
365
+ catch {
366
+ return null;
367
+ }
368
+ }
369
+ // ---------------------------------------------------------------------------
370
+ // Public API
371
+ // ---------------------------------------------------------------------------
372
+ /**
373
+ * Read and parse all pre-computed analysis files for a given date.
374
+ *
375
+ * @param date - Date string in YYYY-MM-DD format
376
+ * @param basePath - Optional override for the base analysis directory path
377
+ * @returns Complete DailyAnalysis object; individual fields are `null` when
378
+ * the corresponding file is absent or cannot be parsed.
379
+ *
380
+ * @example
381
+ * ```typescript
382
+ * const analysis = await readDailyAnalysis('2026-03-26');
383
+ * if (analysis.hasAnalysis) {
384
+ * console.log(analysis.classification?.level); // 'HIGH'
385
+ * console.log(analysis.significance?.score); // 72
386
+ * }
387
+ * ```
388
+ */
389
+ export async function readDailyAnalysis(date, basePath) {
390
+ const [classificationMd, riskMd, swotMd, threatMd, stakeholdersMd, significanceMd, synthesisMd,] = await Promise.all([
391
+ readAnalysisFile(date, ANALYSIS_FILES.classification, basePath),
392
+ readAnalysisFile(date, ANALYSIS_FILES.risk, basePath),
393
+ readAnalysisFile(date, ANALYSIS_FILES.swot, basePath),
394
+ readAnalysisFile(date, ANALYSIS_FILES.threat, basePath),
395
+ readAnalysisFile(date, ANALYSIS_FILES.stakeholders, basePath),
396
+ readAnalysisFile(date, ANALYSIS_FILES.significance, basePath),
397
+ readAnalysisFile(date, ANALYSIS_FILES.synthesis, basePath),
398
+ ]);
399
+ const classification = classificationMd ? parseClassificationResults(classificationMd) : null;
400
+ const riskAssessment = riskMd ? parseRiskAssessment(riskMd) : null;
401
+ const swot = swotMd ? parseSwotAnalysis(swotMd) : null;
402
+ const threatAnalysis = threatMd ? parseThreatAnalysis(threatMd) : null;
403
+ const stakeholderPerspectives = stakeholdersMd ? parseStakeholderPerspectives(stakeholdersMd) : null;
404
+ const significance = significanceMd ? parseSignificanceScoring(significanceMd) : null;
405
+ const synthesis = synthesisMd ? parseSynthesisSummary(synthesisMd) : null;
406
+ const hasAnalysis = [
407
+ classification,
408
+ riskAssessment,
409
+ swot,
410
+ threatAnalysis,
411
+ stakeholderPerspectives,
412
+ significance,
413
+ synthesis,
414
+ ].some(field => field !== null);
415
+ return {
416
+ date,
417
+ classification,
418
+ riskAssessment,
419
+ swot,
420
+ threatAnalysis,
421
+ stakeholderPerspectives,
422
+ significance,
423
+ synthesis,
424
+ hasAnalysis,
425
+ };
426
+ }
427
+ /**
428
+ * Derive the most recent date for which analysis files exist.
429
+ * Searches backwards from today up to `maxDaysBack` days.
430
+ *
431
+ * @param maxDaysBack - Maximum number of days to search back (default 7)
432
+ * @param basePath - Optional override for the base analysis directory path
433
+ * @returns ISO date string (YYYY-MM-DD) or `null` if no analysis found
434
+ */
435
+ export async function findLatestAnalysisDate(maxDaysBack = 7, basePath) {
436
+ const resolvedBase = basePath ?? ANALYSIS_BASE_PATH;
437
+ const today = new Date();
438
+ for (let i = 0; i < maxDaysBack; i++) {
439
+ const d = new Date(today);
440
+ d.setDate(d.getDate() - i);
441
+ const dateStr = d.toISOString().split('T')[0];
442
+ const dirPath = join(resolvedBase, dateStr);
443
+ if (existsSync(dirPath)) {
444
+ // Check at least one analysis file exists
445
+ const hasFile = Object.values(ANALYSIS_FILES).some(f => existsSync(join(dirPath, f)));
446
+ if (hasFile)
447
+ return dateStr;
448
+ }
449
+ }
450
+ return null;
451
+ }
452
+ /**
453
+ * Read the most recent available daily analysis.
454
+ * Convenience wrapper around `findLatestAnalysisDate` + `readDailyAnalysis`.
455
+ *
456
+ * @param maxDaysBack - Maximum number of days to search back (default 7)
457
+ * @param basePath - Optional override for the base analysis directory path
458
+ * @returns DailyAnalysis for the most recent date found, or a stub with
459
+ * `hasAnalysis: false` when no analysis files exist.
460
+ */
461
+ export async function readLatestAnalysis(maxDaysBack = 7, basePath) {
462
+ const date = await findLatestAnalysisDate(maxDaysBack, basePath);
463
+ if (!date) {
464
+ const today = new Date().toISOString().split('T')[0];
465
+ return {
466
+ date: today,
467
+ classification: null,
468
+ riskAssessment: null,
469
+ swot: null,
470
+ threatAnalysis: null,
471
+ stakeholderPerspectives: null,
472
+ significance: null,
473
+ synthesis: null,
474
+ hasAnalysis: false,
475
+ };
476
+ }
477
+ return readDailyAnalysis(date, basePath);
478
+ }
479
+ /**
480
+ * Derive article classification metadata from a DailyAnalysis.
481
+ * Returns safe defaults when analysis is absent.
482
+ *
483
+ * @param analysis - DailyAnalysis object (may have hasAnalysis: false)
484
+ * @returns Flattened metadata suitable for ArticleData enrichment
485
+ */
486
+ export function deriveArticleClassificationMeta(analysis) {
487
+ return {
488
+ classificationLevel: analysis.classification?.level ?? 'MEDIUM',
489
+ riskLevel: analysis.riskAssessment?.level ?? 'moderate',
490
+ confidenceLabel: analysis.classification?.confidence ?? analysis.riskAssessment?.confidence ?? 'MEDIUM',
491
+ significanceScore: analysis.significance?.score,
492
+ urgency: analysis.significance?.urgency,
493
+ };
494
+ }
495
+ //# sourceMappingURL=analysis-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-reader.js","sourceRoot":"","sources":["../../scripts/analysis-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AA8JrC,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,2EAA2E;AAC3E,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAEjD,oEAAoE;AACpE,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,cAAc,CAAC,QAAgB,EAAE,WAAmB;IAC3D,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,SAAS,WAAW,mCAAmC,EACvD,GAAG,CACJ,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,GAAW;IACjD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG;QACf,IAAI,MAAM,CAAC,SAAS,UAAU,iBAAiB,EAAE,GAAG,CAAC;QACrD,IAAI,MAAM,CAAC,QAAQ,UAAU,WAAW,EAAE,GAAG,CAAC;QAC9C,IAAI,MAAM,CAAC,GAAG,UAAU,WAAW,EAAE,GAAG,CAAC;KAC1C,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACjD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAChD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAChD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,oEAAoE;QACpE,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE3E,gBAAgB;QAChB,MAAM,WAAW,GAAG,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,WAAW;YACxB,CAAC,CAAE,WAAW,CAAC,CAAC,CAAE,CAAC,WAAW,EAAgC;YAC9D,CAAC,CAAC,SAAS,CAAC;QAEd,8EAA8E;QAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEtD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YACrG,UAAU;YACV,MAAM;YACN,YAAY,EAAE,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,MAAM,KAAK,GAAG,qBAAqB,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACvH,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3E,6CAA6C;IAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE9E,wEAAwE;IACxE,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,cAAc;QAC5B,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC;QACnC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;IAExE,yFAAyF;IACzF,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,OAAO,GACX,CAAC,cAAc,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;QACzC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QAC7C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE;QAC5D,EAAE,CAAC;IAEL,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1G,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3E,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/G,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC3G,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,oBAAoB,CAAC;IAC1E,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;IAEjE,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC3G,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC7G,MAAM,oBAAoB,GAAG,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACvH,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAErG,OAAO;QACL,OAAO;QACP,SAAS,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;QAC7C,UAAU,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;QAC/C,aAAa,EAAE,gBAAgB,CAAC,oBAAoB,CAAC;QACrD,OAAO,EAAE,gBAAgB,CAAC,cAAc,CAAC;QACzC,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,YAAY,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,QAAQ,CAAC,CAAC;IACrJ,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3E,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnG,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/G,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACnH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAgB;IAC3D,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;IAC9G,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;IAC7G,MAAM,OAAO,GACX,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC;QACtC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;QACnC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC;QACpC,EAAE,CAAC;IACL,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;IACvG,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IACtH,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAE9F,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QACzE,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QACzE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QACnE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QACrE,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QAC/E,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;KAChE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC;IACvI,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,UAAU,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3E,oCAAoC;IACpC,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAC3H,MAAM,YAAY,GAA4D,EAAE,CAAC;IACjF,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1G,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC;gBAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE;gBAChB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,kBAAkB,GAAG,cAAc,CAAC,QAAQ,EAAE,qBAAqB,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAClI,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAE1G,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,oBAAoB,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACnH,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,OAAO;QACL,kBAAkB,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QACzF,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QAC7E,iBAAiB,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,mDAAmD;AACnD,MAAM,cAAc,GAAG;IACrB,cAAc,EAAE,2BAA2B;IAC3C,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE,kBAAkB;IACxB,MAAM,EAAE,oBAAoB;IAC5B,YAAY,EAAE,6BAA6B;IAC3C,YAAY,EAAE,yBAAyB;IACvC,SAAS,EAAE,sBAAsB;CACzB,CAAC;AAEX,2EAA2E;AAC3E,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAiB;IAC/E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,YAAY,GAAG,QAAQ,IAAI,kBAAkB,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAiB;IACrE,MAAM,CACJ,gBAAgB,EAChB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,cAAc,EACd,cAAc,EACd,WAAW,EACZ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpB,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC;QAC/D,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrD,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrD,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;QACvD,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC7D,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC7D,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC;KAC3D,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,uBAAuB,GAAG,cAAc,CAAC,CAAC,CAAC,4BAA4B,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrG,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1E,MAAM,WAAW,GAAG;QAClB,cAAc;QACd,cAAc;QACd,IAAI;QACJ,cAAc;QACd,uBAAuB;QACvB,YAAY;QACZ,SAAS;KACV,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAEhC,OAAO;QACL,IAAI;QACJ,cAAc;QACd,cAAc;QACd,IAAI;QACJ,cAAc;QACd,uBAAuB;QACvB,YAAY;QACZ,SAAS;QACT,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAW,GAAG,CAAC,EAAE,QAAiB;IAC7E,MAAM,YAAY,GAAG,QAAQ,IAAI,kBAAkB,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,0CAA0C;YAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAW,GAAG,CAAC,EAAE,QAAiB;IACzE,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACtD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,cAAc,EAAE,IAAI;YACpB,cAAc,EAAE,IAAI;YACpB,IAAI,EAAE,IAAI;YACV,cAAc,EAAE,IAAI;YACpB,uBAAuB,EAAE,IAAI;YAC7B,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,QAAuB;IAOrE,OAAO;QACL,mBAAmB,EAAE,QAAQ,CAAC,cAAc,EAAE,KAAK,IAAI,QAAQ;QAC/D,SAAS,EAAE,QAAQ,CAAC,cAAc,EAAE,KAAK,IAAI,UAAU;QACvD,eAAe,EAAE,QAAQ,CAAC,cAAc,EAAE,UAAU,IAAI,QAAQ,CAAC,cAAc,EAAE,UAAU,IAAI,QAAQ;QACvG,iBAAiB,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK;QAC/C,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,OAAO;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @module Intelligence/ContentQuality
4
+ * @category Intelligence Operations / Supporting Infrastructure
5
+ * @name Article Quality Enhancer - Political Intelligence Content Validation Framework (TypeScript)
6
+ *
7
+ * @description
8
+ * Comprehensive content quality assurance system implementing OSINT/INTOP-driven editorial standards
9
+ * for political intelligence journalism. This utility validates article structure, analytical depth, source attribution,
10
+ * and perspective diversity to ensure intelligence reporting meets rigorous transparency requirements.
11
+ *
12
+ * @author Hack23 AB (Content Intelligence Team)
13
+ * @license Apache-2.0
14
+ * @version 2.0.0
15
+ */
16
+ import type { QualityThresholds, QualityMetrics, QualityResult } from './types/validation.js';
17
+ /**
18
+ * Default quality thresholds based on political intelligence editorial standards
19
+ */
20
+ declare const DEFAULT_THRESHOLDS: QualityThresholds;
21
+ /**
22
+ * Assess analytical depth of article content
23
+ *
24
+ * Looks for:
25
+ * - Causal reasoning ("because", "therefore", "as a result")
26
+ * - Comparative analysis ("compared to", "in contrast", "while")
27
+ * - Trend analysis ("trend", "pattern", "shift")
28
+ * - Evidence-based claims (references to data, studies, reports)
29
+ * - Multiple perspectives (quotes from different actors)
30
+ *
31
+ * @param content - HTML content of article
32
+ * @returns Score 0.0-1.0
33
+ */
34
+ declare function assessAnalyticalDepth(content: string): number;
35
+ /**
36
+ * Count unique party perspectives mentioned in article.
37
+ *
38
+ * Uses PARTY_VARIANTS pattern to prevent double-counting when both
39
+ * full names and abbreviations appear in the same text.
40
+ *
41
+ * @param content - HTML content of article
42
+ * @returns Number of unique parties mentioned
43
+ */
44
+ declare function countPartyPerspectives(content: string): number;
45
+ /**
46
+ * Count cross-referenced Riksdag/Regering documents
47
+ *
48
+ * @param content - HTML content of article
49
+ * @returns Number of unique document IDs found
50
+ */
51
+ declare function countCrossReferences(content: string): number;
52
+ /**
53
+ * Detect "Why This Matters" section
54
+ *
55
+ * @param content - HTML content of article
56
+ * @returns True if section exists
57
+ */
58
+ declare function hasWhyThisMatters(content: string): boolean;
59
+ /**
60
+ * Detect historical context
61
+ *
62
+ * @param content - HTML content of article
63
+ * @returns True if historical context present
64
+ */
65
+ declare function hasHistoricalContext(content: string): boolean;
66
+ /**
67
+ * Detect international comparison
68
+ *
69
+ * @param content - HTML content of article
70
+ * @returns True if international comparison present
71
+ */
72
+ declare function hasInternationalComparison(content: string): boolean;
73
+ /**
74
+ * Detect language switcher navigation
75
+ *
76
+ * @param content - HTML content of article
77
+ * @returns True if language switcher nav is present
78
+ */
79
+ declare function hasLanguageSwitcher(content: string): boolean;
80
+ /**
81
+ * Detect article-top-nav with back-to-news link
82
+ *
83
+ * @param content - HTML content of article
84
+ * @returns True if article-top-nav div is present
85
+ */
86
+ declare function hasArticleTopNav(content: string): boolean;
87
+ /**
88
+ * Detect back-to-news link (in top nav or footer)
89
+ *
90
+ * @param content - HTML content of article
91
+ * @returns True if back-to-news link is present
92
+ */
93
+ declare function hasBackToNews(content: string): boolean;
94
+ /**
95
+ * Calculate overall quality score
96
+ *
97
+ * Weights:
98
+ * - Analytical depth: 30%
99
+ * - Party perspectives: 25%
100
+ * - Cross-references: 25%
101
+ * - "Why This Matters": 10%
102
+ * - Historical context: 5%
103
+ * - International comparison: 5%
104
+ *
105
+ * @param metrics - Individual quality metrics
106
+ * @returns Overall score 0.0-1.0
107
+ */
108
+ declare function calculateQualityScore(metrics: QualityMetrics): number;
109
+ /**
110
+ * Enhance article quality and validate against thresholds
111
+ *
112
+ * @param articlePath - Path to article HTML file
113
+ * @param thresholds - Quality thresholds (optional, merged with defaults)
114
+ * @returns Quality assessment result
115
+ */
116
+ export declare function enhanceArticleQuality(articlePath: string, thresholds?: Partial<QualityThresholds>): Promise<QualityResult>;
117
+ /**
118
+ * Batch enhance multiple articles
119
+ *
120
+ * @param articlePaths - Array of article paths
121
+ * @param thresholds - Quality thresholds (optional, merged with defaults)
122
+ * @returns Array of quality results
123
+ */
124
+ export declare function batchEnhanceQuality(articlePaths: readonly string[], thresholds?: Partial<QualityThresholds>): Promise<QualityResult[]>;
125
+ /**
126
+ * Fix common HTML nesting errors in article content.
127
+ *
128
+ * Corrects invalid block-level nesting patterns:
129
+ * - `<p><ul>` → removes the enclosing `<p>` so the `<ul>` list is not nested inside a `<p>` paragraph
130
+ * - `<p><ol>` → removes the enclosing `<p>` so the `<ol>` list is not nested inside a `<p>` paragraph
131
+ * - `<p><div>` → removes the enclosing `<p>` so the block-level `<div>` is not nested inside a `<p>` paragraph
132
+ * - Orphaned `</p>` immediately after `</ul>` → removed
133
+ * - Orphaned `</p>` immediately after `</ol>` → removed
134
+ * - Orphaned `</p>` immediately after `</div>` (when wrapped by `<p>`) → removed
135
+ *
136
+ * @param content - Raw HTML content
137
+ * @returns Fixed HTML content
138
+ */
139
+ export declare function fixArticleHtmlNesting(content: string): string;
140
+ /**
141
+ * Fix HTML nesting errors in a file in-place.
142
+ *
143
+ * @param filePath - Path to the HTML file to fix
144
+ * @returns True if the file was modified
145
+ */
146
+ export declare function fixHtmlNestingInFile(filePath: string): boolean;
147
+ export { assessAnalyticalDepth, countPartyPerspectives, countCrossReferences, hasWhyThisMatters, hasHistoricalContext, hasInternationalComparison, hasLanguageSwitcher, hasArticleTopNav, hasBackToNews, calculateQualityScore, DEFAULT_THRESHOLDS, };
148
+ //# sourceMappingURL=article-quality-enhancer.d.ts.map