feat: add secure batch completion reports

Generate immutable post-cleanup summaries only after queue, history, and recovery finalization. Add bilingual accessible report UI, host and cleanup metrics, report-bound JSON and sanitized error CSV exports, renderer reload recovery, duplicate-filename-safe accounting, and public-source verification coverage.
This commit is contained in:
Sucukdeluxe
2026-08-17 00:18:20 +02:00
parent c8170b8556
commit 329d22e5b7
18 changed files with 1282 additions and 36 deletions
+6 -1
View File
@@ -196,8 +196,10 @@
};
const existingJobIds = new Set();
const filesByName = new Map();
const filesByKey = new Map();
for (const file of merged.files) {
filesByName.set(String(file.name || file.fileName || ''), file);
if (file.fileKey) filesByKey.set(String(file.fileKey), file);
for (const result of file.results) {
if (result?.jobId) existingJobIds.add(result.jobId);
}
@@ -206,11 +208,14 @@
for (const skipped of Array.isArray(skippedJobs) ? skippedJobs : []) {
if (!skipped || (skipped.jobId && existingJobIds.has(skipped.jobId))) continue;
const fileName = String(skipped.fileName || skipped.file || '').split(/[\\/]/).pop() || '';
let file = filesByName.get(fileName);
const fileKey = String(skipped.fileKey || '');
let file = fileKey ? filesByKey.get(fileKey) : filesByName.get(fileName);
if (!file) {
file = { name: fileName, size: Number(skipped.size) || 0, results: [] };
if (fileKey) file.fileKey = fileKey;
merged.files.push(file);
filesByName.set(fileName, file);
if (fileKey) filesByKey.set(fileKey, file);
}
file.results.push({
jobId: skipped.jobId || null,