import { ElevationProvider } from "@/components/ui/elevation"
import { FileCodeIcon, PlayIcon, PlusIcon } from "@lucide/vue";
import { computed, ref } from "vue";
} from "@/components/ai/code-block";
ConversationScrollButton,
} from "@/components/ai/conversation";
import { FileTree, FileTreeFile, FileTreeFolder } from "@/components/ai/file-tree";
import { Message, MessageContent, MessageResponse } from "@/components/ai/message";
} from "@/components/ai/plan";
} from "@/components/ai/prompt-input";
import { PromptInputAgent } from "@/components/ai/prompt-input-agent";
} from "@/components/ai/queue";
} from "@/components/ai/terminal";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
const selected = ref(initialPath);
const expanded = ref(new Set(expandedFolders));
const output = ref(terminalOutput);
const file = computed(() => files[selected.value] ?? files[initialPath]);
<ElevationProvider mode="layered">
<div class="flex min-h-svh flex-col gap-2 bg-background p-2 text-foreground lg:h-svh">
<header class="flex h-10 shrink-0 items-center justify-between gap-2 px-2">
<div class="flex items-center gap-2 text-sm font-medium">
<Badge variant="secondary" shape="pill">main</Badge>
<Button size="sm" variant="outline">
<PlayIcon class="size-3.5" />
<div class="grid min-h-0 flex-1 gap-2 lg:grid-cols-[220px_minmax(0,1fr)_380px]">
<aside class="rounded-xl border border-border bg-card p-2">
<FileTree v-model:expanded="expanded" :selected-path="selected" @select="selected = $event">
<FileTreeFolder name="src" path="src">
<FileTreeFolder name="lib" path="src/lib">
<FileTreeFile name="keeper.ts" path="src/lib/keeper.ts" />
<FileTreeFile name="drift.ts" path="src/lib/drift.ts" />
<FileTreeFile name="app.tsx" path="src/app.tsx" />
<FileTreeFolder name="tests" path="tests">
<FileTreeFile name="keeper.test.ts" path="tests/keeper.test.ts" />
<FileTreeFile name="package.json" path="package.json" />
<section class="flex min-h-0 min-w-0 flex-col gap-2">
<div class="min-h-0 flex-1 overflow-auto">
<CodeBlock :code="file.code" :language="file.language" show-line-numbers>
<FileCodeIcon class="size-3.5" />
<CodeBlockFilename>{{ file.name }}</CodeBlockFilename>
<Terminal class="shrink-0" :output="output" @clear="output = ''">
<div class="flex items-center">
<TerminalContent class="max-h-40" />
<aside class="flex h-[34rem] min-h-0 flex-col gap-2 rounded-xl border border-border bg-card p-2 lg:h-auto">
<Conversation class="min-h-0">
<ConversationContent class="gap-5 p-2">
<ConversationItem message-id="u1">
<MessageContent>{{ request }}</MessageContent>
<ConversationItem message-id="a1">
<Message from="assistant">
<MessageContent class="gap-3">
<MessageResponse :content="reply" />
<Plan default-open class="w-full">
<PlanTitle>{{ plan.title }}</PlanTitle>
<PlanDescription>{{ plan.description }}</PlanDescription>
<p v-for="s in plan.steps" :key="s">{{ s }}</p>
<Button size="sm">Start</Button>
<Button size="sm" variant="ghost">Edit plan</Button>
<QueueSectionLabel label="Queued" :count="queue.queued.length" />
<QueueItem v-for="t in queue.queued" :key="t.id">
<div class="flex items-start gap-2">
<QueueItemContent>{{ t.title }}</QueueItemContent>
<QueueSection :default-open="false">
<QueueSectionLabel label="Completed" :count="queue.completed.length" />
<QueueItem v-for="t in queue.completed" :key="t.id">
<div class="flex items-start gap-2">
<QueueItemIndicator completed />
<QueueItemContent completed>{{ t.title }}</QueueItemContent>
<ConversationScrollButton />
<PromptInputAgent :agent="agent" />
<PromptInputTextarea :placeholder="`Ask ${agent.name} to change the code…`" class="min-h-16" />
<Button aria-label="Attach" size="icon-sm" type="button" variant="ghost">
<PlusIcon class="size-4" />
<PromptInputSubmit class="size-10" size="icon-sm" variant="secondary" />