e.stopPropagation()}>
+
+
Launch Run
+ Close
+
+
+
+
+ Spec File Path (daemon host)
+ setFilePath(e.target.value)}
+ placeholder="/tmp/run.yaml"
+ />
+
+
+ Run ID (optional)
+ setRunId(e.target.value)}
+ placeholder="ui-demo-1"
+ />
+
+
+
+
+ fileRef.current?.click()}>
+ Upload YAML/JSON
+
+ {uploadedName && {uploadedName} }
+ void onPickFile(e.target.files?.[0])}
+ />
+
+
+
+ Spec Content (optional, for validation/review)
+
+
+ {validationErrors.length > 0 && (
+
+ {validationErrors.map((err) =>
- {err}
)}
+
+ )}
+
+ {submitError &&
- {submitError}
}
+
+
+ If spec content is provided, it is uploaded through the void-control bridge and launched automatically.
+ If spec content is empty, launch falls back to file-path mode (path must exist on daemon host).
+
+
+
+ Cancel
+ void submit()} disabled={isSubmitting || !filePath.trim() || validationErrors.length > 0}>
+ {isSubmitting ? 'Launching...' : 'Launch'}
+
+
+