/** * Execute Dialog - Prompts for study name before executing canvas intent */ import { useState } from 'react'; interface ExecuteDialogProps { isOpen: boolean; onClose: () => void; onExecute: (studyName: string, autoRun: boolean) => void; isExecuting: boolean; } export function ExecuteDialog({ isOpen, onClose, onExecute, isExecuting, }: ExecuteDialogProps) { const [studyName, setStudyName] = useState(''); const [autoRun, setAutoRun] = useState(false); const [error, setError] = useState(null); if (!isOpen) return null; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // Validate study name const trimmed = studyName.trim(); if (!trimmed) { setError('Study name is required'); return; } // Check for valid snake_case if (!/^[a-z][a-z0-9_]*$/.test(trimmed)) { setError('Study name must be snake_case (lowercase letters, numbers, underscores)'); return; } setError(null); onExecute(trimmed, autoRun); }; const handleClose = () => { setStudyName(''); setAutoRun(false); setError(null); onClose(); }; return (

Execute with Claude

setStudyName(e.target.value.toLowerCase().replace(/\s+/g, '_'))} placeholder="my_optimization_study" className="w-full px-3 py-2 bg-dark-800 border border-dark-600 text-white placeholder-dark-400 rounded-lg font-mono focus:ring-2 focus:ring-primary-500 focus:border-primary-500 focus:outline-none transition-colors" disabled={isExecuting} autoFocus /> {error && (

{error}

)}

Use snake_case (e.g., bracket_mass_v1, mirror_wfe_optimization)

); }