"use client"; import { makeAssistantToolUI } from "@assistant-ui/react"; import { AlertTriangleIcon, CheckIcon, Loader2Icon, XIcon } from "lucide-react"; import { useState } from "react"; import { Button } from "@/components/ui/button"; interface InterruptResult { __interrupt__: true; __decided__?: "approve" | "reject"; action_requests: Array<{ name: string; args: Record; description?: string; }>; review_configs: Array<{ action_name: string; allowed_decisions: Array<"approve" | "reject">; }>; } interface SuccessResult { status: "success"; page_id: string; message?: string; } interface ErrorResult { status: "error"; message: string; } type DeleteNotionPageResult = InterruptResult | SuccessResult | ErrorResult; function isInterruptResult(result: unknown): result is InterruptResult { return ( typeof result === "object" && result !== null && "__interrupt__" in result && (result as InterruptResult).__interrupt__ === true ); } function isErrorResult(result: unknown): result is ErrorResult { return ( typeof result === "object" && result !== null && "status" in result && (result as ErrorResult).status === "error" ); } function ApprovalCard({ args, interruptData, onDecision, }: { args: Record; interruptData: InterruptResult; onDecision: (decision: { type: "approve" | "reject"; message?: string }) => void; }) { const [decided, setDecided] = useState<"approve" | "reject" | null>( interruptData.__decided__ ?? null ); return (

Delete Notion Page

Requires your approval to proceed

{args.page_id != null && (

Page ID

{String(args.page_id)}

)}
{decided ? (

{decided === "approve" ? ( <> Approved ) : ( <> Rejected )}

) : ( <> )}
); } function ErrorCard({ result }: { result: ErrorResult }) { return (

Failed to delete Notion page

{result.message}

); } function SuccessCard({ result }: { result: SuccessResult }) { return (

{result.message || "Notion page deleted successfully"}

Page ID: {result.page_id}
); } export const DeleteNotionPageToolUI = makeAssistantToolUI< { page_id: string }, DeleteNotionPageResult >({ toolName: "delete_notion_page", render: function DeleteNotionPageUI({ args, result, status }) { if (status.type === "running") { return (

Deleting Notion page...

); } if (!result) { return null; } if (isInterruptResult(result)) { return ( { const event = new CustomEvent("hitl-decision", { detail: { decisions: [decision] }, }); window.dispatchEvent(event); }} /> ); } if (isErrorResult(result)) { return ; } return ; }, });