import { Button } from "@/components/ui/button"; import { useTaskRunner } from "@/hooks/useTaskRunner"; import { callMcpTool } from "@/lib/mcpTools"; import { extractToolResult } from "@/lib/toolResult"; import { useCallback, useEffect, useState } from "react"; import { EvidencePanel, StepRunner } from "./shared"; type AppProfile = { app_id: string; window_title: string; dispatch?: string; }; const DEFAULT_STEPS = `[ { "kind": "focus" }, { "kind": "wait_stable", "timeout_s": 3 }, { "kind": "screenshot", "name": "custom_capture" } ]`; export function CustomTarget() { const task = useTaskRunner(); const [profiles, setProfiles] = useState([]); const [appId, setAppId] = useState("vroidstudio"); const [windowHandle, setWindowHandle] = useState(""); const [outputDir, setOutputDir] = useState( "C:\\Users\\sandr\\AppData\\Local\\cua-mcp\\evidence", ); const [stepsJson, setStepsJson] = useState(DEFAULT_STEPS); const [parseError, setParseError] = useState(""); useEffect(() => { void (async () => { const r = await callMcpTool("automation_task", { operation: "list_profiles", }); if (!r.ok) return; const tr = extractToolResult(r.raw.result); const list = (tr.data?.profiles as AppProfile[]) ?? []; setProfiles(list); if (list.length > 0) { setAppId((prev) => list.some((p) => p.app_id === prev) ? prev : list[0].app_id, ); } })(); }, []); const parseSteps = useCallback((): object[] | null => { try { const parsed = JSON.parse(stepsJson) as unknown; if (!Array.isArray(parsed)) { setParseError("Steps must be a JSON array."); return null; } setParseError(""); return parsed as object[]; } catch (e) { setParseError(String(e)); return null; } }, [stepsJson]); const handleRun = useCallback( (steps?: object[]) => { const resolved = steps ?? parseSteps(); if (!resolved) return; const hwnd = windowHandle.trim() ? Number.parseInt(windowHandle, 10) : null; task.run({ app: appId, steps: resolved.map((s) => (s as { kind?: string }).kind === "screenshot" ? { ...s, output_dir: outputDir } : s, ), windowHandle: Number.isFinite(hwnd) ? hwnd : null, outputDir, }); }, [parseSteps, windowHandle, appId, outputDir, task], ); const selectedProfile = profiles.find((p) => p.app_id === appId); return (
setWindowHandle(e.target.value)} placeholder="123456" />
{selectedProfile && (

{selectedProfile.dispatch ?? "foreground"} · find " {selectedProfile.window_title}"

)}