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,178 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2024-2026 Hack23 AB
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { ArticleCategory } from '../../types/index.js';
|
|
4
|
+
import { WEEK_AHEAD_TITLES, getLocalizedString } from '../../constants/languages.js';
|
|
5
|
+
import { fetchWeekAheadData, fetchEPFeedData } from '../pipeline/fetch-stage.js';
|
|
6
|
+
import { buildWeekAheadContent, buildKeywords, buildWhatToWatchSection, } from '../week-ahead-content.js';
|
|
7
|
+
import { buildDeepAnalysisSection } from '../deep-analysis-content.js';
|
|
8
|
+
import { buildProspectiveAnalysis, buildProspectiveSwot, buildProspectiveDashboard, buildProspectiveMindmap, } from '../analysis-builders.js';
|
|
9
|
+
import { buildSwotSection } from '../swot-content.js';
|
|
10
|
+
import { buildDashboardSection } from '../dashboard-content.js';
|
|
11
|
+
import { buildIntelligenceMindmapSection } from '../mindmap-content.js';
|
|
12
|
+
import { pl } from '../../utils/metadata-utils.js';
|
|
13
|
+
// ─── Date-range helper ────────────────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Compute the week-ahead date range starting the day after `baseDate`.
|
|
16
|
+
*
|
|
17
|
+
* @param baseDate - ISO 8601 publication date (YYYY-MM-DD)
|
|
18
|
+
* @returns Date range spanning the next 7 days
|
|
19
|
+
*/
|
|
20
|
+
function computeWeekAheadDateRange(baseDate) {
|
|
21
|
+
const base = new Date(`${baseDate}T00:00:00Z`);
|
|
22
|
+
const startDate = new Date(base);
|
|
23
|
+
startDate.setUTCDate(base.getUTCDate() + 1);
|
|
24
|
+
const endDate = new Date(startDate);
|
|
25
|
+
endDate.setUTCDate(startDate.getUTCDate() + 7);
|
|
26
|
+
const startParts = startDate.toISOString().split('T');
|
|
27
|
+
const endParts = endDate.toISOString().split('T');
|
|
28
|
+
if (!startParts[0] || !endParts[0]) {
|
|
29
|
+
throw new Error('Invalid date format generated in computeWeekAheadDateRange');
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
start: startParts[0],
|
|
33
|
+
end: endParts[0],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// ─── Content-aware metadata helpers ───────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Build a content-aware title suffix from week-ahead data counts.
|
|
39
|
+
*
|
|
40
|
+
* @param weekData - Aggregated week-ahead domain data
|
|
41
|
+
* @returns Short suffix for the title, or empty string
|
|
42
|
+
*/
|
|
43
|
+
function buildWeekAheadTitleSuffix(weekData) {
|
|
44
|
+
const parts = [];
|
|
45
|
+
if (weekData.events.length > 0)
|
|
46
|
+
parts.push(pl(weekData.events.length, 'Event', 'Events'));
|
|
47
|
+
if (weekData.committees.length > 0)
|
|
48
|
+
parts.push(pl(weekData.committees.length, 'Committee Meeting', 'Committee Meetings'));
|
|
49
|
+
if (weekData.pipeline.length > 0)
|
|
50
|
+
parts.push(pl(weekData.pipeline.length, 'Pipeline Item', 'Pipeline Items'));
|
|
51
|
+
return parts.join(', ');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build a content-aware description from week-ahead data.
|
|
55
|
+
* Summarises event counts, committee meetings, and key highlights.
|
|
56
|
+
*
|
|
57
|
+
* @param weekData - Aggregated week-ahead domain data
|
|
58
|
+
* @param dateRange - Date range for the article
|
|
59
|
+
* @returns SEO-friendly description (≤ 200 chars)
|
|
60
|
+
*/
|
|
61
|
+
function buildWeekAheadDescription(weekData, dateRange) {
|
|
62
|
+
const parts = [];
|
|
63
|
+
if (weekData.events.length > 0)
|
|
64
|
+
parts.push(`${pl(weekData.events.length, 'scheduled event', 'scheduled events')}`);
|
|
65
|
+
if (weekData.committees.length > 0)
|
|
66
|
+
parts.push(`${pl(weekData.committees.length, 'committee meeting', 'committee meetings')}`);
|
|
67
|
+
if (weekData.pipeline.length > 0)
|
|
68
|
+
parts.push(`${pl(weekData.pipeline.length, 'legislative pipeline item', 'legislative pipeline items')}`);
|
|
69
|
+
if (weekData.questions.length > 0)
|
|
70
|
+
parts.push(`${pl(weekData.questions.length, 'parliamentary question', 'parliamentary questions')}`);
|
|
71
|
+
if (parts.length === 0) {
|
|
72
|
+
return `European Parliament calendar and plenary agenda for ${dateRange.start} to ${dateRange.end}.`;
|
|
73
|
+
}
|
|
74
|
+
const highlight = weekData.events[0]?.title ?? '';
|
|
75
|
+
const base = `EP week ahead (${dateRange.start}–${dateRange.end}): ${parts.join(', ')}`;
|
|
76
|
+
if (highlight) {
|
|
77
|
+
const full = `${base}. Key: ${highlight}`;
|
|
78
|
+
return full.length > 200 ? full.slice(0, 197) + '...' : full;
|
|
79
|
+
}
|
|
80
|
+
return base.length > 200 ? base.slice(0, 197) + '...' : base;
|
|
81
|
+
}
|
|
82
|
+
// ─── Strategy implementation ──────────────────────────────────────────────────
|
|
83
|
+
/**
|
|
84
|
+
* Article strategy for {@link ArticleCategory.WEEK_AHEAD}.
|
|
85
|
+
* Fetches plenary, committee, document, pipeline and question data then builds
|
|
86
|
+
* a forward-looking preview of the upcoming parliamentary week.
|
|
87
|
+
*/
|
|
88
|
+
export class WeekAheadStrategy {
|
|
89
|
+
type = ArticleCategory.WEEK_AHEAD;
|
|
90
|
+
requiredMCPTools = [
|
|
91
|
+
'get_plenary_sessions',
|
|
92
|
+
'get_committee_info',
|
|
93
|
+
'search_documents',
|
|
94
|
+
'monitor_legislative_pipeline',
|
|
95
|
+
'get_parliamentary_questions',
|
|
96
|
+
'get_events',
|
|
97
|
+
'get_events_feed',
|
|
98
|
+
'get_plenary_documents_feed',
|
|
99
|
+
'get_adopted_texts_feed',
|
|
100
|
+
];
|
|
101
|
+
/**
|
|
102
|
+
* Fetch week-ahead data from MCP.
|
|
103
|
+
*
|
|
104
|
+
* @param client - MCP client or null
|
|
105
|
+
* @param date - ISO 8601 publication date
|
|
106
|
+
* @returns Populated week-ahead data payload
|
|
107
|
+
*/
|
|
108
|
+
async fetchData(client, date) {
|
|
109
|
+
const dateRange = computeWeekAheadDateRange(date);
|
|
110
|
+
console.log(` 📆 Date range: ${dateRange.start} to ${dateRange.end}`);
|
|
111
|
+
// Fetch traditional MCP data and EP feeds in parallel
|
|
112
|
+
const [weekData, feedData] = await Promise.all([
|
|
113
|
+
fetchWeekAheadData(client, dateRange),
|
|
114
|
+
fetchEPFeedData(client, 'one-week', dateRange),
|
|
115
|
+
]);
|
|
116
|
+
const keywords = buildKeywords(weekData);
|
|
117
|
+
return {
|
|
118
|
+
date,
|
|
119
|
+
dateRange,
|
|
120
|
+
weekData,
|
|
121
|
+
keywords,
|
|
122
|
+
feedData,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build the week-ahead HTML body for the specified language.
|
|
127
|
+
*
|
|
128
|
+
* @param data - Week-ahead data payload
|
|
129
|
+
* @param lang - Target language code used for editorial strings
|
|
130
|
+
* @returns Article HTML body
|
|
131
|
+
*/
|
|
132
|
+
buildContent(data, lang) {
|
|
133
|
+
const base = buildWeekAheadContent(data.weekData, data.dateRange, lang);
|
|
134
|
+
const watchSection = buildWhatToWatchSection(data.weekData.pipeline, [], lang);
|
|
135
|
+
const analysis = buildProspectiveAnalysis(data.weekData, data.dateRange, 'week');
|
|
136
|
+
const analysisSection = buildDeepAnalysisSection(analysis, lang, 'en');
|
|
137
|
+
const mindmapData = buildProspectiveMindmap(data.weekData, lang);
|
|
138
|
+
const mindmapSection = buildIntelligenceMindmapSection(mindmapData, lang);
|
|
139
|
+
const swotData = buildProspectiveSwot(data.weekData, 'week', lang);
|
|
140
|
+
const swotSection = buildSwotSection(swotData, lang);
|
|
141
|
+
const dashboardData = buildProspectiveDashboard(data.weekData, 'week', lang);
|
|
142
|
+
const dashboardSection = buildDashboardSection(dashboardData, lang);
|
|
143
|
+
// Inject at the explicit <!-- /article-content --> marker position so the
|
|
144
|
+
// section stays inside the .article-content styling scope. The marker is
|
|
145
|
+
// removed from the final HTML output to avoid unnecessary bytes.
|
|
146
|
+
const injection = (watchSection || '') + analysisSection + mindmapSection + swotSection + dashboardSection;
|
|
147
|
+
if (injection) {
|
|
148
|
+
return base.replace('<!-- /article-content -->', injection);
|
|
149
|
+
}
|
|
150
|
+
return base.replace('<!-- /article-content -->', '');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Return language-specific metadata for the week-ahead article.
|
|
154
|
+
*
|
|
155
|
+
* @param data - Week-ahead data payload
|
|
156
|
+
* @param lang - Target language code
|
|
157
|
+
* @returns Localised metadata
|
|
158
|
+
*/
|
|
159
|
+
getMetadata(data, lang) {
|
|
160
|
+
const titleFn = getLocalizedString(WEEK_AHEAD_TITLES, lang);
|
|
161
|
+
const { title: baseTitle, subtitle: baseSubtitle } = titleFn(data.dateRange.start, data.dateRange.end);
|
|
162
|
+
const suffix = lang === 'en' ? buildWeekAheadTitleSuffix(data.weekData) : '';
|
|
163
|
+
const title = suffix ? `${baseTitle} — ${suffix}` : baseTitle;
|
|
164
|
+
const subtitle = lang === 'en'
|
|
165
|
+
? buildWeekAheadDescription(data.weekData, data.dateRange) || baseSubtitle
|
|
166
|
+
: baseSubtitle;
|
|
167
|
+
return {
|
|
168
|
+
title,
|
|
169
|
+
subtitle,
|
|
170
|
+
keywords: data.keywords,
|
|
171
|
+
category: ArticleCategory.WEEK_AHEAD,
|
|
172
|
+
sources: [],
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Singleton instance for use by the strategy registry */
|
|
177
|
+
export const weekAheadStrategy = new WeekAheadStrategy();
|
|
178
|
+
//# sourceMappingURL=week-ahead-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week-ahead-strategy.js","sourceRoot":"","sources":["../../../src/generators/strategies/week-ahead-strategy.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,sCAAsC;AAUtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAC;AAgBnD,iFAAiF;AAEjF;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;QACpB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;KACjB,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,QAAuB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1F,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACxF,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,yBAAyB,CAAC,QAAuB,EAAE,SAAoB;IAC9E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrF,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC7F,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,EAAE,4BAA4B,CAAC,EAAE,CAC7F,CAAC;IACJ,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,EAAE,CACxF,CAAC;IAEJ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,uDAAuD,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,GAAG,GAAG,CAAC;IACvG,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,kBAAkB,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACxF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,GAAG,IAAI,UAAU,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC;IAElC,gBAAgB,GAAG;QAC1B,sBAAsB;QACtB,oBAAoB;QACpB,kBAAkB;QAClB,8BAA8B;QAC9B,6BAA6B;QAC7B,YAAY;QACZ,iBAAiB;QACjB,4BAA4B;QAC5B,wBAAwB;KAChB,CAAC;IAEX;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CACb,MAA0C,EAC1C,IAAY;QAEZ,MAAM,SAAS,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEvE,sDAAsD;QACtD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC;YACrC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEzC,OAAO;YACL,IAAI;YACJ,SAAS;YACT,QAAQ;YACR,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,IAA0B,EAAE,IAAkB;QACzD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjF,MAAM,eAAe,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,+BAA+B,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7E,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACpE,0EAA0E;QAC1E,yEAAyE;QACzE,iEAAiE;QACjE,MAAM,SAAS,GACb,CAAC,YAAY,IAAI,EAAE,CAAC,GAAG,eAAe,GAAG,cAAc,GAAG,WAAW,GAAG,gBAAgB,CAAC;QAC3F,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,IAA0B,EAAE,IAAkB;QACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,EACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CACnB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,QAAQ,GACZ,IAAI,KAAK,IAAI;YACX,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,YAAY;YAC1E,CAAC,CAAC,YAAY,CAAC;QACnB,OAAO;YACL,KAAK;YACL,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,eAAe,CAAC,UAAU;YACpC,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Generators/Strategies/WeeklyReviewStrategy
|
|
3
|
+
* @description Article strategy for the Week In Review article type.
|
|
4
|
+
* Fetches voting records, voting patterns, voting anomalies, and parliamentary
|
|
5
|
+
* questions from the past 7 days, then renders a retrospective analysis article.
|
|
6
|
+
*/
|
|
7
|
+
import type { EuropeanParliamentMCPClient } from '../../mcp/ep-mcp-client.js';
|
|
8
|
+
import { ArticleCategory } from '../../types/index.js';
|
|
9
|
+
import type { LanguageCode, DateRange, VotingRecord, VotingPattern, VotingAnomaly, MotionsQuestion, EPFeedData } from '../../types/index.js';
|
|
10
|
+
import type { ArticleStrategy, ArticleData, ArticleMetadata } from './article-strategy.js';
|
|
11
|
+
/** Data fetched and pre-processed by {@link WeeklyReviewStrategy} */
|
|
12
|
+
export interface WeeklyReviewArticleData extends ArticleData {
|
|
13
|
+
/** Review period date range */
|
|
14
|
+
readonly dateRange: DateRange;
|
|
15
|
+
/** Voting records from the review period */
|
|
16
|
+
readonly votingRecords: readonly VotingRecord[];
|
|
17
|
+
/** Voting patterns analysis */
|
|
18
|
+
readonly votingPatterns: readonly VotingPattern[];
|
|
19
|
+
/** Detected voting anomalies */
|
|
20
|
+
readonly anomalies: readonly VotingAnomaly[];
|
|
21
|
+
/** Parliamentary questions from the period */
|
|
22
|
+
readonly questions: readonly MotionsQuestion[];
|
|
23
|
+
/** Start date string for display */
|
|
24
|
+
readonly dateFromStr: string;
|
|
25
|
+
/** EP feed data for enrichment (when available) */
|
|
26
|
+
readonly feedData?: EPFeedData | undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Article strategy for {@link ArticleCategory.WEEK_IN_REVIEW}.
|
|
30
|
+
* Fetches voting records, anomalies, patterns, and questions for the
|
|
31
|
+
* past 7 days and builds a retrospective analysis article.
|
|
32
|
+
*/
|
|
33
|
+
export declare class WeeklyReviewStrategy implements ArticleStrategy<WeeklyReviewArticleData> {
|
|
34
|
+
readonly type = ArticleCategory.WEEK_IN_REVIEW;
|
|
35
|
+
readonly requiredMCPTools: readonly ["get_voting_records", "analyze_voting_patterns", "detect_voting_anomalies", "get_parliamentary_questions", "get_adopted_texts_feed", "get_procedures_feed", "get_events_feed"];
|
|
36
|
+
/**
|
|
37
|
+
* Fetch weekly review data from MCP.
|
|
38
|
+
*
|
|
39
|
+
* @param client - MCP client or null
|
|
40
|
+
* @param date - ISO 8601 publication date
|
|
41
|
+
* @returns Populated weekly review data payload
|
|
42
|
+
*/
|
|
43
|
+
fetchData(client: EuropeanParliamentMCPClient | null, date: string): Promise<WeeklyReviewArticleData>;
|
|
44
|
+
/**
|
|
45
|
+
* Build the weekly review HTML body for the specified language.
|
|
46
|
+
*
|
|
47
|
+
* @param data - Weekly review data payload
|
|
48
|
+
* @param lang - Target language code used for editorial strings
|
|
49
|
+
* @returns Article HTML body
|
|
50
|
+
*/
|
|
51
|
+
buildContent(data: WeeklyReviewArticleData, lang: LanguageCode): string;
|
|
52
|
+
/**
|
|
53
|
+
* Return language-specific metadata for the weekly review article.
|
|
54
|
+
*
|
|
55
|
+
* @param data - Weekly review data payload
|
|
56
|
+
* @param lang - Target language code
|
|
57
|
+
* @returns Localised metadata
|
|
58
|
+
*/
|
|
59
|
+
getMetadata(data: WeeklyReviewArticleData, lang: LanguageCode): ArticleMetadata;
|
|
60
|
+
}
|
|
61
|
+
/** Singleton instance for use by the strategy registry */
|
|
62
|
+
export declare const weeklyReviewStrategy: WeeklyReviewStrategy;
|
|
63
|
+
//# sourceMappingURL=weekly-review-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekly-review-strategy.d.ts","sourceRoot":"","sources":["../../../src/generators/strategies/weekly-review-strategy.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACX,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK3F,qEAAqE;AACrE,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IAC7C,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,oCAAoC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC5C;AAsHD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,eAAe,CAAC,uBAAuB,CAAC;IACnF,QAAQ,CAAC,IAAI,kCAAkC;IAE/C,QAAQ,CAAC,gBAAgB,2LAQd;IAEX;;;;;;OAMG;IACG,SAAS,CACb,MAAM,EAAE,2BAA2B,GAAG,IAAI,EAC1C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,uBAAuB,CAAC;IAyBnC;;;;;;OAMG;IACH,YAAY,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAgDvE;;;;;;OAMG;IACH,WAAW,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,GAAG,eAAe;CAkBhF;AAED,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2024-2026 Hack23 AB
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { ArticleCategory } from '../../types/index.js';
|
|
4
|
+
import { WEEKLY_REVIEW_TITLES, getLocalizedString } from '../../constants/languages.js';
|
|
5
|
+
import { fetchVotingRecords, fetchVotingPatterns, fetchMotionsAnomalies, fetchParliamentaryQuestionsForMotions, fetchEPFeedData, } from '../pipeline/fetch-stage.js';
|
|
6
|
+
import { generateMotionsContent, buildAdoptedTextsSection } from '../motions-content.js';
|
|
7
|
+
import { buildDeepAnalysisSection } from '../deep-analysis-content.js';
|
|
8
|
+
import { buildVotingAnalysis, buildVotingSwot, buildVotingDashboard, buildVotingMindmap, } from '../analysis-builders.js';
|
|
9
|
+
import { buildSwotSection } from '../swot-content.js';
|
|
10
|
+
import { buildDashboardSection } from '../dashboard-content.js';
|
|
11
|
+
import { buildIntelligenceMindmapSection } from '../mindmap-content.js';
|
|
12
|
+
import { pl } from '../../utils/metadata-utils.js';
|
|
13
|
+
/** Base keywords shared by all Weekly Review articles */
|
|
14
|
+
const WEEKLY_REVIEW_BASE_KEYWORDS = [
|
|
15
|
+
'European Parliament',
|
|
16
|
+
'weekly review',
|
|
17
|
+
'voting records',
|
|
18
|
+
'parliamentary activity',
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Extract content-aware keywords from weekly review data.
|
|
22
|
+
*
|
|
23
|
+
* @param data - Weekly review article data payload
|
|
24
|
+
* @returns Deduplicated keyword array
|
|
25
|
+
*/
|
|
26
|
+
function buildWeeklyReviewKeywords(data) {
|
|
27
|
+
const keywords = [...WEEKLY_REVIEW_BASE_KEYWORDS];
|
|
28
|
+
for (const r of data.votingRecords.slice(0, 5)) {
|
|
29
|
+
if (r.title)
|
|
30
|
+
keywords.push(r.title.slice(0, 60));
|
|
31
|
+
}
|
|
32
|
+
for (const a of data.anomalies.slice(0, 3)) {
|
|
33
|
+
if (a.type)
|
|
34
|
+
keywords.push(a.type);
|
|
35
|
+
}
|
|
36
|
+
for (const q of data.questions.slice(0, 3)) {
|
|
37
|
+
if (q.topic)
|
|
38
|
+
keywords.push(q.topic);
|
|
39
|
+
}
|
|
40
|
+
if (data.feedData?.adoptedTexts) {
|
|
41
|
+
for (const text of data.feedData.adoptedTexts.slice(0, 3)) {
|
|
42
|
+
if (text.title)
|
|
43
|
+
keywords.push(text.title.slice(0, 60));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return [...new Set(keywords)];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build a content-aware description from weekly review data.
|
|
50
|
+
*
|
|
51
|
+
* @param data - Weekly review article data payload
|
|
52
|
+
* @returns SEO-friendly description (≤ 200 chars)
|
|
53
|
+
*/
|
|
54
|
+
function buildWeeklyReviewDescription(data) {
|
|
55
|
+
const parts = [];
|
|
56
|
+
if (data.votingRecords.length > 0)
|
|
57
|
+
parts.push(`${pl(data.votingRecords.length, 'vote', 'votes')} analysed`);
|
|
58
|
+
if (data.anomalies.length > 0)
|
|
59
|
+
parts.push(pl(data.anomalies.length, 'voting anomaly', 'voting anomalies'));
|
|
60
|
+
if (data.questions.length > 0)
|
|
61
|
+
parts.push(`${pl(data.questions.length, 'question', 'questions')} tabled`);
|
|
62
|
+
const adoptedCount = data.feedData?.adoptedTexts?.length ?? 0;
|
|
63
|
+
if (adoptedCount > 0)
|
|
64
|
+
parts.push(`${adoptedCount} adopted ${adoptedCount === 1 ? 'text' : 'texts'}`);
|
|
65
|
+
if (parts.length === 0) {
|
|
66
|
+
return `European Parliament weekly review for ${data.dateRange.start} to ${data.dateRange.end}.`;
|
|
67
|
+
}
|
|
68
|
+
const highlight = data.votingRecords[0]?.title ?? '';
|
|
69
|
+
const base = `EP week in review (${data.dateRange.start}–${data.dateRange.end}): ${parts.join(', ')}`;
|
|
70
|
+
if (highlight) {
|
|
71
|
+
const full = `${base}. Key: ${highlight}`;
|
|
72
|
+
return full.length > 200 ? full.slice(0, 197) + '...' : full;
|
|
73
|
+
}
|
|
74
|
+
return base.length > 200 ? base.slice(0, 197) + '...' : base;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Build a content-aware title suffix from weekly review data counts.
|
|
78
|
+
*
|
|
79
|
+
* @param data - Weekly review article data payload
|
|
80
|
+
* @returns Short suffix for the title, or empty string
|
|
81
|
+
*/
|
|
82
|
+
function buildWeeklyReviewTitleSuffix(data) {
|
|
83
|
+
const parts = [];
|
|
84
|
+
if (data.votingRecords.length > 0) {
|
|
85
|
+
parts.push(pl(data.votingRecords.length, 'Vote', 'Votes'));
|
|
86
|
+
}
|
|
87
|
+
if (data.anomalies.length > 0) {
|
|
88
|
+
parts.push(pl(data.anomalies.length, 'Anomaly', 'Anomalies'));
|
|
89
|
+
}
|
|
90
|
+
const adoptedCount = data.feedData?.adoptedTexts?.length ?? 0;
|
|
91
|
+
if (adoptedCount > 0) {
|
|
92
|
+
parts.push(pl(adoptedCount, 'Text', 'Texts'));
|
|
93
|
+
}
|
|
94
|
+
return parts.join(', ');
|
|
95
|
+
}
|
|
96
|
+
// ─── Date-range helper ────────────────────────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Compute the review period covering the 7 days ending on `baseDate`.
|
|
99
|
+
*
|
|
100
|
+
* @param baseDate - ISO 8601 publication date (YYYY-MM-DD)
|
|
101
|
+
* @returns Date range covering the past 7 days
|
|
102
|
+
*/
|
|
103
|
+
function computeWeeklyReviewDateRange(baseDate) {
|
|
104
|
+
const end = new Date(`${baseDate}T00:00:00Z`);
|
|
105
|
+
const start = new Date(end);
|
|
106
|
+
start.setUTCDate(end.getUTCDate() - 7);
|
|
107
|
+
const startParts = start.toISOString().split('T');
|
|
108
|
+
const endParts = end.toISOString().split('T');
|
|
109
|
+
if (!startParts[0] || !endParts[0]) {
|
|
110
|
+
throw new Error('Invalid date format generated in computeWeeklyReviewDateRange');
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
start: startParts[0],
|
|
114
|
+
end: endParts[0],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ─── Strategy implementation ──────────────────────────────────────────────────
|
|
118
|
+
/**
|
|
119
|
+
* Article strategy for {@link ArticleCategory.WEEK_IN_REVIEW}.
|
|
120
|
+
* Fetches voting records, anomalies, patterns, and questions for the
|
|
121
|
+
* past 7 days and builds a retrospective analysis article.
|
|
122
|
+
*/
|
|
123
|
+
export class WeeklyReviewStrategy {
|
|
124
|
+
type = ArticleCategory.WEEK_IN_REVIEW;
|
|
125
|
+
requiredMCPTools = [
|
|
126
|
+
'get_voting_records',
|
|
127
|
+
'analyze_voting_patterns',
|
|
128
|
+
'detect_voting_anomalies',
|
|
129
|
+
'get_parliamentary_questions',
|
|
130
|
+
'get_adopted_texts_feed',
|
|
131
|
+
'get_procedures_feed',
|
|
132
|
+
'get_events_feed',
|
|
133
|
+
];
|
|
134
|
+
/**
|
|
135
|
+
* Fetch weekly review data from MCP.
|
|
136
|
+
*
|
|
137
|
+
* @param client - MCP client or null
|
|
138
|
+
* @param date - ISO 8601 publication date
|
|
139
|
+
* @returns Populated weekly review data payload
|
|
140
|
+
*/
|
|
141
|
+
async fetchData(client, date) {
|
|
142
|
+
const dateRange = computeWeeklyReviewDateRange(date);
|
|
143
|
+
console.log(` 📊 Weekly review range: ${dateRange.start} to ${dateRange.end}`);
|
|
144
|
+
// Fetch voting data and EP feed data in parallel
|
|
145
|
+
const [votingRecords, votingPatterns, anomalies, questions, feedData] = await Promise.all([
|
|
146
|
+
fetchVotingRecords(client, dateRange.start, dateRange.end),
|
|
147
|
+
fetchVotingPatterns(client, dateRange.start, dateRange.end),
|
|
148
|
+
fetchMotionsAnomalies(client, dateRange.start, dateRange.end),
|
|
149
|
+
fetchParliamentaryQuestionsForMotions(client, dateRange.start, dateRange.end),
|
|
150
|
+
fetchEPFeedData(client, 'one-week', dateRange),
|
|
151
|
+
]);
|
|
152
|
+
return {
|
|
153
|
+
date,
|
|
154
|
+
dateRange,
|
|
155
|
+
dateFromStr: dateRange.start,
|
|
156
|
+
votingRecords,
|
|
157
|
+
votingPatterns,
|
|
158
|
+
anomalies,
|
|
159
|
+
questions,
|
|
160
|
+
feedData,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Build the weekly review HTML body for the specified language.
|
|
165
|
+
*
|
|
166
|
+
* @param data - Weekly review data payload
|
|
167
|
+
* @param lang - Target language code used for editorial strings
|
|
168
|
+
* @returns Article HTML body
|
|
169
|
+
*/
|
|
170
|
+
buildContent(data, lang) {
|
|
171
|
+
const base = generateMotionsContent(data.dateRange.start, data.dateRange.end, [...data.votingRecords], [...data.votingPatterns], [...data.anomalies], [...data.questions], lang);
|
|
172
|
+
const analysis = buildVotingAnalysis(data.dateRange.start, data.dateRange.end, data.votingRecords, data.votingPatterns, data.anomalies, data.questions);
|
|
173
|
+
const deepSection = buildDeepAnalysisSection(analysis, lang, 'en');
|
|
174
|
+
// Enrich with adopted texts from feed data when available
|
|
175
|
+
const adoptedTextsHtml = data.feedData && data.feedData.adoptedTexts.length > 0
|
|
176
|
+
? buildAdoptedTextsSection(data.feedData.adoptedTexts, lang)
|
|
177
|
+
: '';
|
|
178
|
+
const mindmapData = buildVotingMindmap(data.votingRecords, data.votingPatterns, data.anomalies, lang);
|
|
179
|
+
const mindmapSection = buildIntelligenceMindmapSection(mindmapData, lang);
|
|
180
|
+
const swotData = buildVotingSwot(data.votingRecords, data.votingPatterns, data.anomalies, lang);
|
|
181
|
+
const swotSection = buildSwotSection(swotData, lang);
|
|
182
|
+
const dashboardData = buildVotingDashboard(data.votingRecords, data.votingPatterns, data.anomalies, lang);
|
|
183
|
+
const dashboardSection = buildDashboardSection(dashboardData, lang);
|
|
184
|
+
return base.replace('<!-- /article-content -->', adoptedTextsHtml + deepSection + mindmapSection + swotSection + dashboardSection);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Return language-specific metadata for the weekly review article.
|
|
188
|
+
*
|
|
189
|
+
* @param data - Weekly review data payload
|
|
190
|
+
* @param lang - Target language code
|
|
191
|
+
* @returns Localised metadata
|
|
192
|
+
*/
|
|
193
|
+
getMetadata(data, lang) {
|
|
194
|
+
const titleFn = getLocalizedString(WEEKLY_REVIEW_TITLES, lang);
|
|
195
|
+
const { title: baseTitle, subtitle: baseSubtitle } = titleFn(data.dateRange.start, data.dateRange.end);
|
|
196
|
+
const suffix = lang === 'en' ? buildWeeklyReviewTitleSuffix(data) : '';
|
|
197
|
+
const title = suffix ? `${baseTitle} — ${suffix}` : baseTitle;
|
|
198
|
+
const description = lang === 'en' ? buildWeeklyReviewDescription(data) : '';
|
|
199
|
+
const subtitle = description || baseSubtitle;
|
|
200
|
+
return {
|
|
201
|
+
title,
|
|
202
|
+
subtitle,
|
|
203
|
+
keywords: buildWeeklyReviewKeywords(data),
|
|
204
|
+
category: ArticleCategory.WEEK_IN_REVIEW,
|
|
205
|
+
sources: [],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Singleton instance for use by the strategy registry */
|
|
210
|
+
export const weeklyReviewStrategy = new WeeklyReviewStrategy();
|
|
211
|
+
//# sourceMappingURL=weekly-review-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekly-review-strategy.js","sourceRoot":"","sources":["../../../src/generators/strategies/weekly-review-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SwotAnalysis, MultiDimensionalSwot } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a complete SWOT analysis section HTML.
|
|
4
|
+
*
|
|
5
|
+
* Generates an accessible CSS Grid-based SWOT matrix that can be embedded
|
|
6
|
+
* in any article type. The visualization is pure HTML/CSS with no JavaScript
|
|
7
|
+
* required, ensuring compatibility with strict CSP policies.
|
|
8
|
+
*
|
|
9
|
+
* Returns an empty string if the analysis is null/undefined or contains
|
|
10
|
+
* no items in any quadrant.
|
|
11
|
+
*
|
|
12
|
+
* @param analysis - SWOT analysis data (null/undefined returns empty string)
|
|
13
|
+
* @param lang - BCP 47 language code for localized headings (defaults to "en")
|
|
14
|
+
* @param heading - Optional custom section heading override
|
|
15
|
+
* @returns HTML section string or empty string
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildSwotSection(analysis: SwotAnalysis | null | undefined, lang?: string, heading?: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Build a complete multi-dimensional SWOT analysis section HTML.
|
|
20
|
+
*
|
|
21
|
+
* Renders a primary aggregated 4-quadrant SWOT matrix followed by optional:
|
|
22
|
+
* - **Dimension drill-downs** (Political, Economic, Social, Legal, Geopolitical)
|
|
23
|
+
* as CSS-only `<details>` disclosure widgets
|
|
24
|
+
* - **Stakeholder perspectives** (Citizens, Industry, NGOs, MEPs, etc.)
|
|
25
|
+
* as collapsible `<details>` widgets
|
|
26
|
+
* - **Temporal analysis** (short-term, medium-term, long-term)
|
|
27
|
+
* as collapsible `<details>` widgets
|
|
28
|
+
* - **Cross-references** linking SWOT items to specific EP documents/votes
|
|
29
|
+
*
|
|
30
|
+
* All interactivity is CSS-only (no JavaScript), ensuring compatibility
|
|
31
|
+
* with strict CSP policies and WCAG 2.1 AA accessibility requirements.
|
|
32
|
+
*
|
|
33
|
+
* Returns an empty string if the analysis has no dimensions or all
|
|
34
|
+
* dimensions are empty.
|
|
35
|
+
*
|
|
36
|
+
* @param analysis - Multi-dimensional SWOT data (null/undefined returns empty string)
|
|
37
|
+
* @param lang - BCP 47 language code for localized headings (defaults to "en")
|
|
38
|
+
* @param heading - Optional custom section heading override
|
|
39
|
+
* @returns HTML section string or empty string
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildMultiDimensionalSwotSection(analysis: MultiDimensionalSwot | null | undefined, lang?: string, heading?: string): string;
|
|
42
|
+
//# sourceMappingURL=swot-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swot-content.d.ts","sourceRoot":"","sources":["../../src/generators/swot-content.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,YAAY,EAMZ,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;AAgD3B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACzC,IAAI,GAAE,MAAa,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CA2DR;AAmQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACjD,IAAI,GAAE,MAAa,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAuCR"}
|