Skip to main content

AI & workflows

Ai Run Log code

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

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

@props([
    'messages' => [],
    'title' => 'Run log',
    'maxHeight' => 'max-h-96',
    'embedded' => false,
])

@php
    /*
    | Scrollable conversation log for a single agent run or iteration.
    |
    | Usage:
    |   <x-ui.ai-run-log :messages="[
    |       ['role' => 'user', 'content' => 'Keep CI green.', 'time' => '09:41'],
    |       ['role' => 'assistant', 'content' => 'Running workflow tests first.', 'time' => '09:42'],
    |   ]" />
    */
    $normalizedMessages = collect($messages)
        ->map(function ($message) {
            if (! is_array($message)) {
                return [
                    'role' => 'assistant',
                    'content' => (string) $message,
                    'time' => null,
                ];
            }

            return [
                'role' => $message['role'] ?? 'assistant',
                'content' => $message['content'] ?? $message['body'] ?? '',
                'time' => $message['time'] ?? null,
            ];
        })
        ->filter(fn (array $message) => $message['content'] !== '')
        ->values()
        ->all();
@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="border-b border-gray-200 px-4 py-4 dark:border-gray-800 sm:px-5">
            <p class="text-sm font-semibold text-gray-900 dark:text-white">{{ $title }}</p>
            <p class="text-xs text-gray-500 dark:text-gray-400">{{ count($normalizedMessages) }} messages</p>
        </div>
    @endunless

    <div @class([$maxHeight, 'space-y-3 overflow-y-auto p-4 sm:p-5', 'border-t border-gray-200 dark:border-gray-800' => $embedded])>
        @forelse ($normalizedMessages as $message)
            <x-ui.ai-agent-message :role="$message['role']" :time="$message['time']">
                {{ $message['content'] }}
            </x-ui.ai-agent-message>
        @empty
            <p class="text-sm text-gray-500 dark:text-gray-400">No messages yet.</p>
        @endforelse

        {{ $slot }}
    </div>
</div>