import { useMutation, useQuery } from "@octanejs/tanstack-query"; import { Button } from "octane-kumo/components/button"; import { Badge } from "octane-kumo/components/badge"; import { useCustomerQuerySession } from "../runtime/customer-query-provider"; import type { ConversationSession } from "../runtime/conversation-session"; export function CapabilityApprovals({ session, connected, }: { session: ConversationSession; connected: boolean; }) { const cache = useCustomerQuerySession(); const queryKey = cache.key("conversation", session.id, "approvals"); const query = useQuery({ queryKey, queryFn: ({ signal }) => session.listCapabilityApprovals(signal), enabled: !!cache.getSnapshot().scope && connected, staleTime: 0, gcTime: 0, refetchInterval: 2000, }); const mutation = useMutation({ mutationFn: (decision: { executionId: string; decision: "approve" | "deny"; }) => session.decideCapabilityApproval(decision), onSettled: () => cache.client.invalidateQueries({ queryKey }), }); const pending = query.data ?? []; if (!pending.length && !query.isError && !mutation.isError) return null; return (
{query.isError && (

Could not load pending approvals. Reconnect or reload approvals to check their current status.

)} {mutation.isError && (

Could not confirm the decision. Reload approvals to check whether the action is still waiting.

)} {(query.isError || mutation.isError) && ( )} {pending.map((request) => (

Approval required

Waiting for you

{request.summary}

Arguments to send
{JSON.stringify(request.arguments, null, 2)}

Approving permits this action once. Future actions follow your approval settings.

{!connected && (

Reconnect to approve or deny this action.

)}
{mutation.isPending && mutation.variables?.executionId === request.executionId && (

Applying your decision…

)}
))}
); }