diff --git a/src/components/bulk/DetailDrawer.astro b/src/components/bulk/DetailDrawer.astro
index b576a86..9fd4329 100644
--- a/src/components/bulk/DetailDrawer.astro
+++ b/src/components/bulk/DetailDrawer.astro
@@ -2,33 +2,36 @@
/**
* DetailDrawer Component
*
- * Slide-out drawer for displaying full details of a bulk evaluation row result.
- * Shows original CSV row data, interpolated prompt, model output, and execution metadata.
+ * Slide-out drawer for displaying full details of a bulk evaluation row.
+ * Shows ALL model outputs for a row in a vertical stack.
*
* @example
- *
+ *
*
- * @param result - RowResult containing prompt, output, status, and metadata
+ * @param allRowResults - Array of RowResult for all models on this row
* @param rowData - Original CSV row data as key-value pairs
+ * @param rowIndex - The original row index for display
*
- * Opens via `window.showBulkRowDetails(result, rowData)` global function.
+ * Opens via `window.showBulkRowDetails(allRowResults, rowData, rowIndex)` global function.
*/
import Drawer from '@components/ui/Drawer.astro';
import type { RowResult } from '@lib/db';
interface Props {
- result: RowResult;
+ allRowResults: RowResult[];
rowData: Record;
+ rowIndex: number;
}
// Props are used by client-side script via window.showBulkRowDetails()
-const { result, rowData } = Astro.props;
-void result; // Mark as used for client-side hydration
+const { allRowResults, rowData, rowIndex } = Astro.props;
+void allRowResults; // Mark as used for client-side hydration
void rowData;
+void rowIndex;
---
-
+
-
-
+
+
@@ -57,60 +60,9 @@ void rowData;
-
-
-
Interpolated Prompt:
-
-
-
-
-
-
-
-
Model Output:
-
-
-
-
-
-
-
-
Error:
-
-
-
-
-
-
-
-
Execution Metadata:
-
-
-
Model
-
-
-
-
-
Row Index
-
-
-
-
-
Execution Time
-
-
-
-
-
Created At
-
-
-
-
+
+
+
@@ -125,29 +77,27 @@ void rowData;
*/
function initBulkDetailDrawer() {
/**
- * Populates the drawer with row result data and opens it.
- * @param result - RowResult with evaluation data
+ * Populates the drawer with all model results for a row and opens it.
+ * @param allRowResults - Array of RowResult for all models on this row
* @param rowData - Original CSV row data as key-value pairs
+ * @param rowIndex - The original row index for display
*/
- function showDetails(result: RowResult, rowData: Record) {
+ function showDetails(
+ allRowResults: RowResult[],
+ rowData: Record,
+ rowIndex: number
+ ) {
// Update title
const title = document.getElementById('bulk-detail-drawer-title');
if (title) {
- title.textContent = `Row ${result.original_row_index + 1} Details - ${result.model_id}`;
+ title.textContent = `Row ${rowIndex + 1} Details`;
}
- // Update status indicator
- const statusDiv = document.getElementById('bulk-detail-status');
- if (statusDiv) {
- const statusLabels = {
- completed: 'Completed',
- failed: 'Failed',
- pending: 'Pending',
- };
- statusDiv.innerHTML = `
-
- ${statusLabels[result.status] || result.status}
-
+ // Update row index header
+ const rowIndexHeader = document.getElementById('bulk-detail-row-index');
+ if (rowIndexHeader) {
+ rowIndexHeader.innerHTML = `
+ Row #${rowIndex + 1}
`;
}
@@ -166,55 +116,75 @@ void rowData;
.join('');
}
- // Update prompt
- const promptEl = document.getElementById('bulk-detail-prompt');
- if (promptEl) {
- promptEl.textContent = result.prompt_used || '-';
- }
-
- // Update output
- const outputEl = document.getElementById('bulk-detail-output');
- if (outputEl) {
- if (result.status === 'completed' && result.output_text) {
- outputEl.textContent = result.output_text;
- outputEl.classList.add('font-mono');
- outputEl.classList.remove('italic', 'text-base-content/40');
- } else if (result.status === 'failed') {
- outputEl.innerHTML =
- 'No output (failed)';
- outputEl.classList.remove('font-mono');
- } else {
- outputEl.innerHTML = 'Pending...';
- outputEl.classList.remove('font-mono');
- }
- }
-
- // Update error section
- const errorSection = document.getElementById('bulk-detail-error-section');
- const errorEl = document.getElementById('bulk-detail-error');
- if (errorSection && errorEl) {
- if (result.status === 'failed' && result.error_message) {
- errorEl.textContent = result.error_message;
- errorSection.classList.remove('hidden');
- } else {
- errorSection.classList.add('hidden');
- }
- }
-
- // Update metadata
- const modelEl = document.getElementById('bulk-detail-model');
- const rowIndexEl = document.getElementById('bulk-detail-row-index');
- const durationEl = document.getElementById('bulk-detail-duration');
- const createdEl = document.getElementById('bulk-detail-created');
-
- if (modelEl) modelEl.textContent = result.model_id;
- if (rowIndexEl) rowIndexEl.textContent = `#${result.original_row_index + 1}`;
- if (durationEl) {
- durationEl.textContent = result.duration_ms ? `${result.duration_ms}ms` : '-';
- }
- if (createdEl) {
- const date = new Date(result.created_at);
- createdEl.textContent = date.toLocaleString();
+ // Render all model outputs in vertical stack
+ const modelOutputsContainer = document.getElementById('bulk-detail-model-outputs');
+ if (modelOutputsContainer) {
+ modelOutputsContainer.innerHTML = allRowResults
+ .map((result) => {
+ const statusLabels = {
+ completed: 'Completed',
+ failed: 'Failed',
+ pending: 'Pending',
+ };
+ const statusBadge = `badge-${result.status === 'completed' ? 'success' : result.status === 'failed' ? 'error' : 'warning'}`;
+
+ return `
+