Skip to main content

AI & workflows

Ai Loop Shell code

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

resources/views/components/ui/ai-loop-shell.blade.php

@props([
    'title' => 'Agent loops',
    'description' => null,
    'layout' => 'default',
])

@php
    /*
    | Page layout for AI agent loop workflows. Compose loop list, goal tracker,
    | activity feed, approvals, summaries and the prompt composer.
    |
    | layout:
    |   default   — classic stacked layout for the component showcase
    |   workspace — context + secondary panels in the sidebar; expandable
    |               main panels via `panels` and `sidebarStack` slots
    |
    | Slots:
    |   sidebar       — loop list or secondary navigation
    |   sidebarStack  — expandable panels below the loop list (workspace)
    |   context       — project / branch selectors
    |   panels        — expandable main-column panels (workspace)
    |   goal          — goal tracker
    |   history       — cross-iteration timeline (default layout)
    |   activity      — iteration activity feed (default layout)
    |   summary       — run summary cards (default layout)
    |   changeSet     — files changed this run (default layout)
    |   runLog        — scrollable conversation log (default layout)
    |   approvals     — pending approval requests (default layout)
    |   prompter      — prompt composer
    */
    $hasSidebar = isset($sidebar);
    $isWorkspace = $layout === 'workspace';
@endphp

<div {{ $attributes->merge(['class' => 'mx-auto w-full min-w-0 max-w-7xl space-y-6']) }}>
    <div class="grid gap-6 lg:grid-cols-12 lg:items-start">
        <header class="space-y-2 lg:col-span-12">
            <h1 class="text-xl font-semibold tracking-tight text-gray-900 sm:text-2xl dark:text-white">{{ $title }}</h1>
            @if ($description)
                <p class="max-w-3xl text-sm leading-6 text-gray-600 dark:text-gray-400">{{ $description }}</p>
            @endif
        </header>

        @if ($hasSidebar)
            <aside class="min-w-0 space-y-4 lg:sticky lg:top-24 lg:col-span-4 xl:col-span-3">
                @if ($isWorkspace && isset($context))
                    <section class="min-w-0 w-full">{{ $context }}</section>
                @endif

                {{ $sidebar }}

                @if ($isWorkspace && isset($sidebarStack))
                    <div class="space-y-3">
                        {{ $sidebarStack }}
                    </div>
                @endif
            </aside>
        @endif

        <div @class([
            'min-w-0 space-y-4',
            'lg:col-span-8 xl:col-span-9' => $hasSidebar,
            'lg:col-span-12' => ! $hasSidebar,
        ])>
            @if (! $isWorkspace && isset($context))
                <section class="min-w-0 w-full">{{ $context }}</section>
            @endif

            @if ($isWorkspace)
                @isset($goal)
                    <section class="min-w-0 w-full">{{ $goal }}</section>
                @endisset

                @isset($panels)
                    <div class="space-y-3">
                        {{ $panels }}
                    </div>
                @endisset

                @isset($prompter)
                    <section class="min-w-0 w-full">{{ $prompter }}</section>
                @endisset
            @else
                @isset($approvals)
                    <section class="min-w-0 w-full">{{ $approvals }}</section>
                @endisset

                @isset($goal)
                    <section class="min-w-0 w-full">{{ $goal }}</section>
                @endisset

                @isset($history)
                    <section class="min-w-0 w-full">{{ $history }}</section>
                @endisset

                @if (isset($activity) || isset($summary))
                    <div class="grid min-w-0 gap-6 lg:grid-cols-2">
                        @isset($activity)
                            <section class="min-w-0 w-full">{{ $activity }}</section>
                        @endisset

                        @isset($summary)
                            <section class="min-w-0 w-full">{{ $summary }}</section>
                        @endisset
                    </div>
                @endif

                @if (isset($changeSet) || isset($runLog))
                    <div class="grid min-w-0 gap-6 lg:grid-cols-2">
                        @isset($changeSet)
                            <section class="min-w-0 w-full">{{ $changeSet }}</section>
                        @endisset

                        @isset($runLog)
                            <section class="min-w-0 w-full">{{ $runLog }}</section>
                        @endisset
                    </div>
                @endif

                @isset($prompter)
                    <section class="min-w-0 w-full">{{ $prompter }}</section>
                @endisset
            @endif

            @if (trim($slot) !== '')
                <div class="min-w-0 w-full">{{ $slot }}</div>
            @endif
        </div>
    </div>
</div>