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,154 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /** Featured committees to include in committee reports */
4
+ export const FEATURED_COMMITTEES = ['ENVI', 'ECON', 'AFET', 'LIBE', 'AGRI'];
5
+ /** Sentinel value used when no real chair data is available from MCP */
6
+ export const PLACEHOLDER_CHAIR = 'N/A';
7
+ /** Sentinel value used when no real member count data is available from MCP */
8
+ export const PLACEHOLDER_MEMBERS = 0;
9
+ /**
10
+ * Resolve a raw memberCount/members field to a numeric count.
11
+ * Handles arrays (EP API returns members as array), numbers, and numeric strings.
12
+ *
13
+ * @param memberCountRaw - Raw value from MCP response
14
+ * @returns Numeric member count, or 0 if not resolvable
15
+ */
16
+ function resolveMemberCount(memberCountRaw) {
17
+ if (Array.isArray(memberCountRaw)) {
18
+ return memberCountRaw.length;
19
+ }
20
+ if (typeof memberCountRaw === 'number' && Number.isFinite(memberCountRaw)) {
21
+ return memberCountRaw;
22
+ }
23
+ if (typeof memberCountRaw === 'string') {
24
+ const parsedNumber = Number(memberCountRaw);
25
+ if (Number.isFinite(parsedNumber)) {
26
+ return parsedNumber;
27
+ }
28
+ }
29
+ return 0;
30
+ }
31
+ /**
32
+ * Extract the committee info record from a parsed MCP response.
33
+ * Supports both the wrapped `{ committee: {...} }` format and the flat
34
+ * EP Open Data Portal format `{ name, chair, ... }`.
35
+ *
36
+ * @param parsed - Parsed JSON object from MCP response
37
+ * @returns The info record, or null when the payload is unrecognised
38
+ */
39
+ function extractCommitteeInfoRecord(parsed) {
40
+ const hasWrapped = typeof parsed.committee === 'object' && parsed.committee !== null;
41
+ const info = (hasWrapped ? parsed.committee : parsed);
42
+ if (!info || typeof info !== 'object')
43
+ return null;
44
+ // For flat format, require at least a name/abbreviation to confirm real data
45
+ if (!hasWrapped && !info.name && !info.abbreviation)
46
+ return null;
47
+ return info;
48
+ }
49
+ /**
50
+ * Apply committee info from MCP result to the data object
51
+ *
52
+ * @param result - MCP tool result
53
+ * @param data - Committee data to populate
54
+ * @param abbreviation - Fallback abbreviation
55
+ */
56
+ export function applyCommitteeInfo(result, data, abbreviation) {
57
+ try {
58
+ if (!result?.content?.[0])
59
+ return;
60
+ const parsed = JSON.parse(result.content[0].text);
61
+ const info = extractCommitteeInfoRecord(parsed);
62
+ if (!info)
63
+ return;
64
+ data.name = info.name ?? data.name;
65
+ data.abbreviation =
66
+ typeof info.abbreviation === 'string' && !info.abbreviation.startsWith('org/')
67
+ ? info.abbreviation
68
+ : abbreviation;
69
+ data.chair = info.chair && info.chair.length > 0 ? info.chair : PLACEHOLDER_CHAIR;
70
+ data.members = resolveMemberCount(info.memberCount ?? info.members);
71
+ console.log(` ✅ Committee info: ${data.name} (${data.members} members)`);
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ console.warn(' ⚠️ Failed to parse committee info:', message);
76
+ }
77
+ }
78
+ /**
79
+ * Apply documents from MCP result to the data object
80
+ *
81
+ * @param result - MCP tool result
82
+ * @param data - Committee data to populate
83
+ */
84
+ export function applyDocuments(result, data) {
85
+ try {
86
+ if (!result?.content?.[0])
87
+ return;
88
+ const parsed = JSON.parse(result.content[0].text);
89
+ // Support both { documents: [...] } and { data: [...] } response formats
90
+ const docs = parsed.documents ?? parsed.data;
91
+ if (!docs || docs.length === 0)
92
+ return;
93
+ data.documents = docs.map((d) => ({
94
+ title: d.title ?? 'Untitled Document',
95
+ type: d.type ?? d.documentType ?? 'Document',
96
+ date: d.date ?? '',
97
+ }));
98
+ console.log(` ✅ Fetched ${data.documents.length} documents from MCP`);
99
+ }
100
+ catch (err) {
101
+ const message = err instanceof Error ? err.message : String(err);
102
+ console.warn(' ⚠️ Failed to parse documents:', message);
103
+ }
104
+ }
105
+ /**
106
+ * Detect whether a list of committee data entries are all fallback/default placeholders.
107
+ *
108
+ * A committee entry is considered a placeholder when the MCP fetch produced no real
109
+ * data — i.e. `chair` is still the sentinel `'N/A'`, `members` is 0, and the
110
+ * `documents` list is empty. This typically happens when the MCP server is
111
+ * unavailable and `fetchCommitteeData` returns the `defaultResult` unchanged.
112
+ *
113
+ * Returns `true` only when:
114
+ * - the list is non-empty **and**
115
+ * - every committee entry matches all three placeholder criteria.
116
+ *
117
+ * An empty list returns `false` so that a genuine zero-committee scenario is still
118
+ * rendered (the caller can decide how to handle it).
119
+ *
120
+ * @param committees - Committee data entries to inspect
121
+ * @returns `true` when all entries are default/placeholder data; `false` otherwise
122
+ */
123
+ export function isPlaceholderCommitteeData(committees) {
124
+ return (committees.length > 0 &&
125
+ committees.every((c) => c.chair === PLACEHOLDER_CHAIR &&
126
+ c.members === PLACEHOLDER_MEMBERS &&
127
+ c.documents.length === 0));
128
+ }
129
+ /**
130
+ * Apply effectiveness metrics from MCP result to the data object
131
+ *
132
+ * @param result - MCP tool result
133
+ * @param data - Committee data to populate
134
+ */
135
+ export function applyEffectiveness(result, data) {
136
+ try {
137
+ if (!result?.content?.[0])
138
+ return;
139
+ const parsed = JSON.parse(result.content[0].text);
140
+ if (!parsed.effectiveness)
141
+ return;
142
+ const score = parsed.effectiveness.overallScore;
143
+ const rank = parsed.effectiveness.rank ?? '';
144
+ data.effectiveness =
145
+ typeof score === 'number' && Number.isFinite(score)
146
+ ? `Score: ${score.toFixed(1)} ${rank}`.trim()
147
+ : null;
148
+ }
149
+ catch (err) {
150
+ const message = err instanceof Error ? err.message : String(err);
151
+ console.warn(' ⚠️ Failed to parse effectiveness:', message);
152
+ }
153
+ }
154
+ //# sourceMappingURL=committee-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"committee-helpers.js","sourceRoot":"","sources":["../../src/generators/committee-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { DashboardConfig, DashboardPanel, CoalitionMetrics, LegislativePipeline, TrendAnalytics, StakeholderMetric, EconomicContext } from '../types/index.js';
2
+ /**
3
+ * Build a coalition dynamics panel as a self-contained HTML section.
4
+ * Renders a radar chart configuration (Chart.js) embedded as a data attribute,
5
+ * with a `<noscript>` fallback table listing each bloc's alignment score.
6
+ *
7
+ * Returns an empty string when `coalition` is null/undefined or has no voting
8
+ * blocs.
9
+ *
10
+ * @param coalition - Coalition metrics data
11
+ * @param panelIndex - Index used for unique canvas IDs
12
+ * @param lang - BCP 47 language code for localized labels
13
+ * @returns HTML string for the coalition panel or empty string
14
+ */
15
+ export declare function buildCoalitionPanel(coalition: CoalitionMetrics | null | undefined, panelIndex: number, lang?: string): string;
16
+ /**
17
+ * Build a legislative pipeline status panel as a self-contained HTML section.
18
+ * Renders a horizontal bar chart (Chart.js) for on-track / delayed / blocked /
19
+ * fast-tracked counts with color-coded status classes and a `<noscript>`
20
+ * fallback list.
21
+ *
22
+ * Returns an empty string when `pipeline` is null/undefined or has zero total
23
+ * procedures.
24
+ *
25
+ * @param pipeline - Legislative pipeline data
26
+ * @param panelIndex - Index used for unique canvas IDs
27
+ * @param lang - BCP 47 language code for localized labels
28
+ * @returns HTML string for the pipeline panel or empty string
29
+ */
30
+ export declare function buildPipelinePanel(pipeline: LegislativePipeline | null | undefined, panelIndex: number, lang?: string): string;
31
+ /**
32
+ * Build a trend analytics panel as a self-contained HTML section.
33
+ * Renders a line (sparkline) chart (Chart.js) for activity levels over time
34
+ * with week-over-week / month-over-month change indicators and a `<noscript>`
35
+ * comparison table.
36
+ *
37
+ * Returns an empty string when `trend` is null/undefined or has no metric
38
+ * data points.
39
+ *
40
+ * @param trend - Trend analytics data
41
+ * @param panelIndex - Index used for unique canvas IDs
42
+ * @param lang - BCP 47 language code for localized labels
43
+ * @returns HTML string for the trend panel or empty string
44
+ */
45
+ export declare function buildTrendPanel(trend: TrendAnalytics | null | undefined, panelIndex: number, lang?: string): string;
46
+ /**
47
+ * Build a stakeholder impact scorecard panel as a self-contained HTML section.
48
+ * Renders a color-coded grid where each cell shows a stakeholder's impact score
49
+ * and direction, with a `<noscript>` fallback table.
50
+ *
51
+ * Returns an empty string when `stakeholders` is null/undefined or empty.
52
+ *
53
+ * @param stakeholders - Stakeholder metric data
54
+ * @param panelIndex - Index used for unique IDs
55
+ * @param lang - BCP 47 language code for localized labels
56
+ * @returns HTML string for the scorecard panel or empty string
57
+ */
58
+ export declare function buildStakeholderScorecardPanel(stakeholders: readonly StakeholderMetric[] | null | undefined, panelIndex: number, lang?: string): string;
59
+ /**
60
+ * Build a complete dashboard section HTML.
61
+ *
62
+ * Generates an accessible dashboard with metric cards and chart containers.
63
+ * Charts are embedded as Canvas elements with `data-chart-config` JSON
64
+ * attributes for client-side Chart.js hydration. A `<noscript>` fallback
65
+ * provides accessible data tables when JavaScript is disabled.
66
+ *
67
+ * Returns an empty string if the config is null/undefined or contains
68
+ * no panels with content.
69
+ *
70
+ * @param config - Dashboard configuration (null/undefined returns empty string)
71
+ * @param lang - BCP 47 language code for localized UI text (defaults to "en")
72
+ * @param heading - Optional custom section heading override
73
+ * @returns HTML section string or empty string
74
+ */
75
+ export declare function buildDashboardSection(config: DashboardConfig | null | undefined, lang?: string, heading?: string): string;
76
+ /**
77
+ * Check whether a dashboard configuration contains any chart containers.
78
+ * Useful for conditionally including Chart.js client-side scripts.
79
+ *
80
+ * @param config - Dashboard configuration
81
+ * @returns True if at least one panel has a chart
82
+ */
83
+ export declare function dashboardHasCharts(config: DashboardConfig | null | undefined): boolean;
84
+ /**
85
+ * Build a dashboard panel from World Bank economic context data.
86
+ *
87
+ * Generates a bar chart showing key economic indicators for a country
88
+ * alongside metric cards for each indicator, enriching articles with
89
+ * macroeconomic context relevant to EU Parliament policy analysis.
90
+ *
91
+ * @param context - Economic context data from World Bank MCP
92
+ * @returns Dashboard panel configuration or null if data is insufficient
93
+ */
94
+ export declare function buildEconomicContextPanel(context: EconomicContext | null | undefined): DashboardPanel | null;
95
+ //# sourceMappingURL=dashboard-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-content.d.ts","sourceRoot":"","sources":["../../src/generators/dashboard-content.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAId,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAmN3B;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC9C,UAAU,EAAE,MAAM,EAClB,IAAI,SAAO,GACV,MAAM,CAqER;AAcD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAChD,UAAU,EAAE,MAAM,EAClB,IAAI,SAAO,GACV,MAAM,CAgER;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACxC,UAAU,EAAE,MAAM,EAClB,IAAI,SAAO,GACV,MAAM,CAgFR;AAmBD;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI,GAAG,SAAS,EAC7D,UAAU,EAAE,MAAM,EAClB,IAAI,SAAO,GACV,MAAM,CAmDR;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC1C,IAAI,GAAE,MAAa,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAqBR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAC1C,cAAc,GAAG,IAAI,CA8CvB"}