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.
- package/LICENSE +201 -0
- package/README.md +1005 -0
- package/SECURITY.md +151 -0
- package/package.json +131 -0
- package/scripts/constants/committee-indicator-map.d.ts +199 -0
- package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
- package/scripts/constants/committee-indicator-map.js +1224 -0
- package/scripts/constants/committee-indicator-map.js.map +1 -0
- package/scripts/constants/config.d.ts +38 -0
- package/scripts/constants/config.d.ts.map +1 -0
- package/scripts/constants/config.js +66 -0
- package/scripts/constants/config.js.map +1 -0
- package/scripts/constants/language-articles.d.ts +84 -0
- package/scripts/constants/language-articles.d.ts.map +1 -0
- package/scripts/constants/language-articles.js +6771 -0
- package/scripts/constants/language-articles.js.map +1 -0
- package/scripts/constants/language-core.d.ts +38 -0
- package/scripts/constants/language-core.d.ts.map +1 -0
- package/scripts/constants/language-core.js +90 -0
- package/scripts/constants/language-core.js.map +1 -0
- package/scripts/constants/language-ui.d.ts +82 -0
- package/scripts/constants/language-ui.d.ts.map +1 -0
- package/scripts/constants/language-ui.js +889 -0
- package/scripts/constants/language-ui.js.map +1 -0
- package/scripts/constants/languages.d.ts +14 -0
- package/scripts/constants/languages.d.ts.map +1 -0
- package/scripts/constants/languages.js +15 -0
- package/scripts/constants/languages.js.map +1 -0
- package/scripts/generators/analysis-builders.d.ts +266 -0
- package/scripts/generators/analysis-builders.d.ts.map +1 -0
- package/scripts/generators/analysis-builders.js +2903 -0
- package/scripts/generators/analysis-builders.js.map +1 -0
- package/scripts/generators/breaking-content.d.ts +45 -0
- package/scripts/generators/breaking-content.d.ts.map +1 -0
- package/scripts/generators/breaking-content.js +530 -0
- package/scripts/generators/breaking-content.js.map +1 -0
- package/scripts/generators/committee-helpers.d.ts +54 -0
- package/scripts/generators/committee-helpers.d.ts.map +1 -0
- package/scripts/generators/committee-helpers.js +154 -0
- package/scripts/generators/committee-helpers.js.map +1 -0
- package/scripts/generators/dashboard-content.d.ts +95 -0
- package/scripts/generators/dashboard-content.d.ts.map +1 -0
- package/scripts/generators/dashboard-content.js +630 -0
- package/scripts/generators/dashboard-content.js.map +1 -0
- package/scripts/generators/deep-analysis-content.d.ts +23 -0
- package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
- package/scripts/generators/deep-analysis-content.js +831 -0
- package/scripts/generators/deep-analysis-content.js.map +1 -0
- package/scripts/generators/mindmap-content.d.ts +55 -0
- package/scripts/generators/mindmap-content.d.ts.map +1 -0
- package/scripts/generators/mindmap-content.js +512 -0
- package/scripts/generators/mindmap-content.js.map +1 -0
- package/scripts/generators/motions-content.d.ts +50 -0
- package/scripts/generators/motions-content.d.ts.map +1 -0
- package/scripts/generators/motions-content.js +391 -0
- package/scripts/generators/motions-content.js.map +1 -0
- package/scripts/generators/news-enhanced.d.ts +14 -0
- package/scripts/generators/news-enhanced.d.ts.map +1 -0
- package/scripts/generators/news-enhanced.js +169 -0
- package/scripts/generators/news-enhanced.js.map +1 -0
- package/scripts/generators/news-indexes.d.ts +31 -0
- package/scripts/generators/news-indexes.d.ts.map +1 -0
- package/scripts/generators/news-indexes.js +410 -0
- package/scripts/generators/news-indexes.js.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.js +1522 -0
- package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
- package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
- package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/generate-stage.js +204 -0
- package/scripts/generators/pipeline/generate-stage.js.map +1 -0
- package/scripts/generators/pipeline/output-stage.d.ts +48 -0
- package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/output-stage.js +145 -0
- package/scripts/generators/pipeline/output-stage.js.map +1 -0
- package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
- package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/transform-stage.js +111 -0
- package/scripts/generators/pipeline/transform-stage.js.map +1 -0
- package/scripts/generators/propositions-content.d.ts +29 -0
- package/scripts/generators/propositions-content.d.ts.map +1 -0
- package/scripts/generators/propositions-content.js +90 -0
- package/scripts/generators/propositions-content.js.map +1 -0
- package/scripts/generators/sankey-content.d.ts +45 -0
- package/scripts/generators/sankey-content.d.ts.map +1 -0
- package/scripts/generators/sankey-content.js +227 -0
- package/scripts/generators/sankey-content.js.map +1 -0
- package/scripts/generators/sitemap.d.ts +66 -0
- package/scripts/generators/sitemap.d.ts.map +1 -0
- package/scripts/generators/sitemap.js +562 -0
- package/scripts/generators/sitemap.js.map +1 -0
- package/scripts/generators/strategies/article-strategy.d.ts +146 -0
- package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/article-strategy.js +4 -0
- package/scripts/generators/strategies/article-strategy.js.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
- package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
- package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
- package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
- package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
- package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
- package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/motions-strategy.js +215 -0
- package/scripts/generators/strategies/motions-strategy.js.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.js +257 -0
- package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
- package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
- package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
- package/scripts/generators/swot-content.d.ts +42 -0
- package/scripts/generators/swot-content.d.ts.map +1 -0
- package/scripts/generators/swot-content.js +366 -0
- package/scripts/generators/swot-content.js.map +1 -0
- package/scripts/generators/week-ahead-content.d.ts +103 -0
- package/scripts/generators/week-ahead-content.d.ts.map +1 -0
- package/scripts/generators/week-ahead-content.js +610 -0
- package/scripts/generators/week-ahead-content.js.map +1 -0
- package/scripts/index.d.ts +40 -0
- package/scripts/index.d.ts.map +1 -0
- package/scripts/index.js +53 -0
- package/scripts/index.js.map +1 -0
- package/scripts/mcp/ep-mcp-client.d.ts +471 -0
- package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/ep-mcp-client.js +734 -0
- package/scripts/mcp/ep-mcp-client.js.map +1 -0
- package/scripts/mcp/mcp-connection.d.ts +264 -0
- package/scripts/mcp/mcp-connection.d.ts.map +1 -0
- package/scripts/mcp/mcp-connection.js +790 -0
- package/scripts/mcp/mcp-connection.js.map +1 -0
- package/scripts/mcp/mcp-health.d.ts +75 -0
- package/scripts/mcp/mcp-health.d.ts.map +1 -0
- package/scripts/mcp/mcp-health.js +78 -0
- package/scripts/mcp/mcp-health.js.map +1 -0
- package/scripts/mcp/mcp-retry.d.ts +94 -0
- package/scripts/mcp/mcp-retry.d.ts.map +1 -0
- package/scripts/mcp/mcp-retry.js +127 -0
- package/scripts/mcp/mcp-retry.js.map +1 -0
- package/scripts/mcp/wb-mcp-client.d.ts +38 -0
- package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/wb-mcp-client.js +112 -0
- package/scripts/mcp/wb-mcp-client.js.map +1 -0
- package/scripts/templates/article-template.d.ts +9 -0
- package/scripts/templates/article-template.d.ts.map +1 -0
- package/scripts/templates/article-template.js +378 -0
- package/scripts/templates/article-template.js.map +1 -0
- package/scripts/templates/section-builders.d.ts +28 -0
- package/scripts/templates/section-builders.d.ts.map +1 -0
- package/scripts/templates/section-builders.js +142 -0
- package/scripts/templates/section-builders.js.map +1 -0
- package/scripts/types/analysis.d.ts +115 -0
- package/scripts/types/analysis.d.ts.map +1 -0
- package/scripts/types/analysis.js +4 -0
- package/scripts/types/analysis.js.map +1 -0
- package/scripts/types/common.d.ts +584 -0
- package/scripts/types/common.d.ts.map +1 -0
- package/scripts/types/common.js +96 -0
- package/scripts/types/common.js.map +1 -0
- package/scripts/types/generation.d.ts +104 -0
- package/scripts/types/generation.d.ts.map +1 -0
- package/scripts/types/generation.js +4 -0
- package/scripts/types/generation.js.map +1 -0
- package/scripts/types/index.d.ts +24 -0
- package/scripts/types/index.d.ts.map +1 -0
- package/scripts/types/index.js +16 -0
- package/scripts/types/index.js.map +1 -0
- package/scripts/types/intelligence.d.ts +129 -0
- package/scripts/types/intelligence.d.ts.map +1 -0
- package/scripts/types/intelligence.js +4 -0
- package/scripts/types/intelligence.js.map +1 -0
- package/scripts/types/mcp.d.ts +418 -0
- package/scripts/types/mcp.d.ts.map +1 -0
- package/scripts/types/mcp.js +4 -0
- package/scripts/types/mcp.js.map +1 -0
- package/scripts/types/parliament.d.ts +388 -0
- package/scripts/types/parliament.d.ts.map +1 -0
- package/scripts/types/parliament.js +4 -0
- package/scripts/types/parliament.js.map +1 -0
- package/scripts/types/quality.d.ts +114 -0
- package/scripts/types/quality.d.ts.map +1 -0
- package/scripts/types/quality.js +4 -0
- package/scripts/types/quality.js.map +1 -0
- package/scripts/types/stakeholder.d.ts +88 -0
- package/scripts/types/stakeholder.d.ts.map +1 -0
- package/scripts/types/stakeholder.js +16 -0
- package/scripts/types/stakeholder.js.map +1 -0
- package/scripts/types/visualization.d.ts +708 -0
- package/scripts/types/visualization.d.ts.map +1 -0
- package/scripts/types/visualization.js +4 -0
- package/scripts/types/visualization.js.map +1 -0
- package/scripts/types/world-bank.d.ts +85 -0
- package/scripts/types/world-bank.d.ts.map +1 -0
- package/scripts/types/world-bank.js +4 -0
- package/scripts/types/world-bank.js.map +1 -0
- package/scripts/utils/article-category.d.ts +18 -0
- package/scripts/utils/article-category.d.ts.map +1 -0
- package/scripts/utils/article-category.js +49 -0
- package/scripts/utils/article-category.js.map +1 -0
- package/scripts/utils/article-quality-scorer.d.ts +87 -0
- package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
- package/scripts/utils/article-quality-scorer.js +1048 -0
- package/scripts/utils/article-quality-scorer.js.map +1 -0
- package/scripts/utils/content-metadata.d.ts +34 -0
- package/scripts/utils/content-metadata.d.ts.map +1 -0
- package/scripts/utils/content-metadata.js +249 -0
- package/scripts/utils/content-metadata.js.map +1 -0
- package/scripts/utils/content-validator.d.ts +94 -0
- package/scripts/utils/content-validator.d.ts.map +1 -0
- package/scripts/utils/content-validator.js +489 -0
- package/scripts/utils/content-validator.js.map +1 -0
- package/scripts/utils/copy-test-reports.d.ts +9 -0
- package/scripts/utils/copy-test-reports.d.ts.map +1 -0
- package/scripts/utils/copy-test-reports.js +508 -0
- package/scripts/utils/copy-test-reports.js.map +1 -0
- package/scripts/utils/file-utils.d.ts +144 -0
- package/scripts/utils/file-utils.d.ts.map +1 -0
- package/scripts/utils/file-utils.js +374 -0
- package/scripts/utils/file-utils.js.map +1 -0
- package/scripts/utils/fix-articles.d.ts +27 -0
- package/scripts/utils/fix-articles.d.ts.map +1 -0
- package/scripts/utils/fix-articles.js +510 -0
- package/scripts/utils/fix-articles.js.map +1 -0
- package/scripts/utils/generate-docs-index.d.ts +8 -0
- package/scripts/utils/generate-docs-index.d.ts.map +1 -0
- package/scripts/utils/generate-docs-index.js +275 -0
- package/scripts/utils/generate-docs-index.js.map +1 -0
- package/scripts/utils/html-sanitize.d.ts +18 -0
- package/scripts/utils/html-sanitize.d.ts.map +1 -0
- package/scripts/utils/html-sanitize.js +57 -0
- package/scripts/utils/html-sanitize.js.map +1 -0
- package/scripts/utils/intelligence-analysis.d.ts +173 -0
- package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
- package/scripts/utils/intelligence-analysis.js +936 -0
- package/scripts/utils/intelligence-analysis.js.map +1 -0
- package/scripts/utils/intelligence-index.d.ts +126 -0
- package/scripts/utils/intelligence-index.d.ts.map +1 -0
- package/scripts/utils/intelligence-index.js +731 -0
- package/scripts/utils/intelligence-index.js.map +1 -0
- package/scripts/utils/metadata-utils.d.ts +14 -0
- package/scripts/utils/metadata-utils.d.ts.map +1 -0
- package/scripts/utils/metadata-utils.js +18 -0
- package/scripts/utils/metadata-utils.js.map +1 -0
- package/scripts/utils/news-metadata.d.ts +47 -0
- package/scripts/utils/news-metadata.d.ts.map +1 -0
- package/scripts/utils/news-metadata.js +259 -0
- package/scripts/utils/news-metadata.js.map +1 -0
- package/scripts/utils/validate-articles.d.ts +2 -0
- package/scripts/utils/validate-articles.d.ts.map +1 -0
- package/scripts/utils/validate-articles.js +284 -0
- package/scripts/utils/validate-articles.js.map +1 -0
- package/scripts/utils/validate-ep-api.d.ts +51 -0
- package/scripts/utils/validate-ep-api.d.ts.map +1 -0
- package/scripts/utils/validate-ep-api.js +160 -0
- package/scripts/utils/validate-ep-api.js.map +1 -0
- package/scripts/utils/world-bank-data.d.ts +84 -0
- package/scripts/utils/world-bank-data.d.ts.map +1 -0
- package/scripts/utils/world-bank-data.js +311 -0
- 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"}
|