diff --git a/src/app/(dashboard)/dashboard/batch/BatchListTab.tsx b/src/app/(dashboard)/dashboard/batch/BatchListTab.tsx index f2906ca8f..7479a85c5 100644 --- a/src/app/(dashboard)/dashboard/batch/BatchListTab.tsx +++ b/src/app/(dashboard)/dashboard/batch/BatchListTab.tsx @@ -453,7 +453,7 @@ export default function BatchListTab({ {batch.model ?? "—"} - {/* Progress — ProgressBarBicolor from F3; spinner when validating (G2) */} + {/* Progress — ProgressBarBicolor from F3; spinner when validating (G2); (partial) suffix when expired with failures (G-AUD3) */} {batch.status === "validating" ? (
@@ -461,19 +461,31 @@ export default function BatchListTab({ Validating…
) : total > 0 ? ( - +
+ + {effectiveStatus(batch) === "expired_with_failures" && ( + + {t("batchListProgressPartial")} + + )} +
) : ( )} - {/* Cost column — heuristic estimate (D8) */} - - {estimatedCost} + {/* Cost column — heuristic estimate (D8) with -50% badge per wireframe §3 (G-AUD2) */} + + {estimatedCost} + {estimatedCost !== "—" && ( + + -50% + + )} {relativeTime(batch.createdAt)} diff --git a/src/app/(dashboard)/dashboard/batch/FilesListTab.tsx b/src/app/(dashboard)/dashboard/batch/FilesListTab.tsx index f61d4767c..f47f52db5 100644 --- a/src/app/(dashboard)/dashboard/batch/FilesListTab.tsx +++ b/src/app/(dashboard)/dashboard/batch/FilesListTab.tsx @@ -249,31 +249,44 @@ export default function FilesListTab({ {formatBytes(file.bytes)} - {/* "Used by" column (D12) */} + {/* "Used by" column (D12) — shows batch id + role (input/output/error) per plan §4 */} {related.length === 0 ? ( {t("filesListUsedByNone")} ) : ( -
b.id).join(", ")} - > - {related.slice(0, 2).map((b) => ( - { + const roleFor = (b: BatchRecord): string => + b.inputFileId === file.id + ? t("filesListUsedByRoleInput") + : b.outputFileId === file.id + ? t("filesListUsedByRoleOutput") + : t("filesListUsedByRoleError"); + return ( +
`${b.id} (${roleFor(b)})`).join(", ")} > - {b.id.slice(0, 16)}… - - ))} - {related.length > 2 && ( - - +{related.length - 2} - - )} -
+ {related.slice(0, 2).map((b) => ( + + {b.id.slice(0, 12)}…{" "} + + ({roleFor(b)}) + + + ))} + {related.length > 2 && ( + + +{related.length - 2} + + )} +
+ ); + })() )} diff --git a/src/app/(dashboard)/dashboard/batch/components/ExpirationBadge.tsx b/src/app/(dashboard)/dashboard/batch/components/ExpirationBadge.tsx index 0fe1b5539..bf415283e 100644 --- a/src/app/(dashboard)/dashboard/batch/components/ExpirationBadge.tsx +++ b/src/app/(dashboard)/dashboard/batch/components/ExpirationBadge.tsx @@ -34,6 +34,10 @@ export default function ExpirationBadge({ expiresAt, variant = "default" }: Prop ); } + // D11 tiers: <1h critical (red) · <6h warning (yellow) · else normal (green). + // Plan specifies "<24h normal" — in practice batches always expire ≤24h (OpenAI window), + // so "else" maps to that case. If a provider (e.g. Gemini 48h) yields remaining >24h, + // we still render normal — graceful, no separate tier needed. let tone = "bg-emerald-500/15 text-emerald-400 border-emerald-500/25"; let label = t("expirationBadgeNormal"); if (remaining < 3600) { diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index c088884b1..c78363136 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "الصفحة الرئيسية", diff --git a/src/i18n/messages/az.json b/src/i18n/messages/az.json index 0e7a7eda5..adca85959 100644 --- a/src/i18n/messages/az.json +++ b/src/i18n/messages/az.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index 60d5650f1..aa4fd677d 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Начало", diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json index 82a63e3ea..3a9a0d972 100644 --- a/src/i18n/messages/bn.json +++ b/src/i18n/messages/bn.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index 1a44bef00..700aff4d2 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Domov", diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index c45a6a465..95b40bcb3 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Hjem", diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 2a261ae66..734f3de98 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Zuhause", diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 24f1296ea..5ae1e6bde 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -773,6 +773,10 @@ "filesListUploadButton": "Upload", "filesListUsedByColumn": "Used by", "filesListUsedByNone": "None", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)", "filesListDelete": "Delete", "filesListDownload": "Download", "batchDetailActionCancel": "Cancel batch", diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index dfaba6b71..c3e2d0899 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Inicio", diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json index c5a8ca347..6a0e5351c 100644 --- a/src/i18n/messages/fa.json +++ b/src/i18n/messages/fa.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index b7cc1a955..e58fd5f9d 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Kotiin", diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 5012e02d4..e9d74cb6a 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Accueil", diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json index 45e1939d7..ddff5abd1 100644 --- a/src/i18n/messages/gu.json +++ b/src/i18n/messages/gu.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index 9bb52646f..bb7a55dcb 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "בית", diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index ba1a6ab43..3ec96291c 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "घर", diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index c1d9b3fc4..be85237ed 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Otthon", diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index 90206d7ff..3136251c3 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Rumah", diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json index 059323cd6..c878b2f98 100644 --- a/src/i18n/messages/in.json +++ b/src/i18n/messages/in.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index ec8e1612f..971d4ebf2 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Casa", diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index 5c9ffc496..bdbf6dd66 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "ホーム", diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 48bbedf14..0b7153ca8 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "홈", diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json index e8ed9d61a..d1288680c 100644 --- a/src/i18n/messages/mr.json +++ b/src/i18n/messages/mr.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index c70817158..b3b915393 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Rumah", diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index 5ad2d2357..1e2769f49 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Thuis", diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index 2cec2f5af..dd3f16a0a 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Hjem", diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index 8921ad9f1..ca722513d 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Bahay", diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index 51d8f04de..76b1958fe 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Dom", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 4dd0b1e1d..7f3417c56 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -773,6 +773,10 @@ "filesListUploadButton": "Enviar", "filesListUsedByColumn": "Usado por", "filesListUsedByNone": "Nenhum", + "filesListUsedByRoleInput": "entrada", + "filesListUsedByRoleOutput": "saída", + "filesListUsedByRoleError": "erro", + "batchListProgressPartial": "(parcial)", "filesListDelete": "Excluir", "filesListDownload": "Baixar", "batchDetailActionCancel": "Cancelar batch", diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 5d24bca48..d691a98f4 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Página inicial", diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index 4dee59288..04a5c4f87 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Acasă", diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index db0a1c42b..ccfc48a6f 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Главная", diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index 5433d3372..e65b868bd 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Domov", diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index 1ef5d385f..7ecfb2327 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Hem", diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json index fcbb28987..e91af7ec5 100644 --- a/src/i18n/messages/sw.json +++ b/src/i18n/messages/sw.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json index 037dc9a55..12d339274 100644 --- a/src/i18n/messages/ta.json +++ b/src/i18n/messages/ta.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json index 7acdd3f00..630df51c0 100644 --- a/src/i18n/messages/te.json +++ b/src/i18n/messages/te.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index 8c174c4eb..d9610121c 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "บ้าน", diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json index bd6d1f5d3..92f9f83f5 100644 --- a/src/i18n/messages/tr.json +++ b/src/i18n/messages/tr.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Ana Sayfa", diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index f053fb99f..be0f1ef8e 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "додому", diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json index 696accf94..667855586 100644 --- a/src/i18n/messages/ur.json +++ b/src/i18n/messages/ur.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Home", diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index d2b8d9bc2..46503f4e3 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "Trang chủ", diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index 866d6dd73..f9fa3e5a5 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -782,7 +782,11 @@ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", "batchActionCancelError": "Failed to cancel batch. Try again.", "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "filesListUsedByRoleInput": "input", + "filesListUsedByRoleOutput": "output", + "filesListUsedByRoleError": "error", + "batchListProgressPartial": "(partial)" }, "sidebar": { "home": "首页", diff --git a/tests/unit/dashboard/batch/list-regression.test.tsx b/tests/unit/dashboard/batch/list-regression.test.tsx index 59d4bb966..cce3fbddf 100644 --- a/tests/unit/dashboard/batch/list-regression.test.tsx +++ b/tests/unit/dashboard/batch/list-regression.test.tsx @@ -341,7 +341,7 @@ describe("FilesListTab — rendering", () => { expect(el.textContent).toContain("filesListUsedByColumn"); }); - it("13. files with related batches (via inputFileId) show batch ID in used-by column", () => { + it("13. files with related batches (via inputFileId) show batch ID + role in used-by column", () => { const file = makeFile({ id: "file-used", purpose: "batch" }); const batches = [ { @@ -357,7 +357,14 @@ describe("FilesListTab — rendering", () => { const el = render( ); - expect(el.textContent).toContain("batch-using-file"); + // Truncated id prefix (12 chars) appears inline + expect(el.textContent).toContain("batch-using-"); + // Role label is rendered next to the id (G-AUD1 — plan §4 "b1 (input)") + expect(el.textContent).toContain("filesListUsedByRoleInput"); + // Tooltip carries the full id + role + const cell = el.querySelector("[title*='batch-using-file']"); + expect(cell).not.toBeNull(); + expect(cell?.getAttribute("title")).toContain("filesListUsedByRoleInput"); }); it("14. loading state shows spinner", () => {