"use client" import { useEffect, useRef, useState } from "react" import { Button } from "@/components/ui/button" import { humanArtifactError, humanArtifactReceipt } from "@/shared/api/mcp-artifact" import type { McpApi } from "@/shared/api/mcp" function ArtifactDownload({ api, receipt }: { api: McpApi; receipt: unknown }) { const [busy, setBusy] = useState(false), [error, setError] = useState(""), [saved, setSaved] = useState(false) const controller = useRef(null) useEffect(() => () => controller.current?.abort(), []) const download = async () => { if (controller.current) return const request = new AbortController() controller.current = request setBusy(true); setError(""); setSaved(false) try { await api.downloadArtifact(receipt, request.signal); if (!request.signal.aborted) setSaved(true) } catch (failure) { if (!request.signal.aborted) setError(humanArtifactError(failure)) } finally { if (!request.signal.aborted) setBusy(false); controller.current = null } } return
{error &&

{error}

}

{busy ? "Получаем файл с проверкой доступа…" : saved ? "Файл передан браузеру для сохранения." : "Файл доступен владельцу через авторизацию портала. Срок хранения ограничен."}

} export function ArtifactDownloads({ api, operation }: { api: McpApi; operation: Record }) { if (operation.state !== "applied" || !Array.isArray(operation.artifactReceipts)) return null const receipts = [...new Map(operation.artifactReceipts.flatMap(value => { const receipt = humanArtifactReceipt(value) return receipt ? [[receipt.artifactId, value] as const] : [] })).entries()] if (!receipts.length) return null return

Файлы операции

{receipts.map(([id, receipt]) => )}
}