euparliamentmonitor 0.8.4

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 (276) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1005 -0
  3. package/SECURITY.md +151 -0
  4. package/package.json +131 -0
  5. package/scripts/constants/committee-indicator-map.d.ts +199 -0
  6. package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
  7. package/scripts/constants/committee-indicator-map.js +1224 -0
  8. package/scripts/constants/committee-indicator-map.js.map +1 -0
  9. package/scripts/constants/config.d.ts +38 -0
  10. package/scripts/constants/config.d.ts.map +1 -0
  11. package/scripts/constants/config.js +66 -0
  12. package/scripts/constants/config.js.map +1 -0
  13. package/scripts/constants/language-articles.d.ts +84 -0
  14. package/scripts/constants/language-articles.d.ts.map +1 -0
  15. package/scripts/constants/language-articles.js +6771 -0
  16. package/scripts/constants/language-articles.js.map +1 -0
  17. package/scripts/constants/language-core.d.ts +38 -0
  18. package/scripts/constants/language-core.d.ts.map +1 -0
  19. package/scripts/constants/language-core.js +90 -0
  20. package/scripts/constants/language-core.js.map +1 -0
  21. package/scripts/constants/language-ui.d.ts +82 -0
  22. package/scripts/constants/language-ui.d.ts.map +1 -0
  23. package/scripts/constants/language-ui.js +889 -0
  24. package/scripts/constants/language-ui.js.map +1 -0
  25. package/scripts/constants/languages.d.ts +14 -0
  26. package/scripts/constants/languages.d.ts.map +1 -0
  27. package/scripts/constants/languages.js +15 -0
  28. package/scripts/constants/languages.js.map +1 -0
  29. package/scripts/generators/analysis-builders.d.ts +266 -0
  30. package/scripts/generators/analysis-builders.d.ts.map +1 -0
  31. package/scripts/generators/analysis-builders.js +2903 -0
  32. package/scripts/generators/analysis-builders.js.map +1 -0
  33. package/scripts/generators/breaking-content.d.ts +45 -0
  34. package/scripts/generators/breaking-content.d.ts.map +1 -0
  35. package/scripts/generators/breaking-content.js +530 -0
  36. package/scripts/generators/breaking-content.js.map +1 -0
  37. package/scripts/generators/committee-helpers.d.ts +54 -0
  38. package/scripts/generators/committee-helpers.d.ts.map +1 -0
  39. package/scripts/generators/committee-helpers.js +154 -0
  40. package/scripts/generators/committee-helpers.js.map +1 -0
  41. package/scripts/generators/dashboard-content.d.ts +95 -0
  42. package/scripts/generators/dashboard-content.d.ts.map +1 -0
  43. package/scripts/generators/dashboard-content.js +630 -0
  44. package/scripts/generators/dashboard-content.js.map +1 -0
  45. package/scripts/generators/deep-analysis-content.d.ts +23 -0
  46. package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
  47. package/scripts/generators/deep-analysis-content.js +831 -0
  48. package/scripts/generators/deep-analysis-content.js.map +1 -0
  49. package/scripts/generators/mindmap-content.d.ts +55 -0
  50. package/scripts/generators/mindmap-content.d.ts.map +1 -0
  51. package/scripts/generators/mindmap-content.js +512 -0
  52. package/scripts/generators/mindmap-content.js.map +1 -0
  53. package/scripts/generators/motions-content.d.ts +50 -0
  54. package/scripts/generators/motions-content.d.ts.map +1 -0
  55. package/scripts/generators/motions-content.js +391 -0
  56. package/scripts/generators/motions-content.js.map +1 -0
  57. package/scripts/generators/news-enhanced.d.ts +14 -0
  58. package/scripts/generators/news-enhanced.d.ts.map +1 -0
  59. package/scripts/generators/news-enhanced.js +169 -0
  60. package/scripts/generators/news-enhanced.js.map +1 -0
  61. package/scripts/generators/news-indexes.d.ts +31 -0
  62. package/scripts/generators/news-indexes.d.ts.map +1 -0
  63. package/scripts/generators/news-indexes.js +410 -0
  64. package/scripts/generators/news-indexes.js.map +1 -0
  65. package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
  66. package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
  67. package/scripts/generators/pipeline/fetch-stage.js +1522 -0
  68. package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
  69. package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
  70. package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
  71. package/scripts/generators/pipeline/generate-stage.js +204 -0
  72. package/scripts/generators/pipeline/generate-stage.js.map +1 -0
  73. package/scripts/generators/pipeline/output-stage.d.ts +48 -0
  74. package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
  75. package/scripts/generators/pipeline/output-stage.js +145 -0
  76. package/scripts/generators/pipeline/output-stage.js.map +1 -0
  77. package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
  78. package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
  79. package/scripts/generators/pipeline/transform-stage.js +111 -0
  80. package/scripts/generators/pipeline/transform-stage.js.map +1 -0
  81. package/scripts/generators/propositions-content.d.ts +29 -0
  82. package/scripts/generators/propositions-content.d.ts.map +1 -0
  83. package/scripts/generators/propositions-content.js +90 -0
  84. package/scripts/generators/propositions-content.js.map +1 -0
  85. package/scripts/generators/sankey-content.d.ts +45 -0
  86. package/scripts/generators/sankey-content.d.ts.map +1 -0
  87. package/scripts/generators/sankey-content.js +227 -0
  88. package/scripts/generators/sankey-content.js.map +1 -0
  89. package/scripts/generators/sitemap.d.ts +66 -0
  90. package/scripts/generators/sitemap.d.ts.map +1 -0
  91. package/scripts/generators/sitemap.js +562 -0
  92. package/scripts/generators/sitemap.js.map +1 -0
  93. package/scripts/generators/strategies/article-strategy.d.ts +146 -0
  94. package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
  95. package/scripts/generators/strategies/article-strategy.js +4 -0
  96. package/scripts/generators/strategies/article-strategy.js.map +1 -0
  97. package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
  98. package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
  99. package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
  100. package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
  101. package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
  102. package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
  103. package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
  104. package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
  105. package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
  106. package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
  107. package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
  108. package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
  109. package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
  110. package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
  111. package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
  112. package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
  113. package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
  114. package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
  115. package/scripts/generators/strategies/motions-strategy.js +215 -0
  116. package/scripts/generators/strategies/motions-strategy.js.map +1 -0
  117. package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
  118. package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
  119. package/scripts/generators/strategies/propositions-strategy.js +257 -0
  120. package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
  121. package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
  122. package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
  123. package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
  124. package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
  125. package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
  126. package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
  127. package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
  128. package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
  129. package/scripts/generators/swot-content.d.ts +42 -0
  130. package/scripts/generators/swot-content.d.ts.map +1 -0
  131. package/scripts/generators/swot-content.js +366 -0
  132. package/scripts/generators/swot-content.js.map +1 -0
  133. package/scripts/generators/week-ahead-content.d.ts +103 -0
  134. package/scripts/generators/week-ahead-content.d.ts.map +1 -0
  135. package/scripts/generators/week-ahead-content.js +610 -0
  136. package/scripts/generators/week-ahead-content.js.map +1 -0
  137. package/scripts/index.d.ts +40 -0
  138. package/scripts/index.d.ts.map +1 -0
  139. package/scripts/index.js +53 -0
  140. package/scripts/index.js.map +1 -0
  141. package/scripts/mcp/ep-mcp-client.d.ts +471 -0
  142. package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
  143. package/scripts/mcp/ep-mcp-client.js +734 -0
  144. package/scripts/mcp/ep-mcp-client.js.map +1 -0
  145. package/scripts/mcp/mcp-connection.d.ts +264 -0
  146. package/scripts/mcp/mcp-connection.d.ts.map +1 -0
  147. package/scripts/mcp/mcp-connection.js +790 -0
  148. package/scripts/mcp/mcp-connection.js.map +1 -0
  149. package/scripts/mcp/mcp-health.d.ts +75 -0
  150. package/scripts/mcp/mcp-health.d.ts.map +1 -0
  151. package/scripts/mcp/mcp-health.js +78 -0
  152. package/scripts/mcp/mcp-health.js.map +1 -0
  153. package/scripts/mcp/mcp-retry.d.ts +94 -0
  154. package/scripts/mcp/mcp-retry.d.ts.map +1 -0
  155. package/scripts/mcp/mcp-retry.js +127 -0
  156. package/scripts/mcp/mcp-retry.js.map +1 -0
  157. package/scripts/mcp/wb-mcp-client.d.ts +38 -0
  158. package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
  159. package/scripts/mcp/wb-mcp-client.js +112 -0
  160. package/scripts/mcp/wb-mcp-client.js.map +1 -0
  161. package/scripts/templates/article-template.d.ts +9 -0
  162. package/scripts/templates/article-template.d.ts.map +1 -0
  163. package/scripts/templates/article-template.js +378 -0
  164. package/scripts/templates/article-template.js.map +1 -0
  165. package/scripts/templates/section-builders.d.ts +28 -0
  166. package/scripts/templates/section-builders.d.ts.map +1 -0
  167. package/scripts/templates/section-builders.js +142 -0
  168. package/scripts/templates/section-builders.js.map +1 -0
  169. package/scripts/types/analysis.d.ts +115 -0
  170. package/scripts/types/analysis.d.ts.map +1 -0
  171. package/scripts/types/analysis.js +4 -0
  172. package/scripts/types/analysis.js.map +1 -0
  173. package/scripts/types/common.d.ts +584 -0
  174. package/scripts/types/common.d.ts.map +1 -0
  175. package/scripts/types/common.js +96 -0
  176. package/scripts/types/common.js.map +1 -0
  177. package/scripts/types/generation.d.ts +104 -0
  178. package/scripts/types/generation.d.ts.map +1 -0
  179. package/scripts/types/generation.js +4 -0
  180. package/scripts/types/generation.js.map +1 -0
  181. package/scripts/types/index.d.ts +24 -0
  182. package/scripts/types/index.d.ts.map +1 -0
  183. package/scripts/types/index.js +16 -0
  184. package/scripts/types/index.js.map +1 -0
  185. package/scripts/types/intelligence.d.ts +129 -0
  186. package/scripts/types/intelligence.d.ts.map +1 -0
  187. package/scripts/types/intelligence.js +4 -0
  188. package/scripts/types/intelligence.js.map +1 -0
  189. package/scripts/types/mcp.d.ts +418 -0
  190. package/scripts/types/mcp.d.ts.map +1 -0
  191. package/scripts/types/mcp.js +4 -0
  192. package/scripts/types/mcp.js.map +1 -0
  193. package/scripts/types/parliament.d.ts +388 -0
  194. package/scripts/types/parliament.d.ts.map +1 -0
  195. package/scripts/types/parliament.js +4 -0
  196. package/scripts/types/parliament.js.map +1 -0
  197. package/scripts/types/quality.d.ts +114 -0
  198. package/scripts/types/quality.d.ts.map +1 -0
  199. package/scripts/types/quality.js +4 -0
  200. package/scripts/types/quality.js.map +1 -0
  201. package/scripts/types/stakeholder.d.ts +88 -0
  202. package/scripts/types/stakeholder.d.ts.map +1 -0
  203. package/scripts/types/stakeholder.js +16 -0
  204. package/scripts/types/stakeholder.js.map +1 -0
  205. package/scripts/types/visualization.d.ts +708 -0
  206. package/scripts/types/visualization.d.ts.map +1 -0
  207. package/scripts/types/visualization.js +4 -0
  208. package/scripts/types/visualization.js.map +1 -0
  209. package/scripts/types/world-bank.d.ts +85 -0
  210. package/scripts/types/world-bank.d.ts.map +1 -0
  211. package/scripts/types/world-bank.js +4 -0
  212. package/scripts/types/world-bank.js.map +1 -0
  213. package/scripts/utils/article-category.d.ts +18 -0
  214. package/scripts/utils/article-category.d.ts.map +1 -0
  215. package/scripts/utils/article-category.js +49 -0
  216. package/scripts/utils/article-category.js.map +1 -0
  217. package/scripts/utils/article-quality-scorer.d.ts +87 -0
  218. package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
  219. package/scripts/utils/article-quality-scorer.js +1048 -0
  220. package/scripts/utils/article-quality-scorer.js.map +1 -0
  221. package/scripts/utils/content-metadata.d.ts +34 -0
  222. package/scripts/utils/content-metadata.d.ts.map +1 -0
  223. package/scripts/utils/content-metadata.js +249 -0
  224. package/scripts/utils/content-metadata.js.map +1 -0
  225. package/scripts/utils/content-validator.d.ts +94 -0
  226. package/scripts/utils/content-validator.d.ts.map +1 -0
  227. package/scripts/utils/content-validator.js +489 -0
  228. package/scripts/utils/content-validator.js.map +1 -0
  229. package/scripts/utils/copy-test-reports.d.ts +9 -0
  230. package/scripts/utils/copy-test-reports.d.ts.map +1 -0
  231. package/scripts/utils/copy-test-reports.js +508 -0
  232. package/scripts/utils/copy-test-reports.js.map +1 -0
  233. package/scripts/utils/file-utils.d.ts +144 -0
  234. package/scripts/utils/file-utils.d.ts.map +1 -0
  235. package/scripts/utils/file-utils.js +374 -0
  236. package/scripts/utils/file-utils.js.map +1 -0
  237. package/scripts/utils/fix-articles.d.ts +27 -0
  238. package/scripts/utils/fix-articles.d.ts.map +1 -0
  239. package/scripts/utils/fix-articles.js +510 -0
  240. package/scripts/utils/fix-articles.js.map +1 -0
  241. package/scripts/utils/generate-docs-index.d.ts +8 -0
  242. package/scripts/utils/generate-docs-index.d.ts.map +1 -0
  243. package/scripts/utils/generate-docs-index.js +275 -0
  244. package/scripts/utils/generate-docs-index.js.map +1 -0
  245. package/scripts/utils/html-sanitize.d.ts +18 -0
  246. package/scripts/utils/html-sanitize.d.ts.map +1 -0
  247. package/scripts/utils/html-sanitize.js +57 -0
  248. package/scripts/utils/html-sanitize.js.map +1 -0
  249. package/scripts/utils/intelligence-analysis.d.ts +173 -0
  250. package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
  251. package/scripts/utils/intelligence-analysis.js +936 -0
  252. package/scripts/utils/intelligence-analysis.js.map +1 -0
  253. package/scripts/utils/intelligence-index.d.ts +126 -0
  254. package/scripts/utils/intelligence-index.d.ts.map +1 -0
  255. package/scripts/utils/intelligence-index.js +731 -0
  256. package/scripts/utils/intelligence-index.js.map +1 -0
  257. package/scripts/utils/metadata-utils.d.ts +14 -0
  258. package/scripts/utils/metadata-utils.d.ts.map +1 -0
  259. package/scripts/utils/metadata-utils.js +18 -0
  260. package/scripts/utils/metadata-utils.js.map +1 -0
  261. package/scripts/utils/news-metadata.d.ts +47 -0
  262. package/scripts/utils/news-metadata.d.ts.map +1 -0
  263. package/scripts/utils/news-metadata.js +259 -0
  264. package/scripts/utils/news-metadata.js.map +1 -0
  265. package/scripts/utils/validate-articles.d.ts +2 -0
  266. package/scripts/utils/validate-articles.d.ts.map +1 -0
  267. package/scripts/utils/validate-articles.js +284 -0
  268. package/scripts/utils/validate-articles.js.map +1 -0
  269. package/scripts/utils/validate-ep-api.d.ts +51 -0
  270. package/scripts/utils/validate-ep-api.d.ts.map +1 -0
  271. package/scripts/utils/validate-ep-api.js +160 -0
  272. package/scripts/utils/validate-ep-api.js.map +1 -0
  273. package/scripts/utils/world-bank-data.d.ts +84 -0
  274. package/scripts/utils/world-bank-data.d.ts.map +1 -0
  275. package/scripts/utils/world-bank-data.js +311 -0
  276. package/scripts/utils/world-bank-data.js.map +1 -0
