import type { DatasetCreateResponse, SegmentationModelCapability, SegmentationQaResult, SegmentationRead, SegmentationRunRead, SegmentationRunResponse, } from '../../types' interface SegmentationLabProps { segmentationModels: SegmentationModelCapability[] loadingSegmentationModels: boolean segmentationModelError: string | null selectedSegmentationDatasetId: string selectedSegmentationModelId: string segmentationTileManifestPath: string segmentationConfidenceThreshold: number runningSegmentation: boolean segmentationRunResult: SegmentationRunResponse | null segmentationRunError: string | null segmentationRuns: SegmentationRunRead[] selectedSegmentationRunId: string segmentationItems: SegmentationRead[] segmentationClassFilter: string segmentationMinConfidenceFilter: number loadingSegmentationResults: boolean segmentationReferenceDatasetId: string segmentationQaResult: SegmentationQaResult | null segmentationQaError: string | null runningSegmentationQa: boolean selectedProjectId: string | null rasterDatasets: DatasetCreateResponse[] referenceDatasets: DatasetCreateResponse[] selectedSegmentationModelConfigured: boolean selectedSegmentationModelLimitation: string | null onLoadModels: () => void onSelectDataset: (datasetId: string) => void onSelectModel: (modelId: string) => void onSetTileManifestPath: (value: string) => void onSetConfidenceThreshold: (value: number) => void onRunSegmentation: () => void onLoadRuns: () => void onSelectRun: (runId: string) => void onSetClassFilter: (value: string) => void onSetMinConfidenceFilter: (value: number) => void onLoadResults: () => void onSelectReferenceDataset: (datasetId: string) => void onRunQa: () => void } export function SegmentationLab({ segmentationModels, loadingSegmentationModels, segmentationModelError, selectedSegmentationDatasetId, selectedSegmentationModelId, segmentationTileManifestPath, segmentationConfidenceThreshold, runningSegmentation, segmentationRunResult, segmentationRunError, segmentationRuns, selectedSegmentationRunId, segmentationItems, segmentationClassFilter, segmentationMinConfidenceFilter, loadingSegmentationResults, segmentationReferenceDatasetId, segmentationQaResult, segmentationQaError, runningSegmentationQa, selectedProjectId, rasterDatasets, referenceDatasets, selectedSegmentationModelConfigured, selectedSegmentationModelLimitation, onLoadModels, onSelectDataset, onSelectModel, onSetTileManifestPath, onSetConfidenceThreshold, onRunSegmentation, onLoadRuns, onSelectRun, onSetClassFilter, onSetMinConfidenceFilter, onLoadResults, onSelectReferenceDataset, onRunQa, }: SegmentationLabProps): JSX.Element { const segmentationHasDataset = selectedSegmentationDatasetId.length > 0 const segmentationHasTileManifest = segmentationTileManifestPath.trim().length > 0 const segmentationModelUiRunnable = selectedSegmentationModelConfigured && selectedSegmentationModelId !== 'fixture-segmenter' const segmentationRunReady = Boolean(selectedProjectId) && segmentationHasDataset && segmentationModelUiRunnable const segmentationRunBlockedReason = !selectedProjectId ? 'Select or create a project first' : !segmentationHasDataset ? 'Select a raster dataset' : selectedSegmentationModelId === 'fixture-segmenter' ? 'Fixture segmenter is explicit test/demo-only' : !selectedSegmentationModelConfigured ? selectedSegmentationModelLimitation ?? 'Selected segmentation model is not configured' : null return (

Polygon segmentation

Segmentation Lab

Model registry

Backend-reported segmenter states and limitations.

{loadingSegmentationModels ? (
Loading segmentation models.

Checking backend model registry availability.

) : null} {segmentationModelError ? (
Segmentation model registry unavailable.

{segmentationModelError}

) : null} {segmentationModels.length === 0 && !loadingSegmentationModels ? (
No segmentation models reported by backend.

Refresh models after the backend is reachable.

) : null}

Run segmentation

Run readiness

Checks the selected raster and segmenter state before submitting a segmentation job.

{segmentationRunReady ? 'Ready to submit' : 'Blocked'}
Raster dataset {segmentationHasDataset ? 'Selected' : 'Select a raster dataset'}
Model availability {selectedSegmentationModelConfigured ? 'Selected model is configured' : selectedSegmentationModelLimitation ?? 'Select a configured segmentation model'}
Tile manifest {segmentationHasTileManifest ? 'Provided for provenance' : 'Optional for the fixture segmenter'}
Run action {segmentationRunReady ? 'Ready to submit a segmentation job' : segmentationRunBlockedReason}
{rasterDatasets.length === 0 ? (
No raster datasets available for segmentation.

Upload or select a raster dataset in Data before running segmentation.

) : null}
{!selectedSegmentationModelConfigured ? (
Segmentation model is not ready.

{selectedSegmentationModelLimitation ?? 'Select a configured segmentation model'}

) : null} {segmentationRunError ? (
Segmentation run failed.

{segmentationRunError}

) : null} {segmentationRunResult ? (

Status: {segmentationRunResult.status}

Message: {segmentationRunResult.message}

Analysis run: {segmentationRunResult.analysis_run_id}

Job: {segmentationRunResult.job_id}

Segmentations: {segmentationRunResult.segmentation_count}

{segmentationRunResult.error_code ?

Code: {segmentationRunResult.error_code}

: null}
) : null}

Segmentation results

Load persisted segmentation polygons and filter by class or confidence.

{loadingSegmentationResults ? (
Loading segmentation results.

Retrieving persisted segmentation polygons for the selected run.

) : null}
Segmentations loaded: {segmentationItems.length}

{selectedSegmentationRunId ? 'Loaded from persisted segmentation records.' : 'Select a segmentation run before loading results.'}

{segmentationItems.length > 0 ? (
{segmentationItems.map((segmentation) => ( ))}
Class Confidence Area m2 Model Tile Mask path
{segmentation.class_name} {segmentation.confidence?.toFixed(2) ?? 'n/a'} {segmentation.area_m2?.toFixed(2) ?? 'n/a'} {segmentation.model_name} {segmentation.source_tile_path || (segmentation.tile_index ?? 'n/a')} {segmentation.mask_path || 'n/a'}
) : null}

Segmentation QA

{segmentationQaError ? (
Segmentation QA failed.

{segmentationQaError}

) : null} {segmentationQaResult ? (

Status: {segmentationQaResult.status}

Quality check: {segmentationQaResult.quality_check_id}

Precision: {segmentationQaResult.precision?.toFixed(3) ?? 'n/a'}

Recall: {segmentationQaResult.recall?.toFixed(3) ?? 'n/a'}

F1: {segmentationQaResult.f1_score?.toFixed(3) ?? 'n/a'}

Mean IoU: {segmentationQaResult.mean_iou?.toFixed(3) ?? 'n/a'}

False positives: {segmentationQaResult.false_positives}

False negatives: {segmentationQaResult.false_negatives}

) : null}
) }