From 7e993de9433a592a6bc12716841735b628ac2e12 Mon Sep 17 00:00:00 2001 From: "soroush.asadi" Date: Wed, 10 Jun 2026 08:53:43 +0330 Subject: [PATCH] =?UTF-8?q?M5=20UI:=20the=20review=20inbox=20=E2=80=94=20a?= =?UTF-8?q?pprove=20/=20edit-and-approve=20/=20send=20back?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The trust centerpiece: /reviews lists held agent actions for the scopes the caller may approve. Each card shows the agent badge, action kind + risk (destructive flagged red), an EDITABLE proposed artifact and child-task list (edits feed the edit-distance metric), an expandable reasoning trace (pretty-printed), and Approve / Send back. Toasts surface the recorded edit distance. New shadcn-style Textarea; nav gains "Review inbox". Verified: npm run build green (TS strict, 1893 modules). Co-Authored-By: Claude Opus 4.8 --- client/src/App.tsx | 2 + client/src/components/AppShell.tsx | 3 +- client/src/components/ui/textarea.tsx | 18 +++ client/src/pages/ReviewsPage.tsx | 202 ++++++++++++++++++++++++++ 4 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 client/src/components/ui/textarea.tsx create mode 100644 client/src/pages/ReviewsPage.tsx diff --git a/client/src/App.tsx b/client/src/App.tsx index 0f26b6b..3630ea6 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -2,6 +2,7 @@ import { Navigate, Route, Routes } from 'react-router' import { Toaster } from '@/components/ui/sonner' import { BoardPage } from '@/pages/BoardPage' import { LoginPage } from '@/pages/LoginPage' +import { ReviewsPage } from '@/pages/ReviewsPage' import { SeatsPage } from '@/pages/SeatsPage' import { useAuth } from '@/store/auth' @@ -14,6 +15,7 @@ export default function App() { : } /> : } /> : } /> + : } /> } /> diff --git a/client/src/components/AppShell.tsx b/client/src/components/AppShell.tsx index d50714c..422074d 100644 --- a/client/src/components/AppShell.tsx +++ b/client/src/components/AppShell.tsx @@ -1,6 +1,6 @@ import type { ReactNode } from 'react' import { Link, useLocation } from 'react-router' -import { Bot, Inbox, type LucideIcon, LayoutDashboard, LogOut, Network } from 'lucide-react' +import { Bot, Inbox, type LucideIcon, LayoutDashboard, LogOut, Network, ShieldCheck } from 'lucide-react' import { Button } from '@/components/ui/button' import { Separator } from '@/components/ui/separator' import { cn } from '@/lib/utils' @@ -28,6 +28,7 @@ export function AppShell({ children }: { children: ReactNode }) { diff --git a/client/src/components/ui/textarea.tsx b/client/src/components/ui/textarea.tsx new file mode 100644 index 0000000..a05ed13 --- /dev/null +++ b/client/src/components/ui/textarea.tsx @@ -0,0 +1,18 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Textarea({ className, ...props }: React.ComponentProps<"textarea">) { + return ( +