"use client"; import * as React from "react"; import { useParams } from "next/navigation"; import { ExternalLink, ImageOff, Loader2 } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { api } from "@/lib/trpc"; export default function ArtifactsPage() { const params = useParams(); const workspaceSlug = typeof params?.workspaceSlug === "string" ? params.workspaceSlug : undefined; const [selectedId, setSelectedId] = React.useState(null); const artifactsQuery = api.convoys.listArtifacts.useQuery( { workspace: workspaceSlug! }, { enabled: Boolean(workspaceSlug) }, ); const artifacts = artifactsQuery.data ?? []; const selected = artifacts.find((a) => a.id === selectedId) ?? null; if (!workspaceSlug) return null; return (

Completion artifacts

Gallery of released convoys — summary + PR link + timeline

{artifactsQuery.isLoading ? (
Loading artifacts…
) : artifacts.length === 0 ? (

No completion artifacts yet

Complete a convoy from merged or published via human-gate-3 to generate one.

Screenshot upload placeholder — shows when no image is attached
) : (
{artifacts.map((artifact) => { const isSelected = artifact.id === selectedId; return ( ); })}
)}
); }