Skip to main content

AI & workflows

Ai Run Summary code

Copy the implementation or inspect every file that belongs to this component unit.

resources/views/components/ui/ai-run-summary.blade.php

@props([
    'iteration' => 1,
    'status' => 'complete',
    'duration' => null,
    'filesChanged' => 0,
    'testsPassed' => null,
    'testsFailed' => null,
    'message' => null,
    'embedded' => false,
    'compact' => false,
])

@php
    /*
    | End-of-iteration summary for agent loops.
    |
    | status: complete, failed, partial
    |
    | Usage:
    |   <x-ui.ai-run-summary
    |       :iteration="4"
    |       duration="3m 12s"
    |       :files-changed="3"
    |       :tests-passed="28"
    |       :tests-failed="0"
    |   />
    */
    $statusStyles = [
        'complete' => ['label' => 'Completed', 'variant' => 'green'],
        'failed' => ['label' => 'Failed', 'variant' => 'red'],
        'partial' => ['label' => 'Partial', 'variant' => 'amber'],
    ];

    $current = $statusStyles[$status] ?? $statusStyles['complete'];
@endphp

<div {{ $attributes->merge(['class' => $embedded ? 'min-w-0' : 'min-w-0 overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-sm dark:border-gray-800 dark:bg-gray-900']) }}>
    @unless ($embedded)
        <div class="flex flex-col gap-3 border-b border-gray-200 px-4 py-4 dark:border-gray-800 sm:flex-row sm:items-center sm:justify-between sm:px-5">
            <div class="min-w-0">
                <p class="text-sm font-semibold text-gray-900 dark:text-white">Run summary</p>
                <p class="text-xs text-gray-500 dark:text-gray-400">Iteration {{ $iteration }}@if ($duration)<span class="mx-1.5 text-gray-300 dark:text-gray-600">·</span>{{ $duration }}@endif</p>
            </div>
            <x-ui.badge :variant="$current['variant']" class="self-start shrink-0">{{ $current['label'] }}</x-ui.badge>
        </div>
    @endunless

    <dl @class([
        'grid gap-3 px-4 py-4 sm:px-5',
        'grid-cols-1' => $compact,
        'grid-cols-2 sm:grid-cols-3' => ! $compact,
        'border-t border-gray-200 dark:border-gray-800' => $embedded,
    ])>
        <div class="rounded-xl border border-gray-200 bg-gray-50 px-3 py-2.5 dark:border-gray-800 dark:bg-gray-950">
            <dt class="text-xs text-gray-500 dark:text-gray-400">Files changed</dt>
            <dd class="mt-1 text-lg font-semibold tabular-nums text-gray-900 dark:text-white">{{ $filesChanged }}</dd>
        </div>

        @if ($testsPassed !== null)
            <div class="rounded-xl border border-gray-200 bg-gray-50 px-3 py-2.5 dark:border-gray-800 dark:bg-gray-950">
                <dt class="text-xs text-gray-500 dark:text-gray-400">Tests passed</dt>
                <dd class="mt-1 text-lg font-semibold tabular-nums text-gray-900 dark:text-white">{{ $testsPassed }}</dd>
            </div>
        @endif

        @if ($testsFailed !== null)
            <div class="rounded-xl border border-gray-200 bg-gray-50 px-3 py-2.5 dark:border-gray-800 dark:bg-gray-950">
                <dt class="text-xs text-gray-500 dark:text-gray-400">Tests failed</dt>
                <dd class="mt-1 text-lg font-semibold tabular-nums text-gray-900 dark:text-white">{{ $testsFailed }}</dd>
            </div>
        @endif
    </dl>

    @if ($message)
        <div class="border-t border-gray-200 px-4 py-3 text-sm text-gray-600 dark:border-gray-800 dark:text-gray-400 sm:px-5">{{ $message }}</div>
    @endif

    @if (trim($slot) !== '')
        <div class="border-t border-gray-200 px-4 py-3 dark:border-gray-800 sm:px-5">{{ $slot }}</div>
    @endif
</div>