import { t } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { ChatMarkdown } from "@rakazo/chat-ui/web"; import type { ThreadMessage } from "@rakazo/contracts"; import { isApprovalAskBlock, isSecretAskBlock, selectedAskActionLabel } from "@rakazo/core"; import { Button, Input } from "@rakazo/ui-web"; import { useState } from "react"; export type AskBlock = Extract; function formatAnsweredState( answer: string | undefined, approval: boolean, secret: boolean, outcome?: "created" | "cancelled", actions?: AskBlock["actions"], ): string { if (secret) return t`Saved`; if (!answer) return t`Answered`; if (!approval) return t`Answered: ${selectedAskActionLabel(answer, actions)}`; if (outcome === "created") return t`Created`; if (outcome === "cancelled") return t`Cancelled`; if (answer === "allow") return t`Allowed once`; if (answer === "always") return t`Always allowed`; if (answer === "deny") return t`Denied`; return t`Answered: ${answer}`; } function approvalActionLabel( id: string, fallback: string, outcome?: "created" | "cancelled", ): string { if (outcome === "created") return t`Create space`; if (outcome === "cancelled") return t`Cancel`; if (id === "allow") return t`Allow once`; if (id === "always") return t`Always allow this tool`; if (id === "deny") return t`Deny`; return fallback; } function secretFieldLabel(purpose: AskBlock["purpose"]): string { if (purpose === "password") return t`Password`; if (purpose === "api_key") return t`API key`; return t`Code`; } export function AskCard({ block, canAnswer, onAnswer, }: { block: AskBlock; canAnswer: boolean; onAnswer: (text: string) => Promise; }) { const { t } = useLingui(); const [editing, setEditing] = useState(false); const [answer, setAnswer] = useState(""); const [pendingAction, setPendingAction] = useState(null); const [error, setError] = useState(null); const submitting = pendingAction !== null; const approvalActions = isApprovalAskBlock(block) ? block.actions : undefined; const askActions = block.actions; const secretInput = isSecretAskBlock(block); const secretLabel = secretFieldLabel(block.purpose); async function submitAnswer(value: string) { if (submitting) return; if (secretInput ? value.length === 0 : !value.trim()) return; const submitValue = secretInput ? value : value.trim(); setPendingAction(secretInput ? "submit" : submitValue); setError(null); if (secretInput) setAnswer(""); try { await onAnswer(submitValue); } catch (err) { setError( !secretInput && err instanceof Error ? err.message : t`Could not submit this answer`, ); } finally { setPendingAction(null); } } return (
{block.text}
{secretInput && block.credential ? (
{block.credential.origin}
) : null} {block.detail && !secretInput ? (
          {block.detail}
        
) : null} {block.status === "answered" ? (
{formatAnsweredState( block.answer, Boolean(approvalActions), secretInput, approvalActions?.find((action) => action.id === block.answer)?.outcome, askActions, )}
) : !canAnswer ? (
No longer active
) : askActions?.length ? (
{askActions.map((action) => ( ))}
) : secretInput ? (
{ event.preventDefault(); void submitAnswer(answer); }} > setAnswer(event.target.value)} placeholder={secretLabel} />
) : editing ? (
{ event.preventDefault(); void submitAnswer(answer); }} > setAnswer(event.target.value)} placeholder={t`Type your answer`} />
) : (
)} {error ?

{error}

: null}
); }