+ {/* Dataset picker */}
+
+
+
+ Select Dataset
+
+ {datasetsLoading ? (
+
+
+ Loading datasets…
+
+ ) : datasets.length === 0 ? (
+
No local datasets found.
+ ) : (
+
+ )}
+ {selectedDataset && (
+
{selectedDataset}
+ )}
+
+
+ {/* Episode list */}
+ {selectedDataset && (
+
+
+
+
+ Episodes to Delete
+ {selectedEpisodes.size > 0 && (
+
+ {selectedEpisodes.size} selected
+
+ )}
+
+
+
+
+
+
+
+
+ {episodesLoading ? (
+
+
+ Loading episodes…
+
+ ) : episodes.length === 0 ? (
+
No episodes found.
+ ) : (
+
+ {episodes.map((ep) => (
+ toggleEpisode(ep.episode_index)}
+ onPlay={() => setReplayEpisodeIndex(ep.episode_index)}
+ />
+ ))}
+
+ )}
+
+ {selectedEpisodes.size > 0 && (
+
+
+ {selectedEpisodes.size} episode(s) will be permanently
+ deleted before recording starts.
+
+ )}
+
+ )}
+
+ {/* Robot selection */}
+
+
Robot
+ {robotsLoading ? (
+
+
+ Loading robots…
+
+ ) : availableNames.length === 0 ? (
+
+ No robots configured. Set one up on the Landing page first.
+
+ ) : (
+
+ )}
+ {selectedRecord && !selectedRecord.is_clean && (
+
+ This robot needs calibration before recording.
+
+ )}
+
+
+ {/* Recording parameters */}
+
+
Recording Parameters
+
+
+
+ setSingleTask(e.target.value)}
+ placeholder="e.g., pick and place the rubber object"
+ className="bg-gray-800 border-gray-700 text-white"
+ />
+
+
+
+
+
0 ? selectedEpisodes.size : 1}
+ value={numNewEpisodes}
+ onChange={(v) => {
+ if (v !== undefined) setNumNewEpisodes(v);
+ }}
+ className="bg-gray-800 border-gray-700 text-white"
+ />
+ {selectedEpisodes.size > 0 && numNewEpisodes < selectedEpisodes.size && (
+
+ Will record {selectedEpisodes.size} episodes to replace the
+ deleted ones.
+
+ )}
+
+
+
+
+
+ {
+ if (v !== undefined) setEpisodeTimeS(v);
+ }}
+ className="bg-gray-800 border-gray-700 text-white"
+ />
+
+
+
+ {
+ if (v !== undefined) setResetTimeS(v);
+ }}
+ className="bg-gray-800 border-gray-700 text-white"
+ />
+
+
+
+
+ {/* Cameras */}
+
+
+
+ Cameras are taken from the selected robot profile.
+
+
+
+ {/* Action */}
+
+
+ {selectedEpisodes.size > 0 ? (
+
+ Will delete{" "}
+
+ {selectedEpisodes.size}
+ {" "}
+ episode(s), then record{" "}
+
+ {Math.max(selectedEpisodes.size, numNewEpisodes)}
+ {" "}
+ new episode(s).
+
+ ) : (
+
+ Will append{" "}
+
+ {numNewEpisodes}
+ {" "}
+ new episode(s) to the selected dataset.
+
+ )}
+
+
+ {!selectedRecord && (
+
+ Select a configured robot to enable recording.
+
+ )}
+ {!selectedDataset && (
+
+ Select a dataset to start.
+
+ )}
+
+