@@ -0,0 +1,610 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * @module Generators/WeekAheadContent
5
+ * @description Pure functions for parsing MCP data and building week-ahead article HTML.
6
+ * No side effects — all functions accept data and return strings.
7
+ */
8
+ import { escapeHTML } from '../utils/file-utils.js';
9
+ import { getLocalizedString, EDITORIAL_STRINGS, WEEK_AHEAD_STRINGS, WEEK_AHEAD_STAKEHOLDER_STRINGS, } from '../constants/languages.js';
10
+ /** Keyword constant for article tagging */
11
+ const KEYWORD_EUROPEAN_PARLIAMENT = 'European Parliament';
12
+ /** Placeholder events used when MCP is unavailable or returns no sessions */
13
+ export const PLACEHOLDER_EVENTS = [
14
+ {
15
+ date: '',
16
+ title: 'Plenary Session',
17
+ type: 'Plenary',
18
+ description: 'Full parliamentary session',
19
+ },
20
+ {
21
+ date: '',
22
+ title: 'ENVI Committee Meeting',
23
+ type: 'Committee',
24
+ description: 'Environment committee discussion',
25
+ },
26
+ ];
27
+ /**
28
+ * Generic parser for settled MCP results.
29
+ * Extracts an array from the JSON payload at the given key and maps each element.
30
+ *
31
+ * @param settled - Promise.allSettled result
32
+ * @param key - JSON key containing the array of items
33
+ * @param mapper - Function to map raw items to typed objects
34
+ * @returns Array of typed objects, or empty array on failure
35
+ */
36
+ function parseSettledMCPResult(settled, key, mapper) {
37
+ if (settled.status !== 'fulfilled')
38
+ return [];
39
+ try {
40
+ const data = JSON.parse(settled.value.content?.[0]?.text ?? '{}');
41
+ if (!Object.hasOwn(data, key))
42
+ return [];
43
+ // eslint-disable-next-line security/detect-object-injection
44
+ const items = data[key];
45
+ if (!Array.isArray(items))
46
+ return [];
47
+ return items.map(mapper);
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ }
53
+ /**
54
+ * Parse plenary sessions from a settled MCP result
55
+ *
56
+ * @param settled - Promise.allSettled result
57
+ * @param fallbackDate - Fallback date when session has none
58
+ * @returns Array of parliament events
59
+ */
60
+ export function parsePlenarySessions(settled, fallbackDate) {
61
+ return parseSettledMCPResult(settled, 'sessions', (s) => ({
62
+ date: s.date ?? fallbackDate,
63
+ title: s.title ?? 'Parliamentary Session',
64
+ type: s.type ?? 'Session',
65
+ description: s.description ?? '',
66
+ }));
67
+ }
68
+ /**
69
+ * Parse EP events (hearings, conferences, seminars) from a settled MCP result
70
+ *
71
+ * @param settled - Promise.allSettled result
72
+ * @param fallbackDate - Fallback date when event has none
73
+ * @returns Array of parliament events
74
+ */
75
+ export function parseEPEvents(settled, fallbackDate) {
76
+ return parseSettledMCPResult(settled, 'events', (e) => ({
77
+ date: e.date ?? fallbackDate,
78
+ title: e.title ?? 'EP Event',
79
+ type: e.type ?? 'Event',
80
+ description: e.description ?? '',
81
+ }));
82
+ }
83
+ /**
84
+ * Parse committee meetings from a settled MCP result
85
+ *
86
+ * @param settled - Promise.allSettled result
87
+ * @param fallbackDate - Fallback date when meeting has no date
88
+ * @returns Array of committee meetings
89
+ */
90
+ export function parseCommitteeMeetings(settled, fallbackDate) {
91
+ return parseSettledMCPResult(settled, 'committees', (c) => ({
92
+ id: c.id,
93
+ committee: c.committee ?? 'Unknown',
94
+ committeeName: c.committeeName,
95
+ date: c.date ?? fallbackDate ?? '',
96
+ time: c.time,
97
+ location: c.location,
98
+ agenda: c.agenda?.map((a) => ({
99
+ item: a.item,
100
+ title: a.title ?? '',
101
+ type: a.type,
102
+ })),
103
+ }));
104
+ }
105
+ /**
106
+ * Parse legislative documents from a settled MCP result
107
+ *
108
+ * @param settled - Promise.allSettled result
109
+ * @returns Array of legislative documents
110
+ */
111
+ export function parseLegislativeDocuments(settled) {
112
+ return parseSettledMCPResult(settled, 'documents', (d) => ({
113
+ id: d.id,
114
+ type: d.type,
115
+ title: d.title ?? 'Untitled Document',
116
+ date: d.date,
117
+ status: d.status,
118
+ committee: d.committee,
119
+ rapporteur: d.rapporteur,
120
+ }));
121
+ }
122
+ /**
123
+ * Parse legislative pipeline from a settled MCP result
124
+ *
125
+ * @param settled - Promise.allSettled result
126
+ * @returns Array of legislative procedures
127
+ */
128
+ export function parseLegislativePipeline(settled) {
129
+ return parseSettledMCPResult(settled, 'procedures', (p) => ({
130
+ id: p.id,
131
+ title: p.title ?? 'Unnamed Procedure',
132
+ stage: p.stage,
133
+ committee: p.committee,
134
+ status: p.status,
135
+ bottleneck: p.bottleneck,
136
+ }));
137
+ }
138
+ /**
139
+ * Parse parliamentary questions from a settled MCP result
140
+ *
141
+ * @param settled - Promise.allSettled result
142
+ * @returns Array of parliamentary questions
143
+ */
144
+ export function parseParliamentaryQuestions(settled) {
145
+ return parseSettledMCPResult(settled, 'questions', (q) => ({
146
+ id: q.id,
147
+ type: q.type,
148
+ author: q.author,
149
+ subject: q.subject ?? 'No subject',
150
+ date: q.date,
151
+ status: q.status,
152
+ }));
153
+ }
154
+ // ─── Render helpers ──────────────────────────────────────────────────────────
155
+ /**
156
+ * Render a single plenary event as HTML
157
+ *
158
+ * @param event - Parliament event data
159
+ * @returns HTML string
160
+ */
161
+ function renderPlenaryEvent(event) {
162
+ return `
163
+ <div class="event-item">
164
+ <div class="event-date">${escapeHTML(event.date)}</div>
165
+ <div class="event-details">
166
+ <h3>${escapeHTML(event.title)}</h3>
167
+ <p class="event-type">${escapeHTML(event.type)}</p>
168
+ ${event.description ? `<p>${escapeHTML(event.description)}</p>` : ''}
169
+ </div>
170
+ </div>`;
171
+ }
172
+ /**
173
+ * Render a single committee meeting as HTML
174
+ *
175
+ * @param meeting - Committee meeting data
176
+ * @returns HTML string
177
+ */
178
+ function renderCommitteeMeeting(meeting) {
179
+ const agendaHtml = meeting.agenda && meeting.agenda.length > 0
180
+ ? `<ul class="agenda-list">${meeting.agenda.map((item) => `<li>${escapeHTML(item.title)}${item.type ? ` <span class="agenda-type">(${escapeHTML(item.type)})</span>` : ''}</li>`).join('')}</ul>`
181
+ : '';
182
+ return `
183
+ <div class="committee-item">
184
+ <div class="committee-date">${escapeHTML(meeting.date)}${meeting.time ? ` ${escapeHTML(meeting.time)}` : ''}</div>
185
+ <div class="committee-details">
186
+ <h3>${escapeHTML(meeting.committeeName ?? meeting.committee)}</h3>
187
+ ${meeting.location ? `<p class="committee-location">${escapeHTML(meeting.location)}</p>` : ''}
188
+ ${agendaHtml}
189
+ </div>
190
+ </div>`;
191
+ }
192
+ /**
193
+ * Render a single legislative document as HTML
194
+ *
195
+ * @param doc - Legislative document
196
+ * @returns HTML string
197
+ */
198
+ function renderLegislativeDocument(doc) {
199
+ return `
200
+ <li class="document-item">
201
+ <span class="document-title">${escapeHTML(doc.title)}</span>
202
+ ${doc.type ? ` <span class="document-type">(${escapeHTML(doc.type)})</span>` : ''}
203
+ ${doc.committee ? ` — <span class="document-committee">${escapeHTML(doc.committee)}</span>` : ''}
204
+ ${doc.status ? ` <span class="document-status">[${escapeHTML(doc.status)}]</span>` : ''}
205
+ </li>`;
206
+ }
207
+ /**
208
+ * Render a single pipeline procedure as HTML
209
+ *
210
+ * @param proc - Legislative procedure
211
+ * @returns HTML string
212
+ */
213
+ function renderPipelineProcedure(proc) {
214
+ return `
215
+ <li class="pipeline-item${proc.bottleneck ? ' bottleneck' : ''}">
216
+ <span class="procedure-title">${escapeHTML(proc.title)}</span>
217
+ ${proc.stage ? ` <span class="procedure-stage">${escapeHTML(proc.stage)}</span>` : ''}
218
+ ${proc.committee ? ` — <span class="procedure-committee">${escapeHTML(proc.committee)}</span>` : ''}
219
+ ${proc.bottleneck ? ' <span class="bottleneck-indicator">⚠ Bottleneck</span>' : ''}
220
+ </li>`;
221
+ }
222
+ /**
223
+ * Render a single parliamentary question as HTML
224
+ *
225
+ * @param q - Parliamentary question
226
+ * @returns HTML string
227
+ */
228
+ function renderQuestion(q) {
229
+ return `
230
+ <li class="qa-item">
231
+ <span class="qa-subject">${escapeHTML(q.subject)}</span>
232
+ ${q.type ? ` <span class="qa-type">(${escapeHTML(q.type)})</span>` : ''}
233
+ ${q.author ? ` — <span class="qa-author">${escapeHTML(q.author)}</span>` : ''}
234
+ </li>`;
235
+ }
236
+ // ─── Content builders ────────────────────────────────────────────────────────
237
+ /**
238
+ * Clamp a number to the 0–100 range.
239
+ *
240
+ * @param n - Number to clamp
241
+ * @returns Clamped value between 0 and 100
242
+ */
243
+ function clamp0to100(n) {
244
+ return Math.max(0, Math.min(100, n));
245
+ }
246
+ /**
247
+ * Map from band key to CSS class suffix used in `temp-*` class names.
248
+ */
249
+ const BAND_CSS_CLASS = {
250
+ low: 'temp-low',
251
+ moderate: 'temp-moderate',
252
+ high: 'temp-high',
253
+ veryHigh: 'temp-very-high',
254
+ };
255
+ /**
256
+ * Derive a language-agnostic temperature band from a 0–100 score.
257
+ *
258
+ * This is the single source of truth for score → band mapping.
259
+ * `computeWeekPoliticalTemperature()` uses this to derive the
260
+ * `temperature.band` value that the renderer later consumes, avoiding
261
+ * duplicated threshold logic.
262
+ *
263
+ * @param score - Clamped score (0–100)
264
+ * @returns Band key
265
+ */
266
+ function temperatureBand(score) {
267
+ if (score >= 75)
268
+ return 'veryHigh';
269
+ if (score >= 50)
270
+ return 'high';
271
+ if (score >= 25)
272
+ return 'moderate';
273
+ return 'low';
274
+ }
275
+ /**
276
+ * Resolve the localized temperature descriptor for a given band.
277
+ *
278
+ * @param band - Language-agnostic band key
279
+ * @param strings - Localized stakeholder strings
280
+ * @returns Localized descriptor (e.g. "Modéré", "高い")
281
+ */
282
+ function localizedTempLabel(band, strings) {
283
+ const map = {
284
+ low: strings.tempLow,
285
+ moderate: strings.tempModerate,
286
+ high: strings.tempHigh,
287
+ veryHigh: strings.tempVeryHigh,
288
+ };
289
+ return map[band];
290
+ }
291
+ /**
292
+ * Compute a composite political temperature score (0–100) indicating how
293
+ * contentious or urgent the upcoming parliamentary week is likely to be.
294
+ *
295
+ * The score is derived from the volume and diversity of scheduled events
296
+ * and questions — a pure scoring function with no side effects.
297
+ *
298
+ * @param events - Plenary / parliamentary events for the week
299
+ * @param questions - Parliamentary questions tabled for the week
300
+ * @returns Political temperature score and band
301
+ */
302
+ export function computeWeekPoliticalTemperature(events, questions) {
303
+ // Base: volume-driven heuristic — more events & questions ⇒ higher temperature
304
+ const eventContribution = Math.min(events.length * 10, 50);
305
+ const questionContribution = Math.min(questions.length * 5, 30);
306
+ // Diversity bonus: distinct event types signal a broader agenda
307
+ const uniqueTypes = new Set(events.map((e) => e.type));
308
+ const diversityBonus = Math.min(uniqueTypes.size * 5, 20);
309
+ const raw = eventContribution + questionContribution + diversityBonus;
310
+ const score = clamp0to100(Math.round(raw));
311
+ return { score, band: temperatureBand(score) };
312
+ }
313
+ /**
314
+ * Determine impact level based on a count and a threshold for "high".
315
+ *
316
+ * @param count - Item count
317
+ * @param highThreshold - Minimum count for high impact
318
+ * @returns Impact level
319
+ */
320
+ function impactFromCount(count, highThreshold) {
321
+ if (count >= highThreshold)
322
+ return 'high';
323
+ return count > 0 ? 'medium' : 'low';
324
+ }
325
+ /**
326
+ * Build a stakeholder impact matrix from scheduled events and legislative
327
+ * documents, assessing which groups are most affected by the agenda.
328
+ *
329
+ * Returns an empty section when no events or documents are available
330
+ * (graceful fallback). This function only constructs raw data; HTML
331
+ * escaping (for example via `escapeHTML()`) must be applied at render
332
+ * time by the caller (e.g. in `renderStakeholderSection()`).
333
+ *
334
+ * @param events - Parliament events for the upcoming week
335
+ * @param docs - Legislative documents expected in the period
336
+ * @param lang - Language code for localized labels (defaults to 'en')
337
+ * @returns Stakeholder impact section with rows
338
+ */
339
+ export function buildStakeholderImpactMatrix(events, docs, lang = 'en') {
340
+ if (events.length === 0 && docs.length === 0) {
341
+ return { rows: [] };
342
+ }
343
+ const strings = getLocalizedString(WEEK_AHEAD_STAKEHOLDER_STRINGS, lang);
344
+ const rows = [];
345
+ const eventCount = events.length;
346
+ const docCount = docs.length;
347
+ const totalCount = eventCount + docCount;
348
+ if (eventCount > 0) {
349
+ rows.push({
350
+ stakeholder: strings.stakeholderPoliticalGroups,
351
+ impact: impactFromCount(eventCount, 3),
352
+ reason: strings.reasonEventsScheduled.replace('{count}', String(eventCount)),
353
+ });
354
+ }
355
+ if (docCount > 0) {
356
+ rows.push({
357
+ stakeholder: strings.stakeholderCivilSociety,
358
+ impact: impactFromCount(docCount, 3),
359
+ reason: strings.reasonDocumentsUnderReview.replace('{count}', String(docCount)),
360
+ });
361
+ }
362
+ rows.push({
363
+ stakeholder: strings.stakeholderIndustry,
364
+ impact: impactFromCount(totalCount, 5),
365
+ reason: strings.reasonIndustryRegulatoryAgenda,
366
+ });
367
+ rows.push({
368
+ stakeholder: strings.stakeholderEuCitizens,
369
+ impact: impactFromCount(eventCount, 3),
370
+ reason: strings.reasonCitizensDecisionsShapePolicy,
371
+ });
372
+ if (docCount > 0) {
373
+ rows.push({
374
+ stakeholder: strings.stakeholderNationalGovernments,
375
+ impact: impactFromCount(docCount, 3),
376
+ reason: strings.reasonDocumentsRequireTransposition.replace('{count}', String(docCount)),
377
+ });
378
+ }
379
+ rows.push({
380
+ stakeholder: strings.stakeholderEuInstitutions,
381
+ impact: impactFromCount(totalCount, 4),
382
+ reason: strings.reasonInstitutionsCoordination,
383
+ });
384
+ return { rows };
385
+ }
386
+ /**
387
+ * Render the stakeholder impact section as HTML.
388
+ *
389
+ * @param section - Stakeholder impact data
390
+ * @param temperature - Political temperature score
391
+ * @param lang - Language code for localized headings
392
+ * @returns HTML string, or empty string when section is empty
393
+ */
394
+ function renderStakeholderSection(section, temperature, lang) {
395
+ if (section.rows.length === 0)
396
+ return '';
397
+ const strings = getLocalizedString(WEEK_AHEAD_STAKEHOLDER_STRINGS, lang);
398
+ const tempClass = BAND_CSS_CLASS[temperature.band];
399
+ const tempDescriptor = localizedTempLabel(temperature.band, strings);
400
+ const tableRows = section.rows
401
+ .map((row) => `<tr>` +
402
+ `<td>${escapeHTML(row.stakeholder)}</td>` +
403
+ `<td class="impact-${escapeHTML(row.impact)}">${escapeHTML(row.impact)}</td>` +
404
+ `<td>${escapeHTML(row.reason)}</td>` +
405
+ `</tr>`)
406
+ .join('');
407
+ return `
408
+ <section class="stakeholder-impact" lang="${escapeHTML(lang)}">
409
+ <h2>${escapeHTML(strings.heading)}</h2>
410
+ <div class="political-temperature ${tempClass}">
411
+ <span class="temp-label">${escapeHTML(strings.temperatureLabel)}:</span>
412
+ <span class="temp-score">${temperature.score}/100</span>
413
+ <span class="temp-descriptor">(${escapeHTML(tempDescriptor)})</span>
414
+ </div>
415
+ <table class="stakeholder-matrix">
416
+ <thead>
417
+ <tr>
418
+ <th scope="col">${escapeHTML(strings.stakeholderHeader)}</th>
419
+ <th scope="col">${escapeHTML(strings.impactHeader)}</th>
420
+ <th scope="col">${escapeHTML(strings.reasonHeader)}</th>
421
+ </tr>
422
+ </thead>
423
+ <tbody>
424
+ ${tableRows}
425
+ </tbody>
426
+ </table>
427
+ </section>`;
428
+ }
429
+ /**
430
+ * Build the supplementary lede sentence about committee and pipeline counts.
431
+ *
432
+ * @param committeeCount - Number of committee meetings
433
+ * @param pipelineCount - Number of pipeline procedures
434
+ * @returns Sentence fragment or empty string
435
+ */
436
+ function buildLedeDetail(committeeCount, pipelineCount) {
437
+ if (committeeCount === 0 && pipelineCount === 0)
438
+ return '';
439
+ const committeePart = committeeCount > 0
440
+ ? `${committeeCount} committee meeting${committeeCount !== 1 ? 's are' : ' is'} scheduled`
441
+ : '';
442
+ const pipelinePart = pipelineCount > 0
443
+ ? `${pipelineCount} legislative procedure${pipelineCount !== 1 ? 's are' : ' is'} advancing through the pipeline`
444
+ : '';
445
+ const conjunction = committeePart && pipelinePart ? ' and ' : '';
446
+ return ` Notably, ${committeePart}${conjunction}${pipelinePart}.`;
447
+ }
448
+ /**
449
+ * Build article content HTML from week-ahead data
450
+ *
451
+ * @param weekData - Aggregated week-ahead data
452
+ * @param dateRange - Date range for the article
453
+ * @param lang - Language code for editorial strings (default: 'en')
454
+ * @returns HTML content string
455
+ */
456
+ export function buildWeekAheadContent(weekData, dateRange, lang = 'en') {
457
+ const editorial = getLocalizedString(EDITORIAL_STRINGS, lang);
458
+ const strings = getLocalizedString(WEEK_AHEAD_STRINGS, lang);
459
+ const plenaryHtml = weekData.events.length > 0
460
+ ? weekData.events.map(renderPlenaryEvent).join('')
461
+ : `<p>${escapeHTML(strings.noPlenary)}</p>`;
462
+ const committeeSection = weekData.committees.length > 0
463
+ ? `<section class="committee-calendar">
464
+ <h2>${escapeHTML(strings.committeeMeetings)}</h2>
465
+ ${weekData.committees.map(renderCommitteeMeeting).join('')}
466
+ </section>`
467
+ : '';
468
+ const documentsSection = weekData.documents.length > 0
469
+ ? `<section class="legislative-documents">
470
+ <h2>${escapeHTML(strings.legislativeDocuments)}</h2>
471
+ <ul class="document-list">${weekData.documents.map(renderLegislativeDocument).join('')}</ul>
472
+ </section>`
473
+ : '';
474
+ const pipelineSection = weekData.pipeline.length > 0
475
+ ? `<section class="legislative-pipeline">
476
+ <h2>${escapeHTML(strings.legislativePipeline)}</h2>
477
+ <ul class="pipeline-list">${weekData.pipeline.map(renderPipelineProcedure).join('')}</ul>
478
+ </section>`
479
+ : '';
480
+ const qaSection = weekData.questions.length > 0
481
+ ? `<section class="qa-schedule">
482
+ <h2>${escapeHTML(strings.parliamentaryQuestions)}</h2>
483
+ <ul class="qa-list">${weekData.questions.map(renderQuestion).join('')}</ul>
484
+ </section>`
485
+ : '';
486
+ const ledeDetail = buildLedeDetail(weekData.committees.length, weekData.pipeline.length);
487
+ const whyThisMattersSection = `
488
+ <section class="why-this-matters">
489
+ <h2>${escapeHTML(editorial.whyThisMatters)}</h2>
490
+ <p>${escapeHTML(editorial.parliamentaryContext)}: ${escapeHTML(editorial.sourceAttribution)} — parliamentary schedules determine the legislative agenda affecting EU citizens directly.</p>
491
+ </section>`;
492
+ // Stakeholder impact analysis
493
+ const stakeholderData = buildStakeholderImpactMatrix(weekData.events, weekData.documents, lang);
494
+ const temperature = computeWeekPoliticalTemperature(weekData.events, weekData.questions);
495
+ const stakeholderSection = renderStakeholderSection(stakeholderData, temperature, lang);
496
+ return `
497
+ <div class="article-content">
498
+ <section class="lede">
499
+ <p>${escapeHTML(strings.lede)} from ${escapeHTML(dateRange.start)} to ${escapeHTML(dateRange.end)}.${escapeHTML(ledeDetail)}</p>
500
+ </section>
501
+ ${whyThisMattersSection}
502
+ <section class="plenary-schedule">
503
+ <h2>${escapeHTML(strings.plenarySessions)}</h2>
504
+ ${plenaryHtml}
505
+ </section>
506
+ ${committeeSection}
507
+ ${documentsSection}
508
+ ${pipelineSection}
509
+ ${qaSection}
510
+ ${stakeholderSection}
511
+ <!-- /article-content -->
512
+ </div>
513
+ `;
514
+ }
515
+ /**
516
+ * Build article keywords from week-ahead data
517
+ *
518
+ * @param weekData - Aggregated week-ahead data
519
+ * @returns Array of keyword strings
520
+ */
521
+ export function buildKeywords(weekData) {
522
+ const keywords = [KEYWORD_EUROPEAN_PARLIAMENT, 'week ahead', 'plenary', 'committees'];
523
+ for (const c of weekData.committees) {
524
+ if (c.committee && !keywords.includes(c.committee)) {
525
+ keywords.push(c.committee);
526
+ }
527
+ }
528
+ if (weekData.pipeline.length > 0)
529
+ keywords.push('legislative pipeline');
530
+ if (weekData.questions.length > 0)
531
+ keywords.push('parliamentary questions');
532
+ return keywords;
533
+ }
534
+ // ─── What-to-Watch section ─────────────────────────────────────────────────
535
+ /** CSS class for bottleneck-risk watch items */
536
+ const CSS_WATCH_HIGH = 'watch-high';
537
+ /** CSS class for bottlenecked procedure watch items */
538
+ const CSS_WATCH_PROCEDURE = 'watch-procedure';
539
+ /** CSS class for standard velocity watch items */
540
+ const CSS_WATCH_ITEM = 'watch-item';
541
+ /** Maximum number of non-bottleneck velocity items to include */
542
+ const WATCH_MAX_NORMAL_ITEMS = 3;
543
+ /**
544
+ * Build list items for high-risk velocities
545
+ *
546
+ * @param velocities - All legislative velocities
547
+ * @returns HTML list items for high bottleneck risk items
548
+ */
549
+ function buildHighRiskItems(velocities) {
550
+ return velocities
551
+ .filter((v) => v.bottleneckRisk === 'high')
552
+ .map((v) => `<li class="${CSS_WATCH_HIGH}">${escapeHTML(v.title)} — ` +
553
+ `Stage: ${escapeHTML(v.stage)} (bottleneck risk detected)</li>`)
554
+ .join('');
555
+ }
556
+ /**
557
+ * Build list items for procedures flagged as bottlenecks
558
+ *
559
+ * @param procedures - All legislative procedures
560
+ * @returns HTML list items for bottlenecked procedures
561
+ */
562
+ function buildBottleneckProcedureItems(procedures) {
563
+ return procedures
564
+ .filter((p) => p.bottleneck === true)
565
+ .map((p) => `<li class="${CSS_WATCH_PROCEDURE}">${escapeHTML(p.title)} — ` +
566
+ `${escapeHTML(p.stage ?? 'in progress')} stage</li>`)
567
+ .join('');
568
+ }
569
+ /**
570
+ * Build list items for normal-risk velocities
571
+ *
572
+ * @param velocities - All legislative velocities
573
+ * @returns HTML list items for the top normal-risk velocity items
574
+ */
575
+ function buildNormalVelocityItems(velocities) {
576
+ return velocities
577
+ .filter((v) => v.bottleneckRisk !== 'high')
578
+ .slice(0, WATCH_MAX_NORMAL_ITEMS)
579
+ .map((v) => `<li class="${CSS_WATCH_ITEM}">${escapeHTML(v.title)} — ` +
580
+ `predicted completion: ${escapeHTML(v.predictedCompletion)}</li>`)
581
+ .join('');
582
+ }
583
+ /**
584
+ * Build predictive "What to Watch" analysis section showing legislative
585
+ * procedures and velocity data ordered by bottleneck risk.
586
+ * Returns an empty string when both input arrays are empty or yield no items.
587
+ *
588
+ * @param procedures - Legislative procedures to analyse
589
+ * @param velocities - Legislative velocity data (for example from a separate velocity analysis feed)
590
+ * @param language - BCP 47 language code used as the section lang attribute
591
+ * @returns HTML string for the "What to Watch" section
592
+ */
593
+ export function buildWhatToWatchSection(procedures, velocities, language) {
594
+ if (procedures.length === 0 && velocities.length === 0)
595
+ return '';
596
+ const allItems = buildHighRiskItems(velocities) +
597
+ buildBottleneckProcedureItems(procedures) +
598
+ buildNormalVelocityItems(velocities);
599
+ if (!allItems)
600
+ return '';
601
+ const strings = getLocalizedString(WEEK_AHEAD_STRINGS, language);
602
+ return `
603
+ <section class="what-to-watch" lang="${escapeHTML(language)}">
604
+ <h2>${escapeHTML(strings.whatToWatch)}</h2>
605
+ <ul>
606
+ ${allItems}
607
+ </ul>
608
+ </section>`;
609
+ }
610
+ //# sourceMappingURL=week-ahead-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"week-ahead-content.js","sourceRoot":"","sources":["../../src/generators/week-ahead-content.ts"],"names":[],"mappings":"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"}