{
  "format": "geolibre-language-pack",
  "formatVersion": 1,
  "scope": "whitebox",
  "locale": "en",
  "name": "English Whitebox translator template",
  "updatedAt": "2026-08-22T00:00:00.000Z",
  "translations": {
    "processing": {
      "toolMeta": {
        "whitebox": {
          "build_object_hierarchy_multiscale": {
            "name": "Build Object Hierarchy Multiscale",
            "params": {
              "coarse_segments": {
                "label": "Coarse Segments",
                "description": "Coarse segment raster."
              },
              "fine_segments": {
                "label": "Fine Segments",
                "description": "Fine segment raster."
              },
              "output": {
                "label": "Output",
                "description": "Output hierarchy CSV path."
              }
            }
          },
          "classify_objects_ensemble_pro": {
            "name": "Classify Objects Ensemble Pro",
            "params": {
              "features": {
                "label": "Features",
                "description": "Input object-features CSV (must include segment_id and numeric feature columns)."
              },
              "training": {
                "label": "Training",
                "description": "Training CSV with segment_id and class label columns."
              },
              "segment_id_field": {
                "label": "Segment Id Field",
                "description": "Segment ID field name (default segment_id)."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class label field in training CSV (default class)."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees (default 200)."
              },
              "output": {
                "label": "Output",
                "description": "Output predictions CSV path."
              }
            }
          },
          "classify_objects_random_forest": {
            "name": "Classify Objects Random Forest",
            "params": {
              "features": {
                "label": "Features",
                "description": "Input object-features CSV (must include segment_id and numeric feature columns)."
              },
              "training": {
                "label": "Training",
                "description": "Training CSV with segment_id and class label columns."
              },
              "segment_id_field": {
                "label": "Segment Id Field",
                "description": "Segment ID field name (default segment_id)."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class label field in training CSV (default class)."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees (default 200)."
              },
              "output": {
                "label": "Output",
                "description": "Output predictions CSV path."
              }
            }
          },
          "classify_objects_rules_basic": {
            "name": "Classify Objects Rules Basic",
            "params": {
              "features": {
                "label": "Features",
                "description": "Input object-features CSV."
              },
              "rules": {
                "label": "Rules",
                "description": "Rules CSV with columns: feature, op, value, class, [priority]."
              },
              "default_class": {
                "label": "Default Class",
                "description": "Fallback class when no rules match."
              },
              "output": {
                "label": "Output",
                "description": "Output predictions CSV path."
              }
            }
          },
          "classify_objects_rules_hierarchical": {
            "name": "Classify Objects Rules Hierarchical",
            "params": {
              "features": {
                "label": "Features",
                "description": "Input object-features CSV."
              },
              "rules": {
                "label": "Rules",
                "description": "Rules CSV with columns: feature, op, value, class, [priority]."
              },
              "default_class": {
                "label": "Default Class",
                "description": "Fallback class when no rules match."
              },
              "output": {
                "label": "Output",
                "description": "Output predictions CSV path."
              }
            }
          },
          "classify_objects_svm": {
            "name": "Classify Objects Svm",
            "params": {
              "features": {
                "label": "Features",
                "description": "Input object-features CSV (must include segment_id and numeric feature columns)."
              },
              "training": {
                "label": "Training",
                "description": "Training CSV with segment_id and class label columns."
              },
              "segment_id_field": {
                "label": "Segment Id Field",
                "description": "Segment ID field name (default segment_id)."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class label field in training CSV (default class)."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees (default 200)."
              },
              "output": {
                "label": "Output",
                "description": "Output predictions CSV path."
              }
            }
          },
          "evaluate_object_classification_accuracy": {
            "name": "Evaluate Object Classification Accuracy",
            "params": {
              "predictions": {
                "label": "Predictions",
                "description": "Predictions CSV containing segment_id and predicted_class."
              },
              "reference": {
                "label": "Reference",
                "description": "Reference CSV containing segment_id and class."
              },
              "segment_id_field": {
                "label": "Segment Id Field",
                "description": "Segment ID field name (default segment_id)."
              },
              "predicted_field": {
                "label": "Predicted Field",
                "description": "Predicted class field (default predicted_class)."
              },
              "reference_field": {
                "label": "Reference Field",
                "description": "Reference class field (default class)."
              },
              "output": {
                "label": "Output",
                "description": "Output JSON report path."
              }
            }
          },
          "evaluate_segmentation_quality_pro": {
            "name": "Evaluate Segmentation Quality Pro",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "reference": {
                "label": "Reference",
                "description": "Optional reference label raster for overlap-based diagnostics."
              },
              "output": {
                "label": "Output",
                "description": "Output JSON report path."
              }
            }
          },
          "image_segmentation": {
            "name": "Image Segmentation",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters (one per band)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Distance threshold for region growing in standardized feature space (default 0.5)."
              },
              "steps": {
                "label": "Steps",
                "description": "Number of seed-priority bands (default 10)."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Optional minimum region area for post-merge cleanup (default 4)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "image_slider": {
            "name": "Image Slider",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Left image raster path or typed raster object."
              },
              "input2": {
                "label": "Input2",
                "description": "Right image raster path or typed raster object."
              },
              "label1": {
                "label": "Label1",
                "description": "Optional label shown for left image."
              },
              "left_palette": {
                "label": "Left Palette",
                "description": "Palette for left non-RGB image (default grey)."
              },
              "left_reverse_palette": {
                "label": "Left Reverse Palette",
                "description": "Reverse the left palette."
              },
              "label2": {
                "label": "Label2",
                "description": "Optional label shown for right image."
              },
              "right_palette": {
                "label": "Right Palette",
                "description": "Palette for right non-RGB image (default grey)."
              },
              "right_reverse_palette": {
                "label": "Right Reverse Palette",
                "description": "Reverse the right palette."
              },
              "height": {
                "label": "Height",
                "description": "Display height in pixels (default 600)."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML path."
              }
            }
          },
          "image_stack_profile": {
            "name": "Image Stack Profile",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster list as an array of paths or comma/semicolon-delimited string."
              },
              "points": {
                "label": "Points",
                "description": "Point vector path (or typed vector object) containing sample locations."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report output path."
              }
            }
          },
          "obia_audit_report_pro": {
            "name": "Obia Audit Report Pro",
            "params": {
              "artifacts": {
                "label": "Artifacts",
                "description": "Array of artifact paths to audit."
              },
              "output": {
                "label": "Output",
                "description": "Output audit report JSON path."
              }
            }
          },
          "obia_batch_orchestrator_pro": {
            "name": "Obia Batch Orchestrator Pro",
            "params": {
              "jobs": {
                "label": "Jobs",
                "description": "Array of job objects with inputs, training, output_prefix, and optional segment_method."
              },
              "output": {
                "label": "Output",
                "description": "Optional output JSON report path."
              }
            }
          },
          "obia_pipeline_basic": {
            "name": "Obia Pipeline Basic",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters for segmentation/features."
              },
              "training": {
                "label": "Training",
                "description": "Training CSV with segment_id and class columns."
              },
              "output_prefix": {
                "label": "Output Prefix",
                "description": "Output path prefix for generated artifacts."
              },
              "segment_method": {
                "label": "Segment Method",
                "description": "Segmentation method: slic or graph (default slic)."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum segment size for merge cleanup (default 10)."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Training class field name (default class)."
              }
            }
          },
          "object_class_probability_maps": {
            "name": "Object Class Probability Maps",
            "params": {
              "predictions": {
                "label": "Predictions",
                "description": "Predictions CSV with segment_id and predicted_class."
              },
              "output": {
                "label": "Output",
                "description": "Output probability CSV path."
              }
            }
          },
          "object_features_context_neighbors": {
            "name": "Object Features Context Neighbors",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "object_features_shape_basic": {
            "name": "Object Features Shape Basic",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "object_features_spectral_basic": {
            "name": "Object Features Spectral Basic",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters used for spectral features."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "object_features_texture_glcm_basic": {
            "name": "Object Features Texture Glcm Basic",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "input": {
                "label": "Input",
                "description": "Single-band intensity raster for texture analysis."
              },
              "levels": {
                "label": "Levels",
                "description": "Quantization levels for GLCM (default 16)."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "object_features_topology_relations": {
            "name": "Object Features Topology Relations",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "object_uncertainty_diagnostics_pro": {
            "name": "Object Uncertainty Diagnostics Pro",
            "params": {
              "probabilities": {
                "label": "Probabilities",
                "description": "Input probabilities CSV with probability and uncertainty columns."
              },
              "low_conf_threshold": {
                "label": "Low Conf Threshold",
                "description": "Low-confidence threshold on probability (default 0.7)."
              },
              "output": {
                "label": "Output",
                "description": "Output diagnostics JSON path."
              }
            }
          },
          "objects_boundary_refinement_pro": {
            "name": "Objects Boundary Refinement Pro",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Refinement iterations (default 2)."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum object size threshold (default 6)."
              },
              "output": {
                "label": "Output",
                "description": "Output refined raster path."
              }
            }
          },
          "objects_enforce_min_mapping_unit": {
            "name": "Objects Enforce Min Mapping Unit",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum segment size in cells (default 5)."
              },
              "method": {
                "label": "Method",
                "description": "Merge method: longest, largest, nearest (default longest)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "polygons_to_segments": {
            "name": "Polygons To Segments",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector path."
              },
              "base": {
                "label": "Base",
                "description": "Base raster defining output grid."
              },
              "field": {
                "label": "Field",
                "description": "Optional numeric field to burn (default FID)."
              },
              "output": {
                "label": "Output",
                "description": "Output segments raster path."
              }
            }
          },
          "propagate_labels_across_hierarchy": {
            "name": "Propagate Labels Across Hierarchy",
            "params": {
              "hierarchy": {
                "label": "Hierarchy",
                "description": "Hierarchy CSV with fine_segment_id and coarse_segment_id."
              },
              "parent_labels": {
                "label": "Parent Labels",
                "description": "Parent labels CSV with coarse_segment_id and class."
              },
              "child_labels": {
                "label": "Child Labels",
                "description": "Optional child labels CSV with fine_segment_id and class."
              },
              "output": {
                "label": "Output",
                "description": "Output propagated labels CSV path."
              }
            }
          },
          "segment_graph_felzenszwalb": {
            "name": "Segment Graph Felzenszwalb",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "k": {
                "label": "K",
                "description": "Segmentation scale parameter (default 500.0)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Optional smoothing hint (default 0.8)."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Minimum area for post-merge cleanup (default 20)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output segments raster path."
              }
            }
          },
          "segment_multiresolution_hierarchical": {
            "name": "Segment Multiresolution Hierarchical",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "coarse_k": {
                "label": "Coarse K",
                "description": "Coarse scale parameter (default 800)."
              },
              "fine_k": {
                "label": "Fine K",
                "description": "Fine scale parameter (default 250)."
              },
              "output_prefix": {
                "label": "Output Prefix",
                "description": "Output prefix for generated products."
              }
            }
          },
          "segment_scale_parameter_optimizer": {
            "name": "Segment Scale Parameter Optimizer",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "candidate_scales": {
                "label": "Candidate Scales",
                "description": "List of candidate scale (k) values."
              },
              "target_objects": {
                "label": "Target Objects",
                "description": "Desired object count. Defaults to sqrt(total_cells)."
              },
              "output": {
                "label": "Output",
                "description": "Optional optimizer report JSON path."
              }
            }
          },
          "segment_slic_superpixels": {
            "name": "Segment Slic Superpixels",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "region_size": {
                "label": "Region Size",
                "description": "Target superpixel size in pixels (default 20)."
              },
              "compactness": {
                "label": "Compactness",
                "description": "Compactness control (default 10.0)."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Minimum area for cleanup merge (default derived from region_size)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output segments raster path."
              }
            }
          },
          "segment_watershed_markers": {
            "name": "Segment Watershed Markers",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "gradient_weight": {
                "label": "Gradient Weight",
                "description": "Boundary emphasis control (default 1.0)."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Minimum segment size (default 12)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output segments raster path."
              }
            }
          },
          "segments_merge_small_regions": {
            "name": "Segments Merge Small Regions",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segment-label raster."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum segment size in cells (default 5)."
              },
              "method": {
                "label": "Method",
                "description": "Merge method: longest, largest, nearest (default longest)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "segments_split_low_cohesion": {
            "name": "Segments Split Low Cohesion",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Existing segments raster."
              },
              "inputs": {
                "label": "Inputs",
                "description": "Array of input rasters used for re-segmentation."
              },
              "split_scale": {
                "label": "Split Scale",
                "description": "Finer split scale parameter (default 120)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "segments_to_polygons": {
            "name": "Segments To Polygons",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Input segments raster."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "evaluate_training_sites": {
            "name": "Evaluate Training Sites",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters (one per spectral band), as paths or a delimited string."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Path to polygon training data."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field name in the training_data attributes."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML file path."
              }
            }
          },
          "fuzzy_knn_classification": {
            "name": "Fuzzy Knn Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Number of neighbors (default 5)."
              },
              "m": {
                "label": "M",
                "description": "Fuzzy exponent parameter (> 1; default 2.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output classified raster path."
              },
              "probability_output": {
                "label": "Probability Output",
                "description": "Optional membership-probability raster path."
              }
            }
          },
          "generalize_classified_raster": {
            "name": "Generalize Classified Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input classified raster path or typed raster object."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum feature size in cells; smaller patches are reassigned (default 5)."
              },
              "method": {
                "label": "Method",
                "description": "Generalization method: 'longest' (default), 'largest', or 'nearest'."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "generalize_with_similarity": {
            "name": "Generalize With Similarity",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input classified raster path."
              },
              "similarity": {
                "label": "Similarity",
                "description": "Array of similarity rasters used to compute feature-center similarity."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum feature size in pixels; smaller features are merged (default 5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "k_means_clustering": {
            "name": "K Means Clustering",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster list as an array of paths or comma/semicolon-delimited string."
              },
              "classes": {
                "label": "Classes",
                "description": "Number of target classes (k)."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "Maximum iteration count (default 10)."
              },
              "class_change": {
                "label": "Class Change",
                "description": "Stop when percent of changed valid cells drops below this threshold (default 2.0)."
              },
              "initialize": {
                "label": "Initialize",
                "description": "Centroid initialization strategy: 'diagonal' (default) or 'random'."
              },
              "min_class_size": {
                "label": "Min Class Size",
                "description": "Minimum class size used when updating centroids (default 10)."
              },
              "out_html": {
                "label": "Out Html",
                "description": "Optional HTML report output path."
              },
              "output": {
                "label": "Output",
                "description": "Optional class raster output path. If omitted, output remains in memory."
              }
            }
          },
          "knn_classification": {
            "name": "Knn Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Number of neighbors (default 5)."
              },
              "clip": {
                "label": "Clip",
                "description": "If true, remove misclassified training samples by leave-one-out pre-pass."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "knn_regression": {
            "name": "Knn Regression",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point vector training data path."
              },
              "field": {
                "label": "Field",
                "description": "Numeric target field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Number of neighbors (default 5)."
              },
              "distance_weighted": {
                "label": "Distance Weighted",
                "description": "If true, use inverse-distance weighted averaging."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "logistic_regression": {
            "name": "Logistic Regression",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "alpha": {
                "label": "Alpha",
                "description": "L2 regularization weight (default 0.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "min_dist_classification": {
            "name": "Min Dist Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters (one per spectral band), as paths or a delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Path to a polygon vector file containing training areas."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Name of the attribute field in the training data that holds the class identifier."
              },
              "dist_threshold": {
                "label": "Dist Threshold",
                "description": "Optional z-score threshold; pixels farther than this from the nearest class mean are left unclassified. Default: no threshold (classify all)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is kept in memory."
              }
            }
          },
          "modified_k_means_clustering": {
            "name": "Modified K Means Clustering",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster list as an array of paths or comma/semicolon-delimited string."
              },
              "start_clusters": {
                "label": "Start Clusters",
                "description": "Initial number of clusters before merging (default 1000)."
              },
              "merge_dist": {
                "label": "Merge Dist",
                "description": "Cluster merge distance threshold (Euclidean)."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "Maximum iteration count (default 10)."
              },
              "class_change": {
                "label": "Class Change",
                "description": "Stop when percent of changed valid cells drops below this threshold (default 2.0)."
              },
              "out_html": {
                "label": "Out Html",
                "description": "Optional HTML report output path."
              },
              "output": {
                "label": "Output",
                "description": "Optional class raster output path. If omitted, output remains in memory."
              }
            }
          },
          "nnd_classification": {
            "name": "Nnd Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "z_threshold": {
                "label": "Z Threshold",
                "description": "Maximum accepted normalized distance z-score before outlier flagging (default 1.96)."
              },
              "outlier_is_zero": {
                "label": "Outlier Is Zero",
                "description": "If true, outliers are assigned class value 0; otherwise nodata."
              },
              "k": {
                "label": "K",
                "description": "Neighborhood size for class-distance estimate (default 25)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "otsu_thresholding": {
            "name": "Otsu Thresholding",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "parallelepiped_classification": {
            "name": "Parallelepiped Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters (one per spectral band), as paths or a delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Path to a polygon vector file containing training areas."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Name of the attribute field in the training data that holds the class identifier."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is kept in memory."
              }
            }
          },
          "random_forest_classification": {
            "name": "Random Forest Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees in the forest (default 200)."
              },
              "min_samples_leaf": {
                "label": "Min Samples Leaf",
                "description": "Minimum number of samples required at a leaf node (default 1)."
              },
              "min_samples_split": {
                "label": "Min Samples Split",
                "description": "Minimum number of samples required to split an internal node (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "random_forest_regression": {
            "name": "Random Forest Regression",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point vector training data path."
              },
              "field": {
                "label": "Field",
                "description": "Numeric target field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees in the forest (default 200)."
              },
              "min_samples_leaf": {
                "label": "Min Samples Leaf",
                "description": "Minimum number of samples required at a leaf node (default 1)."
              },
              "min_samples_split": {
                "label": "Min Samples Split",
                "description": "Minimum number of samples required to split an internal node (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "svm_classification": {
            "name": "Svm Classification",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Kernel type: linear (default) or rbf."
              },
              "c": {
                "label": "C",
                "description": "SVM regularization parameter (default 1.0)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "RBF kernel gamma; defaults to 1 / number_of_features."
              },
              "epoch": {
                "label": "Epoch",
                "description": "Number of training epochs (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "svm_regression": {
            "name": "Svm Regression",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point vector training data path."
              },
              "field": {
                "label": "Field",
                "description": "Numeric target field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Kernel type: linear (default) or rbf."
              },
              "c": {
                "label": "C",
                "description": "SVM regularization parameter (default 1.0)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "RBF kernel gamma; defaults to 1 / number_of_features."
              },
              "eps": {
                "label": "Eps",
                "description": "Epsilon-insensitive loss width (default 0.1)."
              },
              "tol": {
                "label": "Tol",
                "description": "Optimizer tolerance (default 1e-3)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "change_vector_analysis": {
            "name": "Change Vector Analysis",
            "params": {
              "date1": {
                "label": "Date1",
                "description": "Earlier-date raster list as an array of paths or a comma/semicolon-delimited string."
              },
              "date2": {
                "label": "Date2",
                "description": "Later-date raster list as an array of paths or a comma/semicolon-delimited string."
              },
              "magnitude_output": {
                "label": "Magnitude Output",
                "description": "Optional output path for vector magnitude raster."
              },
              "direction_output": {
                "label": "Direction Output",
                "description": "Optional output path for direction-code raster."
              }
            }
          },
          "image_difference_change_detection": {
            "name": "Image Difference Change Detection",
            "params": {
              "t1_inputs": {
                "label": "T1 Inputs",
                "description": "Array of date-1 raster paths."
              },
              "t2_inputs": {
                "label": "T2 Inputs",
                "description": "Array of date-2 raster paths; must match t1_inputs length and ordering."
              },
              "mode": {
                "label": "Mode",
                "description": "Difference mode: magnitude (default) or signed."
              },
              "threshold_sigma": {
                "label": "Threshold Sigma",
                "description": "Optional sigma threshold for binary change mask generation."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match t1_inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path for difference image."
              },
              "output_absolute": {
                "label": "Output Absolute",
                "description": "Optional output raster path for absolute signed difference (|mean(t2-t1)|)."
              },
              "output_signed": {
                "label": "Output Signed",
                "description": "Optional output raster path for signed difference mean(t2-t1)."
              },
              "output_mask": {
                "label": "Output Mask",
                "description": "Optional output raster path for thresholded binary change mask."
              }
            }
          },
          "pca_based_change_detection": {
            "name": "Pca Based Change Detection",
            "params": {
              "t1_inputs": {
                "label": "T1 Inputs",
                "description": "Array of date-1 raster paths."
              },
              "t2_inputs": {
                "label": "T2 Inputs",
                "description": "Array of date-2 raster paths; must match t1_inputs length and ordering."
              },
              "component": {
                "label": "Component",
                "description": "1-based principal component index to output (default 1)."
              },
              "standardized": {
                "label": "Standardized",
                "description": "If true, use correlation matrix PCA on change vectors (default false)."
              },
              "threshold_sigma": {
                "label": "Threshold Sigma",
                "description": "Optional sigma threshold on absolute PC score for binary mask output."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match t1_inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path for absolute selected PC score."
              },
              "output_mask": {
                "label": "Output Mask",
                "description": "Optional output raster path for thresholded binary mask (0/1)."
              },
              "output_report": {
                "label": "Output Report",
                "description": "Optional output JSON report path for eigenvalues, explained variance, and component loadings."
              }
            }
          },
          "post_classification_change": {
            "name": "Post Classification Change",
            "params": {
              "t1_classified": {
                "label": "T1 Classified",
                "description": "Date-1 classified raster path."
              },
              "t2_classified": {
                "label": "T2 Classified",
                "description": "Date-2 classified raster path."
              },
              "transition_scale": {
                "label": "Transition Scale",
                "description": "Transition coding scale factor (default 1000): code = class1 * scale + class2."
              },
              "t1_class_remap": {
                "label": "T1 Class Remap",
                "description": "Optional remap table for date-1 classes as object {\"old\": new, ...}."
              },
              "t2_class_remap": {
                "label": "T2 Class Remap",
                "description": "Optional remap table for date-2 classes as object {\"old\": new, ...}."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject t2_classified to t1_classified CRS when needed."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output transition-coded raster path."
              }
            }
          },
          "write_function_memory_insertion": {
            "name": "Write Function Memory Insertion",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First-date single-band raster."
              },
              "input2": {
                "label": "Input2",
                "description": "Second-date single-band raster."
              },
              "input3": {
                "label": "Input3",
                "description": "Optional third-date single-band raster; if omitted, input2 is used for blue channel."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "brdf_normalization": {
            "name": "Brdf Normalization",
            "params": {
              "input_raster": {
                "label": "Input Raster",
                "description": "Input reflectance raster to normalize (single band or multi-band stack)."
              },
              "input_dem": {
                "label": "Input Dem",
                "description": "DEM raster co-registered with the input (same grid or will be resampled to match)."
              },
              "solar_zenith_deg": {
                "label": "Solar Zenith Deg",
                "description": "Solar zenith angle in degrees at acquisition time."
              },
              "solar_azimuth_deg": {
                "label": "Solar Azimuth Deg",
                "description": "Solar azimuth angle in degrees (clockwise from north) at acquisition time."
              },
              "method": {
                "label": "Method",
                "description": "Correction method: c_correction (default) or minnaert."
              },
              "minnaert_k": {
                "label": "Minnaert K",
                "description": "Minnaert k coefficient in [0,1] (default 0.5). Only used when method=minnaert."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical exaggeration for DEM slope/aspect computation (default 1.0)."
              },
              "output_prefix": {
                "label": "Output Prefix",
                "description": "Prefix for output files (default brdf_normalized)."
              },
              "output": {
                "label": "Output",
                "description": "Output path for normalized raster (overrides output_prefix for single-output mode)."
              }
            }
          },
          "correct_vignetting": {
            "name": "Correct Vignetting",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster image."
              },
              "pp": {
                "label": "Pp",
                "description": "Point vector path (or typed vector object) containing the principal point."
              },
              "focal_length": {
                "label": "Focal Length",
                "description": "Camera focal length in mm (default 304.8)."
              },
              "image_width": {
                "label": "Image Width",
                "description": "Distance between left and right image edges in mm (default 228.6)."
              },
              "n": {
                "label": "N",
                "description": "Cosine model exponent n (default 4.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "dark_object_subtraction": {
            "name": "Dark Object Subtraction",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster stack (one or more rasters)."
              },
              "percentile": {
                "label": "Percentile",
                "description": "Dark-object percentile per band (default 1.0)."
              },
              "clamp_non_negative": {
                "label": "Clamp Non Negative",
                "description": "If true, clamp corrected values below zero to zero (default true)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject inputs to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              },
              "output_diagnostic_offsets": {
                "label": "Output Diagnostic Offsets",
                "description": "Optional output raster path for per-band dark-object offset diagnostics."
              }
            }
          },
          "dn_to_toa_reflectance": {
            "name": "Dn To Toa Reflectance",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input DN raster stack (one or more rasters)."
              },
              "reflectance_mult": {
                "label": "Reflectance Mult",
                "description": "Per-band multiplicative coefficient(s), either scalar or array sized to inputs."
              },
              "reflectance_add": {
                "label": "Reflectance Add",
                "description": "Per-band additive coefficient(s), either scalar or array sized to inputs (default 0)."
              },
              "sensor_bundle_root": {
                "label": "Sensor Bundle Root",
                "description": "Optional Landsat/Sentinel-2 bundle root used to auto-derive coefficients when explicit coefficients are omitted."
              },
              "sun_elevation_deg": {
                "label": "Sun Elevation Deg",
                "description": "Optional sun elevation angle in degrees for cosine correction. Auto-derived from bundle metadata when available."
              },
              "apply_solar_correction": {
                "label": "Apply Solar Correction",
                "description": "If true (default), divide by sin(sun_elevation)."
              },
              "clamp_unit_interval": {
                "label": "Clamp Unit Interval",
                "description": "If true (default), clamp outputs to [0, 1]."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject inputs to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "terrain_corrected_optical_analytics": {
            "name": "Terrain Corrected Optical Analytics",
            "params": {
              "input_dem": {
                "label": "Input Dem",
                "description": "DEM raster co-registered with optical bands."
              },
              "bundle_root": {
                "label": "Bundle Root",
                "description": "Optional optical sensor bundle root directory (currently Sentinel-2 SAFE, Landsat, or DIMAP SPOT/Pleiades) used to auto-resolve required bands, QA when available, and solar metadata when explicit inputs are omitted."
              },
              "input_red": {
                "label": "Input Red",
                "description": "Red band raster (optional when bundle_root is provided)."
              },
              "input_nir": {
                "label": "Input Nir",
                "description": "NIR band raster (optional when bundle_root is provided)."
              },
              "input_green": {
                "label": "Input Green",
                "description": "Green band raster (optional)."
              },
              "input_blue": {
                "label": "Input Blue",
                "description": "Blue band raster (optional). Auto-resolved from bundle metadata when bundle_root is provided."
              },
              "solar_mode": {
                "label": "Solar Mode",
                "description": "Solar-angle resolution mode: auto, manual, metadata, datetime_location."
              },
              "solar_zenith_deg": {
                "label": "Solar Zenith Deg",
                "description": "Solar zenith angle in degrees (required in manual mode)."
              },
              "solar_azimuth_deg": {
                "label": "Solar Azimuth Deg",
                "description": "Solar azimuth in degrees (clockwise from north, required in manual mode)."
              },
              "acquisition_datetime_utc": {
                "label": "Acquisition Datetime Utc",
                "description": "Acquisition timestamp in RFC3339 UTC for datetime_location mode."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Optional latitude for datetime_location mode."
              },
              "longitude": {
                "label": "Longitude",
                "description": "Optional longitude for datetime_location mode."
              },
              "profile": {
                "label": "Profile",
                "description": "Processing profile: conservative, balanced, fast."
              },
              "cloud_threshold": {
                "label": "Cloud Threshold",
                "description": "Optional cloud threshold in source band units. Auto-inferred when omitted."
              },
              "shadow_threshold": {
                "label": "Shadow Threshold",
                "description": "Optional cloud-shadow threshold in source band units. Auto-inferred when omitted."
              },
              "qa_mask": {
                "label": "Qa Mask",
                "description": "Optional QA mask raster path."
              },
              "qa_mask_format": {
                "label": "Qa Mask Format",
                "description": "QA mask encoding: auto, landsat_qa_pixel, sentinel2_scl, sentinel2_qa60, binary."
              },
              "mask_strategy": {
                "label": "Mask Strategy",
                "description": "Mask strategy: auto, qa_only, heuristic_only, qa_plus_heuristic."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical exaggeration for slope/aspect."
              },
              "output_prefix": {
                "label": "Output Prefix",
                "description": "Prefix for all output artifacts."
              }
            }
          },
          "land_surface_temperature_single_channel": {
            "name": "Land Surface Temperature Single Channel",
            "params": {
              "thermal_input": {
                "label": "Thermal Input",
                "description": "Thermal raster path (DN by default, or brightness temperature if input_is_brightness_temp=true)."
              },
              "input_is_brightness_temp": {
                "label": "Input Is Brightness Temp",
                "description": "If true, thermal_input is already brightness temperature in Kelvin (default false)."
              },
              "emissivity_input": {
                "label": "Emissivity Input",
                "description": "Optional emissivity raster path aligned to thermal_input."
              },
              "emissivity_constant": {
                "label": "Emissivity Constant",
                "description": "Fallback emissivity when emissivity_input is not provided (default 0.98)."
              },
              "sensor_bundle_root": {
                "label": "Sensor Bundle Root",
                "description": "Optional Landsat bundle root used to derive thermal radiance and Planck constants."
              },
              "thermal_band_number": {
                "label": "Thermal Band Number",
                "description": "Thermal band number for metadata lookup (default 10)."
              },
              "radiance_mult": {
                "label": "Radiance Mult",
                "description": "Thermal radiance multiplicative factor for DN->radiance conversion."
              },
              "radiance_add": {
                "label": "Radiance Add",
                "description": "Thermal radiance additive factor for DN->radiance conversion."
              },
              "k1_constant": {
                "label": "K1 Constant",
                "description": "Planck K1 thermal constant."
              },
              "k2_constant": {
                "label": "K2 Constant",
                "description": "Planck K2 thermal constant."
              },
              "wavelength_um": {
                "label": "Wavelength Um",
                "description": "Effective thermal wavelength in micrometers (default inferred by thermal_band_number)."
              },
              "output_units": {
                "label": "Output Units",
                "description": "Output units: celsius (default) or kelvin."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject emissivity_input to thermal_input CRS when needed."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "land_surface_temperature_split_window": {
            "name": "Land Surface Temperature Split Window",
            "params": {
              "thermal1_input": {
                "label": "Thermal1 Input",
                "description": "First thermal raster path (e.g., Landsat B10)."
              },
              "thermal2_input": {
                "label": "Thermal2 Input",
                "description": "Second thermal raster path (e.g., Landsat B11)."
              },
              "input_is_brightness_temp": {
                "label": "Input Is Brightness Temp",
                "description": "If true, thermal inputs are already brightness temperatures in Kelvin (default false)."
              },
              "emissivity_mean_input": {
                "label": "Emissivity Mean Input",
                "description": "Optional mean emissivity raster path."
              },
              "emissivity_delta_input": {
                "label": "Emissivity Delta Input",
                "description": "Optional emissivity delta raster path (epsilon1 - epsilon2)."
              },
              "emissivity_mean_constant": {
                "label": "Emissivity Mean Constant",
                "description": "Fallback mean emissivity constant when emissivity_mean_input is absent (default 0.98)."
              },
              "emissivity_delta_constant": {
                "label": "Emissivity Delta Constant",
                "description": "Fallback emissivity delta constant when emissivity_delta_input is absent (default 0.0)."
              },
              "sensor_bundle_root": {
                "label": "Sensor Bundle Root",
                "description": "Optional Landsat bundle root used to derive thermal radiance and Planck constants."
              },
              "thermal_band1_number": {
                "label": "Thermal Band1 Number",
                "description": "Band number for thermal1_input metadata lookup (default 10)."
              },
              "thermal_band2_number": {
                "label": "Thermal Band2 Number",
                "description": "Band number for thermal2_input metadata lookup (default 11)."
              },
              "radiance1_mult": {
                "label": "Radiance1 Mult",
                "description": "Band-1 radiance multiplicative factor."
              },
              "radiance1_add": {
                "label": "Radiance1 Add",
                "description": "Band-1 radiance additive factor."
              },
              "k1_1": {
                "label": "K1 1",
                "description": "Band-1 Planck K1 constant."
              },
              "k2_1": {
                "label": "K2 1",
                "description": "Band-1 Planck K2 constant."
              },
              "radiance2_mult": {
                "label": "Radiance2 Mult",
                "description": "Band-2 radiance multiplicative factor."
              },
              "radiance2_add": {
                "label": "Radiance2 Add",
                "description": "Band-2 radiance additive factor."
              },
              "k1_2": {
                "label": "K1 2",
                "description": "Band-2 Planck K1 constant."
              },
              "k2_2": {
                "label": "K2 2",
                "description": "Band-2 Planck K2 constant."
              },
              "coeff_a0": {
                "label": "Coeff A0",
                "description": "Split-window coefficient a0 (default 0.0)."
              },
              "coeff_a1": {
                "label": "Coeff A1",
                "description": "Split-window coefficient a1 for T1 term (default 1.0)."
              },
              "coeff_a2": {
                "label": "Coeff A2",
                "description": "Split-window coefficient a2 for (T1-T2) term (default 0.0)."
              },
              "coeff_a3": {
                "label": "Coeff A3",
                "description": "Split-window coefficient a3 for (T1-T2)^2 term (default 0.0)."
              },
              "coeff_a4": {
                "label": "Coeff A4",
                "description": "Split-window coefficient a4 for (1-emissivity_mean) term (default 0.0)."
              },
              "coeff_a5": {
                "label": "Coeff A5",
                "description": "Split-window coefficient a5 for emissivity_delta term (default 0.0)."
              },
              "output_units": {
                "label": "Output Units",
                "description": "Output units: celsius (default) or kelvin."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject supplemental rasters to match thermal1_input CRS when needed."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "ndvi_based_emissivity": {
            "name": "Ndvi Based Emissivity",
            "params": {
              "red_input": {
                "label": "Red Input",
                "description": "Red-band raster path."
              },
              "nir_input": {
                "label": "Nir Input",
                "description": "NIR-band raster path."
              },
              "ndvi_soil": {
                "label": "Ndvi Soil",
                "description": "NDVI threshold for bare soil fraction (default 0.2)."
              },
              "ndvi_vegetation": {
                "label": "Ndvi Vegetation",
                "description": "NDVI threshold for full vegetation fraction (default 0.5)."
              },
              "emissivity_soil": {
                "label": "Emissivity Soil",
                "description": "Assumed soil emissivity (default 0.97)."
              },
              "emissivity_vegetation": {
                "label": "Emissivity Vegetation",
                "description": "Assumed vegetation emissivity (default 0.99)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject nir_input to red_input CRS when needed."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "continuum_removal": {
            "name": "Continuum Removal",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster stack (one raster per band)."
              },
              "wavelengths": {
                "label": "Wavelengths",
                "description": "Optional strictly increasing wavelength array matching inputs length."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output multiband raster path."
              }
            }
          },
          "linear_spectral_unmixing": {
            "name": "Linear Spectral Unmixing",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster stack (one raster per band)."
              },
              "endmembers": {
                "label": "Endmembers",
                "description": "Endmember signatures as array of objects {name, values} or numeric arrays."
              },
              "sum_to_one": {
                "label": "Sum To One",
                "description": "If true (default), normalize non-negative fractions to sum to one."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Projected-gradient iteration count (default 80)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Projected-gradient step size (default 0.05)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output multiband fraction raster path."
              },
              "output_residual": {
                "label": "Output Residual",
                "description": "Optional output residual RMS raster path."
              }
            }
          },
          "minimum_noise_fraction": {
            "name": "Minimum Noise Fraction",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster stack (one raster per band)."
              },
              "num_components": {
                "label": "Num Components",
                "description": "Number of output MNF components (default: all bands)."
              },
              "noise_mode": {
                "label": "Noise Mode",
                "description": "Noise estimator mode: 'difference_x' (default) or 'difference_y'."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output multiband MNF component raster path."
              },
              "output_inverse": {
                "label": "Output Inverse",
                "description": "Optional reconstructed multiband raster path from retained MNF components."
              }
            }
          },
          "spectral_angle_mapper": {
            "name": "Spectral Angle Mapper",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster stack (one raster per band)."
              },
              "endmembers": {
                "label": "Endmembers",
                "description": "Endmember signatures as array of objects {name, values} or numeric arrays."
              },
              "threshold_angle_deg": {
                "label": "Threshold Angle Deg",
                "description": "Optional maximum accepted spectral angle in degrees; unmatched pixels are class 0."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output class raster path."
              },
              "output_angle": {
                "label": "Output Angle",
                "description": "Optional output raster path for minimum spectral angle (degrees)."
              }
            }
          },
          "spectral_library_matching": {
            "name": "Spectral Library Matching",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster stack (one raster per band)."
              },
              "library": {
                "label": "Library",
                "description": "Spectral library entries as array of objects {name, values} or numeric arrays."
              },
              "library_csv": {
                "label": "Library Csv",
                "description": "Optional CSV spectral library path (name,b1,b2,... or b1,b2,... rows). Used when 'library' is not provided."
              },
              "metric": {
                "label": "Metric",
                "description": "Matching metric: 'sam' (default), 'euclidean', or 'sid'."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output class raster path."
              },
              "output_score": {
                "label": "Output Score",
                "description": "Optional output best-match score raster path (angle or distance)."
              }
            }
          },
          "canny_edge_detection": {
            "name": "Canny Edge Detection",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path (single-band or packed-RGB)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Standard deviation of the Gaussian smoothing kernel in pixels. Default: 0.5."
              },
              "low_threshold": {
                "label": "Low Threshold",
                "description": "Low hysteresis threshold (0–1 fraction of max gradient). Default: 0.05."
              },
              "high_threshold": {
                "label": "High Threshold",
                "description": "High hysteresis threshold (0–1 fraction of max gradient). Default: 0.15."
              },
              "add_back": {
                "label": "Add Back",
                "description": "If true, edge pixels are zeroed in the original image rather than producing a binary edge map. Default: false."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is kept in memory."
              }
            }
          },
          "corner_detection": {
            "name": "Corner Detection",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "laplacian_filter": {
            "name": "Laplacian Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "variant": {
                "label": "Variant",
                "description": "Kernel variant: 3x3(1), 3x3(2), 3x3(3), 3x3(4), 5x5(1), 5x5(2)."
              },
              "clip_amount": {
                "label": "Clip Amount",
                "description": "Optional symmetric tail clipping percent (0-40)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "laplacian_of_gaussians_filter": {
            "name": "Laplacian Of Gaussians Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Gaussian sigma used by the LoG kernel (0.5-20.0, default 0.75)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "prewitt_filter": {
            "name": "Prewitt Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "clip_tails": {
                "label": "Clip Tails",
                "description": "Optional symmetric tail clipping percent (0-40)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "roberts_cross_filter": {
            "name": "Roberts Cross Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "clip_amount": {
                "label": "Clip Amount",
                "description": "Optional symmetric tail clipping percent (0-50)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "sobel_filter": {
            "name": "Sobel Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "variant": {
                "label": "Variant",
                "description": "Kernel size variant: 3x3 (default) or 5x5."
              },
              "clip_tails": {
                "label": "Clip Tails",
                "description": "Optional symmetric tail clipping percent (0-40)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "balance_contrast_enhancement": {
            "name": "Balance Contrast Enhancement",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "band_mean": {
                "label": "Band Mean",
                "description": "Desired output mean brightness for each channel (default 100.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "create_colour_composite": {
            "name": "Create Colour Composite",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "red": {
                "label": "Red",
                "description": "Red-band raster path or typed raster object."
              },
              "green": {
                "label": "Green",
                "description": "Green-band raster path or typed raster object."
              },
              "blue": {
                "label": "Blue",
                "description": "Blue-band raster path or typed raster object."
              },
              "opacity": {
                "label": "Opacity",
                "description": "Optional opacity raster path or typed raster object."
              },
              "enhance": {
                "label": "Enhance",
                "description": "Apply balance contrast enhancement after composing (default true)."
              },
              "treat_zeros_as_nodata": {
                "label": "Treat Zeros As Nodata",
                "description": "Treat zero values in RGB inputs as nodata/background (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "direct_decorrelation_stretch": {
            "name": "Direct Decorrelation Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "achromatic_factor": {
                "label": "Achromatic Factor",
                "description": "Grey-component reduction factor from 0 to 1 (default 0.5)."
              },
              "clip_percent": {
                "label": "Clip Percent",
                "description": "Percent tail clipping for post-stretch linear rescaling (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "false_colour_composite": {
            "name": "False Colour Composite",
            "params": {
              "wbe": {
                "label": "Wbe",
                "description": "Wbe"
              },
              "output": {
                "label": "Output",
                "description": "Output"
              }
            }
          },
          "gamma_correction": {
            "name": "Gamma Correction",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Gamma exponent in [0, 4], default 0.5."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "gaussian_contrast_stretch": {
            "name": "Gaussian Contrast Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "num_tones": {
                "label": "Num Tones",
                "description": "Number of output tones (default 256)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "histogram_equalization": {
            "name": "Histogram Equalization",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "num_tones": {
                "label": "Num Tones",
                "description": "Number of output tones (default 256)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "histogram_matching": {
            "name": "Histogram Matching",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "histogram": {
                "label": "Histogram",
                "description": "Reference histogram as [[value, frequency], ...] or [{x, y}, ...]."
              },
              "is_cumulative": {
                "label": "Is Cumulative",
                "description": "True if supplied histogram values are already cumulative."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "histogram_matching_two_images": {
            "name": "Histogram Matching Two Images",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "reference": {
                "label": "Reference",
                "description": "Reference raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "ihs_to_rgb": {
            "name": "Ihs To Rgb",
            "params": {
              "intensity": {
                "label": "Intensity",
                "description": "Intensity band raster (0–1)."
              },
              "hue": {
                "label": "Hue",
                "description": "Hue band raster (0–2π radians)."
              },
              "saturation": {
                "label": "Saturation",
                "description": "Saturation band raster (0–1)."
              },
              "red_output": {
                "label": "Red Output",
                "description": "Optional output path for the red band."
              },
              "green_output": {
                "label": "Green Output",
                "description": "Optional output path for the green band."
              },
              "blue_output": {
                "label": "Blue Output",
                "description": "Optional output path for the blue band."
              }
            }
          },
          "min_max_contrast_stretch": {
            "name": "Min Max Contrast Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "min_val": {
                "label": "Min Val",
                "description": "Minimum input value for scaling."
              },
              "max_val": {
                "label": "Max Val",
                "description": "Maximum input value for scaling."
              },
              "num_tones": {
                "label": "Num Tones",
                "description": "Number of output tones (default 256)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "mosaic": {
            "name": "Mosaic",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster list as an array of paths or comma/semicolon-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "method": {
                "label": "Method",
                "description": "Resampling method: 'nn' (default), 'bilinear', or 'cc'."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "mosaic_with_feathering": {
            "name": "Mosaic With Feathering",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster."
              },
              "method": {
                "label": "Method",
                "description": "Resampling method: 'cc' (default), 'nn', or 'bilinear'."
              },
              "weight": {
                "label": "Weight",
                "description": "Distance-weight exponent used for overlap feathering (default 4.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "normalized_difference_index": {
            "name": "Normalized Difference Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "band1": {
                "label": "Band1",
                "description": "One-based index of first band (default 1)."
              },
              "band2": {
                "label": "Band2",
                "description": "One-based index of second band (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "panchromatic_sharpening": {
            "name": "Panchromatic Sharpening",
            "params": {
              "red": {
                "label": "Red",
                "description": "Red-band raster (required unless 'composite' is provided)."
              },
              "green": {
                "label": "Green",
                "description": "Green-band raster (required unless 'composite' is provided)."
              },
              "blue": {
                "label": "Blue",
                "description": "Blue-band raster (required unless 'composite' is provided)."
              },
              "composite": {
                "label": "Composite",
                "description": "Packed RGB multispectral composite (mutually exclusive with red/green/blue)."
              },
              "pan": {
                "label": "Pan",
                "description": "Panchromatic raster band."
              },
              "method": {
                "label": "Method",
                "description": "Fusion method: 'brovey' (default) or 'ihs'."
              },
              "output_mode": {
                "label": "Output Mode",
                "description": "Output encoding: 'packed' (default) or 'bands' (3-band RGB raster)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "percentage_contrast_stretch": {
            "name": "Percentage Contrast Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "clip": {
                "label": "Clip",
                "description": "Percentile clip percentage (default 1.0)."
              },
              "tail": {
                "label": "Tail",
                "description": "Tail clipping mode: both (default), upper, or lower."
              },
              "num_tones": {
                "label": "Num Tones",
                "description": "Number of output tones (default 256)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "piecewise_contrast_stretch": {
            "name": "Piecewise Contrast Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "function": {
                "label": "Function",
                "description": "Breakpoint statement string, e.g. '(50,0.1);(120,0.6);(180,0.85)'."
              },
              "greytones": {
                "label": "Greytones",
                "description": "Number of output tones for non-RGB rasters (default 1024)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "resample": {
            "name": "Resample",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster list as an array of paths or comma/semicolon-delimited string."
              },
              "base": {
                "label": "Base",
                "description": "Optional base raster defining output extent and grid. Takes precedence over cell_size."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Optional output cell size when base is not provided."
              },
              "method": {
                "label": "Method",
                "description": "Resampling method: 'cc' (default), 'nn', or 'bilinear'."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "rgb_to_ihs": {
            "name": "Rgb To Ihs",
            "params": {
              "red": {
                "label": "Red",
                "description": "Red-band raster (mutually exclusive with 'composite')."
              },
              "green": {
                "label": "Green",
                "description": "Green-band raster (mutually exclusive with 'composite')."
              },
              "blue": {
                "label": "Blue",
                "description": "Blue-band raster (mutually exclusive with 'composite')."
              },
              "composite": {
                "label": "Composite",
                "description": "Packed RGB composite raster (mutually exclusive with red/green/blue)."
              },
              "intensity_output": {
                "label": "Intensity Output",
                "description": "Optional output path for the intensity band."
              },
              "hue_output": {
                "label": "Hue Output",
                "description": "Optional output path for the hue band."
              },
              "saturation_output": {
                "label": "Saturation Output",
                "description": "Optional output path for the saturation band."
              }
            }
          },
          "sigmoidal_contrast_stretch": {
            "name": "Sigmoidal Contrast Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "cutoff": {
                "label": "Cutoff",
                "description": "Sigmoid midpoint in normalized units (default 0.0)."
              },
              "gain": {
                "label": "Gain",
                "description": "Sigmoid gain parameter (default 1.0)."
              },
              "num_tones": {
                "label": "Num Tones",
                "description": "Number of output tones (default 256)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "split_colour_composite": {
            "name": "Split Colour Composite",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input packed RGB raster."
              },
              "red_output": {
                "label": "Red Output",
                "description": "Optional output path for the red band."
              },
              "green_output": {
                "label": "Green Output",
                "description": "Optional output path for the green band."
              },
              "blue_output": {
                "label": "Blue Output",
                "description": "Optional output path for the blue band."
              }
            }
          },
          "standard_deviation_contrast_stretch": {
            "name": "Standard Deviation Contrast Stretch",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "clip": {
                "label": "Clip",
                "description": "Standard deviation multiplier used to derive clip bounds (default 2.0)."
              },
              "num_tones": {
                "label": "Num Tones",
                "description": "Number of output tones (default 256)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "true_colour_composite": {
            "name": "True Colour Composite",
            "params": {
              "wbe": {
                "label": "Wbe",
                "description": "Wbe"
              },
              "output": {
                "label": "Output",
                "description": "Output"
              }
            }
          },
          "adaptive_filter": {
            "name": "Adaptive Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 11)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Absolute z-score threshold for mean replacement (default 2.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "anisotropic_diffusion_filter": {
            "name": "Anisotropic Diffusion Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Number of diffusion iterations (default 10)."
              },
              "kappa": {
                "label": "Kappa",
                "description": "Edge sensitivity parameter (default 20.0)."
              },
              "lambda": {
                "label": "Lambda",
                "description": "Time-step in (0, 0.25], default 0.2."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "bilateral_filter": {
            "name": "Bilateral Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma_dist": {
                "label": "Sigma Dist",
                "description": "Standard deviation of the spatial Gaussian kernel in pixels (0.5–20.0, default 0.75)."
              },
              "sigma_int": {
                "label": "Sigma Int",
                "description": "Standard deviation of the intensity Gaussian kernel in raster value units (default 1.0)."
              },
              "treat_as_rgb": {
                "label": "Treat As Rgb",
                "description": "Set true to force packed RGB HSI processing. When false, packed RGB may still be auto-detected from raster metadata."
              },
              "assume_three_band_rgb": {
                "label": "Assume Three Band Rgb",
                "description": "When true (default), 3-band uint8/uint16 rasters may be treated as RGB in filters that support 3-band RGB intensity processing."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "closing": {
            "name": "Closing",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd neighborhood width (default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd neighborhood height (default same as filter_size_x)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "conservative_smoothing_filter": {
            "name": "Conservative Smoothing Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 3)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 3)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "diff_of_gaussians_filter": {
            "name": "Diff Of Gaussians Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Smaller Gaussian sigma (0.25-20.0, default 2.0)."
              },
              "sigma2": {
                "label": "Sigma2",
                "description": "Larger Gaussian sigma (0.5-20.0, default 4.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "diversity_filter": {
            "name": "Diversity Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "edge_preserving_mean_filter": {
            "name": "Edge Preserving Mean Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Square neighborhood size in pixels (odd integer, default 11)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Maximum absolute neighbor difference to include in local mean (default 15.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "emboss_filter": {
            "name": "Emboss Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "direction": {
                "label": "Direction",
                "description": "Emboss direction: n,s,e,w,ne,nw,se,sw."
              },
              "clip_amount": {
                "label": "Clip Amount",
                "description": "Optional symmetric tail clipping percent (0-40)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "fast_almost_gaussian_filter": {
            "name": "Fast Almost Gaussian Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Approximate Gaussian sigma (>=1.8 recommended, default 1.8)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "flip_image": {
            "name": "Flip Image",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "direction": {
                "label": "Direction",
                "description": "Flip direction: vertical (default), horizontal, or both."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "frangi_filter": {
            "name": "Frangi Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "scales": {
                "label": "Scales",
                "description": "List of Gaussian-like scales in pixels (default [1.0, 2.0, 3.0])."
              },
              "beta": {
                "label": "Beta",
                "description": "Frangi beta parameter for blob suppression (default 0.5)."
              },
              "c": {
                "label": "C",
                "description": "Frangi c parameter for structure sensitivity (default 15.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "gabor_filter_bank": {
            "name": "Gabor Filter Bank",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Gaussian envelope sigma in pixels (default 2.0)."
              },
              "frequency": {
                "label": "Frequency",
                "description": "Sinusoid spatial frequency in cycles/pixel (default 0.2)."
              },
              "orientations": {
                "label": "Orientations",
                "description": "Number of orientations in the filter bank (default 6)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "gaussian_filter": {
            "name": "Gaussian Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Gaussian standard deviation in pixels (0.5-20.0, default 0.75)."
              },
              "treat_as_rgb": {
                "label": "Treat As Rgb",
                "description": "Set true to force RGB intensity-space behavior."
              },
              "assume_three_band_rgb": {
                "label": "Assume Three Band Rgb",
                "description": "When true (default), 3-band uint8/uint16 rasters may be treated as RGB if explicit metadata is missing."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "glcm_texture": {
            "name": "Glcm Texture",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input single-band raster."
              },
              "window_size": {
                "label": "Window Size",
                "description": "Odd moving-window size in pixels (default 7)."
              },
              "distance": {
                "label": "Distance",
                "description": "Pixel distance for the co-occurrence pair offsets (default 1)."
              },
              "angles": {
                "label": "Angles",
                "description": "Comma-separated angles from 0,45,90,135 (default '0,45,90,135')."
              },
              "features": {
                "label": "Features",
                "description": "Comma-separated features: contrast,dissimilarity,homogeneity,asm,energy,entropy,mean,variance,correlation."
              },
              "direction_aggregation": {
                "label": "Direction Aggregation",
                "description": "Direction aggregation mode: mean (default), min, max, range, separate."
              },
              "levels": {
                "label": "Levels",
                "description": "Number of quantization levels (default 32; range 8-128)."
              },
              "symmetric": {
                "label": "Symmetric",
                "description": "If true (default), build symmetric GLCMs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path (multiband GeoTIFF)."
              }
            }
          },
          "guided_filter": {
            "name": "Guided Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "radius": {
                "label": "Radius",
                "description": "Guided filter window radius in pixels (default 4)."
              },
              "epsilon": {
                "label": "Epsilon",
                "description": "Regularization parameter for local variance (default 0.01)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "high_pass_bilateral_filter": {
            "name": "High Pass Bilateral Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma_dist": {
                "label": "Sigma Dist",
                "description": "Standard deviation of the spatial (distance) Gaussian kernel, in pixels (0.5–20.0, default 0.75)."
              },
              "sigma_int": {
                "label": "Sigma Int",
                "description": "Standard deviation of the intensity Gaussian kernel, in raster-value units (default 1.0)."
              },
              "treat_as_rgb": {
                "label": "Treat As Rgb",
                "description": "Set true to force HSI-intensity filtering for packed RGB rasters before high-pass differencing."
              },
              "assume_three_band_rgb": {
                "label": "Assume Three Band Rgb",
                "description": "When true (default), and no explicit color metadata is present, allow 3-band uint8/uint16 RGB interpretation."
              },
              "output": {
                "label": "Output",
                "description": "Optional output file path. If omitted, output remains in memory."
              }
            }
          },
          "high_pass_filter": {
            "name": "High Pass Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "high_pass_median_filter": {
            "name": "High Pass Median Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 11)."
              },
              "sig_digits": {
                "label": "Sig Digits",
                "description": "Significant digits used for histogram binning (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "integral_image_transform": {
            "name": "Integral Image Transform",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "k_nearest_mean_filter": {
            "name": "K Nearest Mean Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 3)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 3)."
              },
              "k": {
                "label": "K",
                "description": "Number of nearest neighbours to average (default 5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "kuwahara_filter": {
            "name": "Kuwahara Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "radius": {
                "label": "Radius",
                "description": "Kuwahara quadrant radius in pixels (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "lee_filter": {
            "name": "Lee Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 11)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Intensity inclusion half-width around center value (default 10.0)."
              },
              "m_value": {
                "label": "M Value",
                "description": "Minimum in-range sample count before fallback averaging (default 5.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "line_detection_filter": {
            "name": "Line Detection Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "variant": {
                "label": "Variant",
                "description": "Line direction variant: v, h, 45, or 135."
              },
              "abs_values": {
                "label": "Abs Values",
                "description": "If true, output absolute response values."
              },
              "clip_tails": {
                "label": "Clip Tails",
                "description": "Optional symmetric tail clipping percent (0-40)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "line_thinning": {
            "name": "Line Thinning",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "lidar_ground_point_filter": {
            "name": "Lidar Ground Point Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighborhood search radius (default 2.0)."
              },
              "min_neighbours": {
                "label": "Min Neighbours",
                "description": "Minimum neighbors target (default 0)."
              },
              "slope_threshold": {
                "label": "Slope Threshold",
                "description": "Slope threshold in degrees (default 45.0, max 88)."
              },
              "height_threshold": {
                "label": "Height Threshold",
                "description": "Minimum vertical separation to flag off-terrain (default 1.0)."
              },
              "classify": {
                "label": "Classify",
                "description": "If true classify points (ground=2, off-terrain=1); else filter off-terrain points."
              },
              "slope_norm": {
                "label": "Slope Norm",
                "description": "If true, apply top-hat terrain normalization before slope testing (default true)."
              },
              "height_above_ground": {
                "label": "Height Above Ground",
                "description": "If true, output z values as local height above nearest lower neighbor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path for single-input mode."
              }
            }
          },
          "majority_filter": {
            "name": "Majority Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "maximum_filter": {
            "name": "Maximum Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "mean_filter": {
            "name": "Mean Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "median_filter": {
            "name": "Median Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "sig_digits": {
                "label": "Sig Digits",
                "description": "Number of significant digits used for quantized rank filtering (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "minimum_filter": {
            "name": "Minimum Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "non_local_means_filter": {
            "name": "Non Local Means Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Search window radius in pixels (default 5)."
              },
              "patch_radius": {
                "label": "Patch Radius",
                "description": "Patch radius in pixels (default 1)."
              },
              "h": {
                "label": "H",
                "description": "Filtering strength parameter (default 10.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "opening": {
            "name": "Opening",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd neighborhood width (default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd neighborhood height (default same as filter_size_x)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "olympic_filter": {
            "name": "Olympic Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 11)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "percentile_filter": {
            "name": "Percentile Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "sig_digits": {
                "label": "Sig Digits",
                "description": "Number of significant digits used for quantized rank filtering (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "range_filter": {
            "name": "Range Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "remove_spurs": {
            "name": "Remove Spurs",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "Maximum pruning iterations (default 10)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "savitzky_golay_2d_filter": {
            "name": "Savitzky Golay 2d Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "window_size": {
                "label": "Window Size",
                "description": "Odd window size (default 5). Currently supports 5 for polynomial order 2."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "scharr_filter": {
            "name": "Scharr Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "clip_tails": {
                "label": "Clip Tails",
                "description": "Optional symmetric tail clipping percent (0-40)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "standard_deviation_filter": {
            "name": "Standard Deviation Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "thicken_raster_line": {
            "name": "Thicken Raster Line",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "tophat_transform": {
            "name": "Tophat Transform",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd neighborhood width (default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd neighborhood height (default same as filter_size_x)."
              },
              "variant": {
                "label": "Variant",
                "description": "Top-hat variant: white (default) or black."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "total_filter": {
            "name": "Total Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Window width in pixels (odd integer, default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Window height in pixels (odd integer, default = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "unsharp_masking": {
            "name": "Unsharp Masking",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Gaussian sigma used by the blur mask (0.5-20.0, default 0.75)."
              },
              "amount": {
                "label": "Amount",
                "description": "Sharpening amount multiplier applied to residual (default 100.0)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum absolute residual to sharpen (default 0.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "user_defined_weights_filter": {
            "name": "User Defined Weights Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "weights": {
                "label": "Weights",
                "description": "2D kernel weights as nested arrays."
              },
              "kernel_center": {
                "label": "Kernel Center",
                "description": "Kernel center mode: center, upper-left, upper-right, lower-left, lower-right."
              },
              "normalize_weights": {
                "label": "Normalize Weights",
                "description": "If true, normalize by local sum of active weights."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "wiener_filter": {
            "name": "Wiener Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "radius": {
                "label": "Radius",
                "description": "Wiener local window radius in pixels (default 2)."
              },
              "noise_variance": {
                "label": "Noise Variance",
                "description": "Optional additive noise variance. If omitted, estimated from local variance map."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "cloude_pottier_decomposition": {
            "name": "Cloude Pottier Decomposition",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Matrix rasters: diag3 [m11,m22,m33], full3x3 compact [m11,m22,m33,m12,m13,m23], or full row-major 9 rasters."
              },
              "matrix_format": {
                "label": "Matrix Format",
                "description": "Input matrix format: diag3 (default with 3 rasters) or full3x3."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output 3-band raster [H, A, alpha_deg]."
              }
            }
          },
          "enhanced_lee_filter": {
            "name": "Enhanced Lee Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 11)."
              },
              "enl": {
                "label": "Enl",
                "description": "Equivalent number of looks parameter for sigma-ratio weighting (default 4.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "freeman_durden_decomposition": {
            "name": "Freeman Durden Decomposition",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Matrix rasters: diag3 [m11,m22,m33], full3x3 compact [m11,m22,m33,m12,m13,m23], or full row-major 9 rasters."
              },
              "matrix_format": {
                "label": "Matrix Format",
                "description": "Input matrix format: diag3 (default with 3 rasters) or full3x3."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output 3-band raster [surface, double_bounce, volume]."
              },
              "output_clip_mask": {
                "label": "Output Clip Mask",
                "description": "Optional output clip-mask raster (1 where non-physical clipping/renormalization occurred)."
              }
            }
          },
          "frost_filter": {
            "name": "Frost Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "radius": {
                "label": "Radius",
                "description": "Local window radius in pixels (default 2)."
              },
              "damping_factor": {
                "label": "Damping Factor",
                "description": "Frost damping factor controlling exponential decay (default 2.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "gamma_map_filter": {
            "name": "Gamma Map Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "radius": {
                "label": "Radius",
                "description": "Local window radius in pixels (default 2)."
              },
              "enl": {
                "label": "Enl",
                "description": "Equivalent number of looks (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "h_alpha_wisart_classification": {
            "name": "H Alpha Wisart Classification",
            "params": {
              "h_raster": {
                "label": "H Raster",
                "description": "Input entropy (H) raster from Cloude-Pottier decomposition (0-1 range)."
              },
              "alpha_raster": {
                "label": "Alpha Raster",
                "description": "Input alpha (α) raster from Cloude-Pottier decomposition (degrees, 0-90)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject alpha to match H when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster with 9-class labels (1-9)."
              }
            }
          },
          "kuan_filter": {
            "name": "Kuan Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "radius": {
                "label": "Radius",
                "description": "Local window radius in pixels (default 2)."
              },
              "enl": {
                "label": "Enl",
                "description": "Equivalent number of looks (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "refined_lee_filter": {
            "name": "Refined Lee Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Neighborhood width in pixels (odd integer, default 11)."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Neighborhood height in pixels (odd integer, default 11)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, output remains in memory."
              }
            }
          },
          "wisart_iterative_clustering": {
            "name": "Wisart Iterative Clustering",
            "params": {
              "h_raster": {
                "label": "H Raster",
                "description": "Input entropy (H) raster (0-1 range)."
              },
              "alpha_raster": {
                "label": "Alpha Raster",
                "description": "Input alpha (α) raster (degrees, 0-90)."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "Maximum clustering iterations (default 10)."
              },
              "convergence_threshold": {
                "label": "Convergence Threshold",
                "description": "Convergence criterion: fraction of unchanged pixels (default 0.99)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject alpha to match H when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos."
              },
              "output": {
                "label": "Output",
                "description": "Optional output cluster label raster."
              }
            }
          },
          "yamaguchi_4component_decomposition": {
            "name": "Yamaguchi 4component Decomposition",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Matrix rasters: 6 compact [m11,m22,m33,m12,m13,m23] or 9 row-major full 3x3 complex matrix elements."
              },
              "matrix_format": {
                "label": "Matrix Format",
                "description": "Input matrix format: full3x3 (default) for Hermitian matrices with real/imag parts."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output 4-band raster [surface, double_bounce, volume, helix]."
              }
            }
          },
          "ascii_to_las": {
            "name": "Ascii To Las",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of input ASCII file paths."
              },
              "pattern": {
                "label": "Pattern",
                "description": "Field pattern, e.g. 'x,y,z,i,c,rn,nr,sa'."
              },
              "epsg_code": {
                "label": "Epsg Code",
                "description": "EPSG code for output LAS CRS metadata."
              },
              "output_directory": {
                "label": "Output Directory",
                "description": "Optional output directory for generated LAS files."
              }
            }
          },
          "las_to_ascii": {
            "name": "Las To Ascii",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output CSV path (single-input mode only)."
              }
            }
          },
          "las_to_shapefile": {
            "name": "Las To Shapefile",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path for single-input mode."
              },
              "output_multipoint": {
                "label": "Output Multipoint",
                "description": "If true outputs a multipoint geometry with one feature; otherwise outputs one point feature per point."
              }
            }
          },
          "lidar_colourize": {
            "name": "Lidar Colourize",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "image": {
                "label": "Image",
                "description": "Input image raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_join": {
            "name": "Lidar Join",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of input LiDAR paths or typed LiDAR objects."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_shift": {
            "name": "Lidar Shift",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "x_shift": {
                "label": "X Shift",
                "description": "Shift to add to x coordinates."
              },
              "y_shift": {
                "label": "Y Shift",
                "description": "Shift to add to y coordinates."
              },
              "z_shift": {
                "label": "Z Shift",
                "description": "Shift to add to z coordinates."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_tile": {
            "name": "Lidar Tile",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "tile_width": {
                "label": "Tile Width",
                "description": "Tile width in x units (default 1000)."
              },
              "tile_height": {
                "label": "Tile Height",
                "description": "Tile height in y units (default 1000)."
              },
              "origin_x": {
                "label": "Origin X",
                "description": "Grid origin x coordinate (default 0)."
              },
              "origin_y": {
                "label": "Origin Y",
                "description": "Grid origin y coordinate (default 0)."
              },
              "min_points_in_tile": {
                "label": "Min Points In Tile",
                "description": "Minimum points required for writing a tile (default 2)."
              },
              "output_laz_format": {
                "label": "Output Laz Format",
                "description": "If true, writes .laz outputs; otherwise .las (default true)."
              },
              "output_directory": {
                "label": "Output Directory",
                "description": "Optional directory to write tile outputs; defaults to <input_dir>/<input_stem>/."
              }
            }
          },
          "lidar_tophat_transform": {
            "name": "Lidar Tophat Transform",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius used for erosion and dilation."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "recover_flightline_info": {
            "name": "Recover Flightline Info",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "max_time_diff": {
                "label": "Max Time Diff",
                "description": "Maximum within-flightline GPS time gap before starting a new flightline."
              },
              "pt_src_id": {
                "label": "Pt Src Id",
                "description": "If true, write inferred flightline IDs to point_source_id."
              },
              "user_data": {
                "label": "User Data",
                "description": "If true, write inferred flightline IDs to user_data (modulo 256)."
              },
              "rgb": {
                "label": "Rgb",
                "description": "If true, assign a random colour per inferred flightline."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "select_tiles_by_polygon": {
            "name": "Select Tiles By Polygon",
            "params": {
              "input_directory": {
                "label": "Input Directory",
                "description": "Input directory containing LiDAR tiles."
              },
              "output_directory": {
                "label": "Output Directory",
                "description": "Output directory for selected LiDAR tiles."
              },
              "polygons": {
                "label": "Polygons",
                "description": "Input polygon vector path or typed vector object."
              }
            }
          },
          "sort_lidar": {
            "name": "Sort Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "sort_criteria": {
                "label": "Sort Criteria",
                "description": "Sort criteria expression, e.g. 'x 100, y 100, z 10, scan_angle'."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "split_lidar": {
            "name": "Split Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "split_criterion": {
                "label": "Split Criterion",
                "description": "Grouping criterion: num_pts, x, y, z, intensity, class, user_data, point_source_id, scan_angle, or time."
              },
              "interval": {
                "label": "Interval",
                "description": "Bin size for numeric criteria; for num_pts this is points-per-output-file."
              },
              "min_pts": {
                "label": "Min Pts",
                "description": "Minimum points needed before writing a split output file (default 5)."
              },
              "output_directory": {
                "label": "Output Directory",
                "description": "Optional directory for split outputs."
              }
            }
          },
          "classify_buildings_in_lidar": {
            "name": "Classify Buildings In Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "buildings": {
                "label": "Buildings",
                "description": "Input building-footprint polygon vector path or typed vector object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "classify_lidar": {
            "name": "Classify Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighborhood radius (default 2.5)."
              },
              "grd_threshold": {
                "label": "Grd Threshold",
                "description": "Height above local minimum considered ground (default 0.1)."
              },
              "oto_threshold": {
                "label": "Oto Threshold",
                "description": "Height above local minimum considered off-terrain object (default 1.0)."
              },
              "linearity_threshold": {
                "label": "Linearity Threshold",
                "description": "Linearity threshold used in final unclassified screening (default 0.5)."
              },
              "planarity_threshold": {
                "label": "Planarity Threshold",
                "description": "Planarity threshold used in segmentation and refinement (default 0.85)."
              },
              "num_iter": {
                "label": "Num Iter",
                "description": "Number of local RANSAC iterations for planarity/linearity estimates (default 30)."
              },
              "facade_threshold": {
                "label": "Facade Threshold",
                "description": "Neighbor distance used when labeling building facades (default 0.5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "classify_overlap_points": {
            "name": "Classify Overlap Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Grid cell size used for overlap analysis."
              },
              "overlap_criterion": {
                "label": "Overlap Criterion",
                "description": "max scan angle, not min point source id, not min time, or multiple point source IDs."
              },
              "filter": {
                "label": "Filter",
                "description": "If true, remove overlap points; otherwise classify overlap points as class 12."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "clip_lidar_to_polygon": {
            "name": "Clip Lidar To Polygon",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "polygons": {
                "label": "Polygons",
                "description": "Input polygon vector path or typed vector object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "erase_polygon_from_lidar": {
            "name": "Erase Polygon From Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "polygons": {
                "label": "Polygons",
                "description": "Input polygon vector path or typed vector object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "filter_lidar": {
            "name": "Filter Lidar",
            "params": {
              "statement": {
                "label": "Statement",
                "description": "Boolean expression, e.g. '!is_noise && class == 2' or 'NOT is_noise AND class == 2'."
              },
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path for single-input mode."
              }
            }
          },
          "filter_lidar_by_percentile": {
            "name": "Filter Lidar By Percentile",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "percentile": {
                "label": "Percentile",
                "description": "Percentile in [0, 100] (0=lowest, 100=highest)."
              },
              "block_size": {
                "label": "Block Size",
                "description": "Grid block size for local percentile selection (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "filter_lidar_by_reference_surface": {
            "name": "Filter Lidar By Reference Surface",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "ref_surface": {
                "label": "Ref Surface",
                "description": "Reference raster path or typed raster object."
              },
              "query": {
                "label": "Query",
                "description": "Query type: within, <, <=, >, >= (default within)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Absolute z-distance threshold used by query=within."
              },
              "classify": {
                "label": "Classify",
                "description": "If true classify points; otherwise filter and keep only matches."
              },
              "true_class_value": {
                "label": "True Class Value",
                "description": "Class value assigned to matching points in classify mode."
              },
              "false_class_value": {
                "label": "False Class Value",
                "description": "Class value assigned to non-matching points in classify mode."
              },
              "preserve_classes": {
                "label": "Preserve Classes",
                "description": "If true preserve non-matching classes in classify mode."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "filter_lidar_classes": {
            "name": "Filter Lidar Classes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "filter_lidar_noise": {
            "name": "Filter Lidar Noise",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "filter_lidar_scan_angles": {
            "name": "Filter Lidar Scan Angles",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Maximum absolute scan angle (integer LAS units; 1 unit = 0.006°). Required."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "height_above_ground": {
            "name": "Height Above Ground",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "improved_ground_point_filter": {
            "name": "Improved Ground Point Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path."
              },
              "block_size": {
                "label": "Block Size",
                "description": "Grid cell size in xy units."
              },
              "max_building_size": {
                "label": "Max Building Size",
                "description": "Maximum expected building width in xy units."
              },
              "slope_threshold": {
                "label": "Slope Threshold",
                "description": "Minimum edge slope in degrees."
              },
              "elev_threshold": {
                "label": "Elev Threshold",
                "description": "Elevation distance threshold."
              },
              "classify": {
                "label": "Classify",
                "description": "Classify rather than filter points."
              },
              "preserve_classes": {
                "label": "Preserve Classes",
                "description": "Preserve existing classes in classify mode."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "individual_tree_segmentation": {
            "name": "Individual Tree Segmentation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "only_use_veg": {
                "label": "Only Use Veg",
                "description": "If true, process only vegetation classes (default true)."
              },
              "veg_classes": {
                "label": "Veg Classes",
                "description": "Vegetation classes as comma-delimited text or integer array (default '3,4,5')."
              },
              "min_height": {
                "label": "Min Height",
                "description": "Minimum point height for segmentation (default 2.0)."
              },
              "max_height": {
                "label": "Max Height",
                "description": "Optional maximum point height."
              },
              "bandwidth_min": {
                "label": "Bandwidth Min",
                "description": "Minimum horizontal bandwidth (default 1.0)."
              },
              "bandwidth_max": {
                "label": "Bandwidth Max",
                "description": "Maximum horizontal bandwidth (default 6.0)."
              },
              "adaptive_bandwidth": {
                "label": "Adaptive Bandwidth",
                "description": "Estimate per-seed horizontal bandwidth from local crown geometry (default true)."
              },
              "adaptive_neighbors": {
                "label": "Adaptive Neighbors",
                "description": "Neighbour count used for adaptive local density scale (default 24)."
              },
              "adaptive_sector_count": {
                "label": "Adaptive Sector Count",
                "description": "Number of angular sectors for local crown-radius estimation (default 8)."
              },
              "grid_acceleration": {
                "label": "Grid Acceleration",
                "description": "Use MeanShift++-style grid approximation for faster mode updates (default false)."
              },
              "grid_cell_size": {
                "label": "Grid Cell Size",
                "description": "Grid cell size for accelerated mode updates (default 0.5)."
              },
              "grid_refine_exact": {
                "label": "Grid Refine Exact",
                "description": "Run short exact-neighbour refinement after grid acceleration (default false)."
              },
              "grid_refine_iterations": {
                "label": "Grid Refine Iterations",
                "description": "Exact refinement iteration cap after grid mode updates (default 2)."
              },
              "tile_size": {
                "label": "Tile Size",
                "description": "Optional tile size for seed scheduling; <=0 disables tiling (default 0.0)."
              },
              "tile_overlap": {
                "label": "Tile Overlap",
                "description": "Tile overlap width for tiled seed scheduling (default 0.0)."
              },
              "vertical_bandwidth": {
                "label": "Vertical Bandwidth",
                "description": "Vertical kernel bandwidth (default 5.0)."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "Maximum mean-shift iterations per seed (default 30)."
              },
              "convergence_tol": {
                "label": "Convergence Tol",
                "description": "Convergence tolerance for shift magnitude (default 0.05)."
              },
              "min_cluster_points": {
                "label": "Min Cluster Points",
                "description": "Minimum points per retained tree cluster (default 50)."
              },
              "mode_merge_dist": {
                "label": "Mode Merge Dist",
                "description": "Distance threshold for merging converged modes (default 0.8)."
              },
              "threads": {
                "label": "Threads",
                "description": "Thread count override (0 uses default Rayon pool)."
              },
              "simd": {
                "label": "Simd",
                "description": "Enable SIMD-assisted arithmetic in weighting loops (default true)."
              },
              "output_id_mode": {
                "label": "Output Id Mode",
                "description": "Output segment id encoding {rgb|user_data|point_source_id|rgb+user_data|rgb+point_source_id} (default rgb)."
              },
              "output_sidecar_csv": {
                "label": "Output Sidecar Csv",
                "description": "If true, write point_index,segment_id CSV beside lidar output."
              },
              "seed": {
                "label": "Seed",
                "description": "Deterministic seed for colour mapping (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_classify_subset": {
            "name": "Lidar Classify Subset",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base LiDAR path or typed LiDAR object."
              },
              "subset": {
                "label": "Subset",
                "description": "Subset LiDAR path or typed LiDAR object."
              },
              "subset_class_value": {
                "label": "Subset Class Value",
                "description": "Classification value assigned to matched subset points (0-18)."
              },
              "nonsubset_class_value": {
                "label": "Nonsubset Class Value",
                "description": "Optional class for non-matching points (0-18). Use 255 to preserve existing classes."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "3D nearest-neighbour matching tolerance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_elevation_slice": {
            "name": "Lidar Elevation Slice",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "minz": {
                "label": "Minz",
                "description": "Lower bound of the elevation slice (default -infinity)."
              },
              "maxz": {
                "label": "Maxz",
                "description": "Upper bound of the elevation slice (default +infinity)."
              },
              "classify": {
                "label": "Classify",
                "description": "If true, reclassify points instead of filtering them (default false)."
              },
              "in_class_value": {
                "label": "In Class Value",
                "description": "Classification assigned to points inside the slice when classify=true (default 2)."
              },
              "out_class_value": {
                "label": "Out Class Value",
                "description": "Classification assigned to points outside the slice when classify=true (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_remove_outliers": {
            "name": "Lidar Remove Outliers",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighborhood radius for local residual calculation (default 2.0)."
              },
              "elev_diff": {
                "label": "Elev Diff",
                "description": "Absolute elevation residual threshold for outlier detection (default 50.0)."
              },
              "use_median": {
                "label": "Use Median",
                "description": "Use median instead of mean neighborhood elevation."
              },
              "classify": {
                "label": "Classify",
                "description": "If true, classify outliers as class 7/18 instead of removing them."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_segmentation": {
            "name": "Lidar Segmentation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for region growing."
              },
              "num_iterations": {
                "label": "Num Iterations",
                "description": "Number of RANSAC iterations used to detect local planar models."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Number of points sampled per local RANSAC model fit."
              },
              "inlier_threshold": {
                "label": "Inlier Threshold",
                "description": "Residual threshold used to classify points as local plane inliers."
              },
              "acceptable_model_size": {
                "label": "Acceptable Model Size",
                "description": "Minimum number of inliers required for an accepted local plane model."
              },
              "max_planar_slope": {
                "label": "Max Planar Slope",
                "description": "Maximum accepted planar slope in degrees."
              },
              "norm_diff_threshold": {
                "label": "Norm Diff Threshold",
                "description": "Maximum angular difference (degrees) between neighbouring planar normals during growth."
              },
              "max_z_diff": {
                "label": "Max Z Diff",
                "description": "Maximum Z difference allowed while growing a segment."
              },
              "classes": {
                "label": "Classes",
                "description": "If true, do not cross class boundaries while growing segments."
              },
              "ground": {
                "label": "Ground",
                "description": "If true, assigns class=2 to the largest segment and class=1 to other segmented points."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_segmentation_based_filter": {
            "name": "Lidar Segmentation Based Filter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for connected-component growth."
              },
              "norm_diff_threshold": {
                "label": "Norm Diff Threshold",
                "description": "Compatibility parameter for legacy normal-angle checks."
              },
              "max_z_diff": {
                "label": "Max Z Diff",
                "description": "Maximum elevation difference for connected growth."
              },
              "classify_points": {
                "label": "Classify Points",
                "description": "If true, classify points instead of filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "modify_lidar": {
            "name": "Modify Lidar",
            "params": {
              "statement": {
                "label": "Statement",
                "description": "One or more assignment expressions separated by semicolons, e.g. 'z = z + 1; class = if(z > 5, 2, class)'."
              },
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path for single-input mode."
              }
            }
          },
          "normalize_lidar": {
            "name": "Normalize Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "dtm": {
                "label": "Dtm",
                "description": "Input DTM raster path or typed raster object."
              },
              "no_negatives": {
                "label": "No Negatives",
                "description": "Clamp negative normalized heights to zero."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "remove_duplicates": {
            "name": "Remove Duplicates",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "include_z": {
                "label": "Include Z",
                "description": "If true, duplicate detection includes z; otherwise uses x/y only."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "flightline_overlap": {
            "name": "Flightline Overlap",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Grid resolution used to count distinct flightlines per cell."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_block_maximum": {
            "name": "Lidar Block Maximum",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute (elevation/intensity/class/return_number/number_of_returns/scan_angle/time/rgb/user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_block_minimum": {
            "name": "Lidar Block Minimum",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute (elevation/intensity/class/return_number/number_of_returns/scan_angle/time/rgb/user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_construct_vector_tin": {
            "name": "Lidar Construct Vector Tin",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path; in batch mode each input writes a sibling _tin.shp."
              },
              "returns": {
                "label": "Returns",
                "description": "Returns filter: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Optional class values to exclude."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum allowed point elevation."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum allowed point elevation."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Optional maximum allowed triangle edge length."
              }
            }
          },
          "lidar_contour": {
            "name": "Lidar Contour",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs batch mode over LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (.shp/.geojson). In batch mode each input writes a sibling .shp."
              },
              "interval": {
                "label": "Interval",
                "description": "Contour interval (must be > 0)."
              },
              "base_contour": {
                "label": "Base Contour",
                "description": "Base contour offset value."
              },
              "smooth": {
                "label": "Smooth",
                "description": "Compatibility smoothing parameter (accepted for call-shape parity)."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "One of elevation, intensity, scan_angle, time, or user_data."
              },
              "returns": {
                "label": "Returns",
                "description": "Returns filter: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Optional class values to exclude."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum allowed point elevation."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum allowed point elevation."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Optional maximum triangle edge length; longer triangles are skipped."
              }
            }
          },
          "lidar_digital_surface_model": {
            "name": "Lidar Digital Surface Model",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for selecting top-surface candidates."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Optional maximum triangle edge length to suppress long-edge facets."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_hex_bin": {
            "name": "Lidar Hex Bin",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "width": {
                "label": "Width",
                "description": "Hexagon width (distance between opposite sides)."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Grid orientation: h (pointy-up) or v (flat-up)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path."
              }
            }
          },
          "lidar_hillshade": {
            "name": "Lidar Hillshade",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for local normal estimation. Values <= 0 use estimated nominal spacing."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Illumination azimuth in degrees."
              },
              "altitude": {
                "label": "Altitude",
                "description": "Illumination altitude in degrees."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_idw_interpolation": {
            "name": "Lidar Idw Interpolation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "weight": {
                "label": "Weight",
                "description": "IDW exponent (power)."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius; <=0 switches to k-nearest mode."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute to interpolate (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum number of points for k-nearest fallback."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_nearest_neighbour_gridding": {
            "name": "Lidar Nearest Neighbour Gridding",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Maximum nearest-neighbour distance; cells beyond this become NoData."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute to interpolate (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_radial_basis_function_interpolation": {
            "name": "Lidar Radial Basis Function Interpolation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "num_points": {
                "label": "Num Points",
                "description": "Minimum number of neighbours used for local interpolation."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius; <=0 uses only k-nearest mode."
              },
              "func_type": {
                "label": "Func Type",
                "description": "RBF basis type (thinplatespline, polyharmonic, gaussian, multiquadric, inversemultiquadric)."
              },
              "poly_order": {
                "label": "Poly Order",
                "description": "Polynomial trend order used for local correction (none, constant, quadratic)."
              },
              "weight": {
                "label": "Weight",
                "description": "Basis shape parameter/exponent depending on func_type."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute to interpolate (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_sibson_interpolation": {
            "name": "Lidar Sibson Interpolation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute to interpolate (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_thin": {
            "name": "Lidar Thin",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Grid cell size for thinning (default 1.0)."
              },
              "method": {
                "label": "Method",
                "description": "Point selection method per cell: first, last, lowest, highest, nearest (default 'first')."
              },
              "save_filtered": {
                "label": "Save Filtered",
                "description": "If true, also writes filtered-out points and returns their locator in outputs.filtered_path."
              },
              "filtered_output": {
                "label": "Filtered Output",
                "description": "Optional output path for filtered-out points (single-input mode)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_thin_high_density": {
            "name": "Lidar Thin High Density",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "density": {
                "label": "Density",
                "description": "Target point density threshold in points per square unit."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Grid resolution used for x/y and z binning (default 1.0)."
              },
              "save_filtered": {
                "label": "Save Filtered",
                "description": "If true, writes filtered-out points and returns outputs.filtered_path."
              },
              "filtered_output": {
                "label": "Filtered Output",
                "description": "Optional output path for filtered-out points in single-input mode."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_tile_footprint": {
            "name": "Lidar Tile Footprint",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs over all LiDAR files in current directory."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path for footprints."
              },
              "output_hulls": {
                "label": "Output Hulls",
                "description": "If true writes convex-hull footprints; otherwise writes axis-aligned bounding boxes."
              }
            }
          },
          "lidar_tin_gridding": {
            "name": "Lidar Tin Gridding",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Optional maximum triangle edge length to suppress long-edge facets."
              },
              "interpolation_parameter": {
                "label": "Interpolation Parameter",
                "description": "Point attribute to interpolate (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              },
              "triangulation_backend": {
                "label": "Triangulation Backend",
                "description": "Triangulation backend selection: auto, delaunator, or wbtopology."
              },
              "triangulation_auto_threshold": {
                "label": "Triangulation Auto Threshold",
                "description": "When backend=auto, switch to wbtopology at this sample count (default disabled; set explicitly to enable)."
              },
              "triangulation_epsilon": {
                "label": "Triangulation Epsilon",
                "description": "Epsilon used by wbtopology backend duplicate handling (default 1e-12)."
              },
              "triangulation_thin_cell_size": {
                "label": "Triangulation Thin Cell Size",
                "description": "Optional pre-thinning cell size for triangulation samples; values > 0 enable thinning and 0 disables it."
              },
              "triangulation_thin_method": {
                "label": "Triangulation Thin Method",
                "description": "Representative-point method for thinning: nearest_center, min_value, or max_value."
              }
            }
          },
          "colourize_based_on_class": {
            "name": "Colourize Based On Class",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "intensity_blending_amount": {
                "label": "Intensity Blending Amount",
                "description": "Percent blend [0,100] between class colour and intensity."
              },
              "clr_str": {
                "label": "Clr Str",
                "description": "Optional class-colour overrides, e.g. '2:(184,167,108);5:#9ab86c'."
              },
              "use_unique_clrs_for_buildings": {
                "label": "Use Unique Clrs For Buildings",
                "description": "If true, assigns unique colours to connected building clusters."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius used for building-cluster colouring."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "colourize_based_on_point_returns": {
            "name": "Colourize Based On Point Returns",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "intensity_blending_amount": {
                "label": "Intensity Blending Amount",
                "description": "Percent blend [0,100] between return colour and intensity."
              },
              "only_ret_colour": {
                "label": "Only Ret Colour",
                "description": "Colour for only-return points."
              },
              "first_ret_colour": {
                "label": "First Ret Colour",
                "description": "Colour for first-return points in multi-return pulses."
              },
              "intermediate_ret_colour": {
                "label": "Intermediate Ret Colour",
                "description": "Colour for intermediate-return points."
              },
              "last_ret_colour": {
                "label": "Last Ret Colour",
                "description": "Colour for last-return points in multi-return pulses."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "find_flightline_edge_points": {
            "name": "Find Flightline Edge Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "individual_tree_detection": {
            "name": "Individual Tree Detection",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "min_search_radius": {
                "label": "Min Search Radius",
                "description": "Minimum search radius in map units (default 1.0)."
              },
              "min_height": {
                "label": "Min Height",
                "description": "Minimum height to consider points (default 0.0)."
              },
              "max_search_radius": {
                "label": "Max Search Radius",
                "description": "Maximum search radius; if not set uses min_search_radius."
              },
              "max_height": {
                "label": "Max Height",
                "description": "Maximum height; if not set uses min_height."
              },
              "only_use_veg": {
                "label": "Only Use Veg",
                "description": "If true, process only vegetation classes (default true)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector shapefile path."
              }
            }
          },
          "lidar_eigenvalue_features": {
            "name": "Lidar Eigenvalue Features",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "num_neighbours": {
                "label": "Num Neighbours",
                "description": "Optional target neighbourhood size (excluding the point itself)."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Optional maximum search radius for neighbourhood collection."
              },
              "output": {
                "label": "Output",
                "description": "Optional output .eigen path in single-input mode."
              }
            }
          },
          "lidar_histogram": {
            "name": "Lidar Histogram",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output HTML path for histogram report."
              },
              "parameter": {
                "label": "Parameter",
                "description": "One of elevation, intensity, scan angle, class, or time."
              },
              "clip_percent": {
                "label": "Clip Percent",
                "description": "Percentile clip amount in [0,50] for lower/upper tails."
              }
            }
          },
          "lidar_info": {
            "name": "Lidar Info",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output report path (.html/.txt)."
              },
              "show_point_density": {
                "label": "Show Point Density",
                "description": "If true includes approximate bbox point density metrics."
              },
              "show_vlrs": {
                "label": "Show Vlrs",
                "description": "Compatibility flag; reserved for future detailed metadata output."
              },
              "show_geokeys": {
                "label": "Show Geokeys",
                "description": "Compatibility flag; reserved for future detailed CRS-key output."
              }
            }
          },
          "lidar_kappa": {
            "name": "Lidar Kappa",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Classification LiDAR path or typed LiDAR object."
              },
              "input2": {
                "label": "Input2",
                "description": "Reference LiDAR path or typed LiDAR object."
              },
              "report": {
                "label": "Report",
                "description": "Output HTML report path."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Grid resolution for spatial class-agreement output."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              },
              "output_class_accuracy": {
                "label": "Output Class Accuracy",
                "description": "Compatibility flag retained for legacy parity; the agreement raster is always produced."
              }
            }
          },
          "lidar_point_density": {
            "name": "Lidar Point Density",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output cell size."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for point counting."
              },
              "returns_included": {
                "label": "Returns Included",
                "description": "Return filtering mode: all, first, or last."
              },
              "excluded_classes": {
                "label": "Excluded Classes",
                "description": "Classes to exclude (array or comma-delimited string)."
              },
              "min_elev": {
                "label": "Min Elev",
                "description": "Minimum elevation threshold used for point inclusion filtering."
              },
              "max_elev": {
                "label": "Max Elev",
                "description": "Maximum elevation threshold used for point inclusion filtering."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "lidar_point_return_analysis": {
            "name": "Lidar Point Return Analysis",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "create_output": {
                "label": "Create Output",
                "description": "If true writes a classified LiDAR QC output."
              },
              "output": {
                "label": "Output",
                "description": "Optional LiDAR output path used when create_output=true."
              },
              "report": {
                "label": "Report",
                "description": "Optional text report output path."
              }
            }
          },
          "lidar_point_stats": {
            "name": "Lidar Point Stats",
            "params": {
              "input": {
                "label": "Input",
                "description": "Optional input LiDAR path or typed LiDAR object. If omitted, runs in batch mode over LiDAR files in current directory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Output grid resolution."
              },
              "num_points": {
                "label": "Num Points",
                "description": "Create point-count raster."
              },
              "num_pulses": {
                "label": "Num Pulses",
                "description": "Create early-return pulse-count raster."
              },
              "avg_points_per_pulse": {
                "label": "Avg Points Per Pulse",
                "description": "Create average points-per-pulse raster."
              },
              "z_range": {
                "label": "Z Range",
                "description": "Create elevation-range raster."
              },
              "intensity_range": {
                "label": "Intensity Range",
                "description": "Create intensity-range raster."
              },
              "predominant_class": {
                "label": "Predominant Class",
                "description": "Create predominant-class raster."
              },
              "output_directory": {
                "label": "Output Directory",
                "description": "Optional output directory for generated rasters."
              }
            }
          },
          "lidar_ransac_planes": {
            "name": "Lidar Ransac Planes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for local plane fitting."
              },
              "num_iterations": {
                "label": "Num Iterations",
                "description": "Number of RANSAC iterations per point."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Number of sampled neighbour points per RANSAC iteration."
              },
              "inlier_threshold": {
                "label": "Inlier Threshold",
                "description": "Maximum point-to-plane residual for inliers."
              },
              "acceptable_model_size": {
                "label": "Acceptable Model Size",
                "description": "Minimum number of inlier points required for a planar model."
              },
              "max_planar_slope": {
                "label": "Max Planar Slope",
                "description": "Maximum accepted plane slope in degrees."
              },
              "classify": {
                "label": "Classify",
                "description": "If true classify planar vs non-planar points instead of filtering."
              },
              "only_last_returns": {
                "label": "Only Last Returns",
                "description": "If true, only use late returns in model fitting."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "lidar_rooftop_analysis": {
            "name": "Lidar Rooftop Analysis",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input LiDAR paths or typed LiDAR objects."
              },
              "building_footprints": {
                "label": "Building Footprints",
                "description": "Building-footprint polygon layer."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for local roof analysis."
              },
              "inlier_threshold": {
                "label": "Inlier Threshold",
                "description": "Maximum residual for local planar support."
              },
              "acceptable_model_size": {
                "label": "Acceptable Model Size",
                "description": "Minimum segment size."
              },
              "max_planar_slope": {
                "label": "Max Planar Slope",
                "description": "Maximum slope for rooftop facets in degrees."
              },
              "norm_diff_threshold": {
                "label": "Norm Diff Threshold",
                "description": "Maximum angular difference between neighbouring normals in degrees."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Illumination azimuth for hillshade-style facet lighting."
              },
              "altitude": {
                "label": "Altitude",
                "description": "Illumination altitude for hillshade-style facet lighting."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path."
              }
            }
          },
          "normal_vectors": {
            "name": "Normal Vectors",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR path or typed LiDAR object."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighbourhood radius for local plane fitting. Values <= 0 use an estimated nominal spacing."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path."
              }
            }
          },
          "snap_events_to_routes": {
            "name": "Snap Events To Routes",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "events": {
                "label": "Events",
                "description": "Input event point layer."
              },
              "max_offset_distance": {
                "label": "Max Offset Distance",
                "description": "Optional maximum route offset distance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output snapped event point vector path."
              }
            }
          },
          "locate_points_along_routes": {
            "name": "Locate Points Along Routes",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "points": {
                "label": "Points",
                "description": "Input point layer to locate along routes."
              },
              "max_offset_distance": {
                "label": "Max Offset Distance",
                "description": "Optional maximum point-to-route offset distance."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "points_along_lines": {
            "name": "Points Along Lines",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line layer."
              },
              "spacing": {
                "label": "Spacing",
                "description": "Spacing distance between points."
              },
              "include_end": {
                "label": "Include End",
                "description": "Include line endpoints (default true)."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "route_calibrate": {
            "name": "Route Calibrate",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "control_points": {
                "label": "Control Points",
                "description": "Input control-point layer."
              },
              "control_measure_field": {
                "label": "Control Measure Field",
                "description": "Control-point field containing known measure values."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Optional route identifier field in routes. Defaults to feature FID."
              },
              "control_route_id_field": {
                "label": "Control Route Id Field",
                "description": "Optional route identifier field in control points. Defaults to feature FID."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Output field for route start measure (default 'from_measure')."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Output field for route end measure (default 'to_measure')."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Maximum control-point offset distance from route geometry (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Output calibrated route layer."
              }
            }
          },
          "route_event_lines_from_layer": {
            "name": "Route Event Lines From Layer",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "events": {
                "label": "Events",
                "description": "Input event vector layer."
              },
              "event_route_field": {
                "label": "Event Route Field",
                "description": "Event-layer field containing route identifiers."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Event-layer field containing start measures."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Event-layer field containing end measures."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Optional route-layer field containing route identifiers. Defaults to feature FID."
              },
              "write_event_fid": {
                "label": "Write Event Fid",
                "description": "Write EVENT_FID to preserve source event feature IDs (default true)."
              },
              "write_event_xy": {
                "label": "Write Event Xy",
                "description": "Write source event geometry X/Y attributes (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path."
              }
            }
          },
          "route_event_lines_from_table": {
            "name": "Route Event Lines From Table",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "events": {
                "label": "Events",
                "description": "Input CSV event table path."
              },
              "event_route_field": {
                "label": "Event Route Field",
                "description": "CSV field containing route identifiers."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "CSV field containing start measures."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "CSV field containing end measures."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Optional route-layer field containing route identifiers. Defaults to feature FID."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path."
              }
            }
          },
          "route_event_merge": {
            "name": "Route Event Merge",
            "params": {
              "events": {
                "label": "Events",
                "description": "Input event layer containing route intervals."
              },
              "event_route_field": {
                "label": "Event Route Field",
                "description": "Event-layer route identifier field."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Event-layer interval start field."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Event-layer interval end field."
              },
              "group_fields": {
                "label": "Group Fields",
                "description": "Optional comma-delimited fields used for merge compatibility. Defaults to all non-measure fields."
              },
              "gap_tolerance": {
                "label": "Gap Tolerance",
                "description": "Maximum gap allowed for adjacency merge (default 0.0)."
              },
              "conflict_mode": {
                "label": "Conflict Mode",
                "description": "Overlap handling mode: error|skip (default error)."
              },
              "output": {
                "label": "Output",
                "description": "Output merged-event layer."
              }
            }
          },
          "route_event_overlay": {
            "name": "Route Event Overlay",
            "params": {
              "primary_events": {
                "label": "Primary Events",
                "description": "Primary event layer."
              },
              "overlay_events": {
                "label": "Overlay Events",
                "description": "Overlay event layer."
              },
              "primary_route_field": {
                "label": "Primary Route Field",
                "description": "Primary layer route identifier field."
              },
              "primary_from_measure_field": {
                "label": "Primary From Measure Field",
                "description": "Primary layer interval start field."
              },
              "primary_to_measure_field": {
                "label": "Primary To Measure Field",
                "description": "Primary layer interval end field."
              },
              "overlay_route_field": {
                "label": "Overlay Route Field",
                "description": "Overlay layer route identifier field."
              },
              "overlay_from_measure_field": {
                "label": "Overlay From Measure Field",
                "description": "Overlay layer interval start field."
              },
              "overlay_to_measure_field": {
                "label": "Overlay To Measure Field",
                "description": "Overlay layer interval end field."
              },
              "min_overlap_length": {
                "label": "Min Overlap Length",
                "description": "Minimum overlap length to keep (default 0.0)."
              },
              "output": {
                "label": "Output",
                "description": "Output overlay layer."
              }
            }
          },
          "route_event_points_from_layer": {
            "name": "Route Event Points From Layer",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "events": {
                "label": "Events",
                "description": "Input event vector layer."
              },
              "event_route_field": {
                "label": "Event Route Field",
                "description": "Event-layer field containing route identifiers."
              },
              "measure_field": {
                "label": "Measure Field",
                "description": "Event-layer field containing point-event measures."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Optional route-layer field containing route identifiers. Defaults to feature FID."
              },
              "write_event_fid": {
                "label": "Write Event Fid",
                "description": "Write EVENT_FID to preserve source event feature IDs (default true)."
              },
              "write_event_xy": {
                "label": "Write Event Xy",
                "description": "Write source event geometry X/Y attributes (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "route_event_points_from_table": {
            "name": "Route Event Points From Table",
            "params": {
              "routes": {
                "label": "Routes",
                "description": "Input route line layer."
              },
              "events": {
                "label": "Events",
                "description": "Input CSV event table path."
              },
              "event_route_field": {
                "label": "Event Route Field",
                "description": "CSV field containing route identifiers."
              },
              "measure_field": {
                "label": "Measure Field",
                "description": "CSV field containing point-event measures."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Optional route-layer field containing route identifiers. Defaults to feature FID."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "route_event_split": {
            "name": "Route Event Split",
            "params": {
              "events": {
                "label": "Events",
                "description": "Input event layer containing route intervals."
              },
              "boundaries": {
                "label": "Boundaries",
                "description": "Input boundary layer containing route measure breakpoints."
              },
              "event_route_field": {
                "label": "Event Route Field",
                "description": "Event-layer route identifier field."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Event-layer interval start field."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Event-layer interval end field."
              },
              "boundary_route_field": {
                "label": "Boundary Route Field",
                "description": "Boundary-layer route identifier field."
              },
              "boundary_measure_field": {
                "label": "Boundary Measure Field",
                "description": "Boundary-layer measure field."
              },
              "min_segment_length": {
                "label": "Min Segment Length",
                "description": "Optional minimum split segment length to keep (default 0.0)."
              },
              "output": {
                "label": "Output",
                "description": "Output split-event layer."
              }
            }
          },
          "route_measure_qa": {
            "name": "Route Measure Qa",
            "params": {
              "events": {
                "label": "Events",
                "description": "Input event layer containing route intervals."
              },
              "route_field": {
                "label": "Route Field",
                "description": "Route identifier field."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Interval start field."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Interval end field."
              },
              "gap_tolerance": {
                "label": "Gap Tolerance",
                "description": "Gap tolerance (default 0.0)."
              },
              "overlap_tolerance": {
                "label": "Overlap Tolerance",
                "description": "Overlap tolerance (default 0.0)."
              },
              "output": {
                "label": "Output",
                "description": "Output QA diagnostics layer."
              }
            }
          },
          "route_recalibrate": {
            "name": "Route Recalibrate",
            "params": {
              "original_routes": {
                "label": "Original Routes",
                "description": "Reference routes containing prior calibrated measures."
              },
              "edited_routes": {
                "label": "Edited Routes",
                "description": "Edited routes to recalibrate."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Optional shared route identifier field. Defaults to feature FID."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Measure-start field name (default 'from_measure')."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Measure-end field name (default 'to_measure')."
              },
              "output": {
                "label": "Output",
                "description": "Output recalibrated route layer."
              }
            }
          },
          "build_network_topology": {
            "name": "Build Network Topology",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used while detecting and splitting intersections."
              },
              "output": {
                "label": "Output",
                "description": "Output topologically noded edge vector path."
              },
              "nodes_output": {
                "label": "Nodes Output",
                "description": "Optional output node vector path."
              }
            }
          },
          "closest_facility_network": {
            "name": "Closest Facility Network",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "incidents": {
                "label": "Incidents",
                "description": "Incident/demand point layer."
              },
              "facilities": {
                "label": "Facilities",
                "description": "Facility/supply point layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from incident/facility points to nearest network node."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (true/1/yes means from first to second vertex only)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "output": {
                "label": "Output",
                "description": "Output closest-facility route line vector path."
              }
            }
          },
          "generate_network_nodes": {
            "name": "Generate Network Nodes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "output": {
                "label": "Output",
                "description": "Output node point vector path."
              }
            }
          },
          "k_shortest_paths_network": {
            "name": "K Shortest Paths Network",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "start_x": {
                "label": "Start X",
                "description": "Start x coordinate."
              },
              "start_y": {
                "label": "Start Y",
                "description": "Start y coordinate."
              },
              "end_x": {
                "label": "End X",
                "description": "End x coordinate."
              },
              "end_y": {
                "label": "End Y",
                "description": "End y coordinate."
              },
              "k": {
                "label": "K",
                "description": "Number of shortest paths to return."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from start/end coordinates to nearest network node."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (true/1/yes means from first to second vertex only)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path."
              }
            }
          },
          "location_allocation_network": {
            "name": "Location Allocation Network",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "demand_points": {
                "label": "Demand Points",
                "description": "Demand point layer to allocate."
              },
              "facilities": {
                "label": "Facilities",
                "description": "Candidate facility point layer."
              },
              "facility_count": {
                "label": "Facility Count",
                "description": "Number of facilities to select (k)."
              },
              "solver_mode": {
                "label": "Solver Mode",
                "description": "Solver mode: auto, greedy, or exact (exact is intended for smaller problems)."
              },
              "demand_weight_field": {
                "label": "Demand Weight Field",
                "description": "Optional numeric demand weight field in demand_points (default weight=1)."
              },
              "facility_capacity_field": {
                "label": "Facility Capacity Field",
                "description": "Optional numeric capacity field in facilities; capacity is consumed by demand_weight_field values."
              },
              "required_facility_field": {
                "label": "Required Facility Field",
                "description": "Optional boolean facility field marking candidates that must be selected."
              },
              "forbidden_facility_field": {
                "label": "Forbidden Facility Field",
                "description": "Optional boolean facility field marking candidates that must not be selected."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from demand/facility points to nearest network node."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (true/1/yes means from first to second vertex only)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "output": {
                "label": "Output",
                "description": "Output allocated route line vector path."
              }
            }
          },
          "map_matching_v1": {
            "name": "Map Matching V1",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "trajectory_points": {
                "label": "Trajectory Points",
                "description": "Input trajectory point layer."
              },
              "timestamp_field": {
                "label": "Timestamp Field",
                "description": "Trajectory field used for time ordering."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Optional candidate search radius around each trajectory point."
              },
              "candidate_k": {
                "label": "Candidate K",
                "description": "Optional number of nearest candidates retained per point."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance for snapping trajectory points to network nodes."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "matched_points_output": {
                "label": "Matched Points Output",
                "description": "Optional output vector path for per-point diagnostics."
              },
              "match_report": {
                "label": "Match Report",
                "description": "Optional JSON output path for summary diagnostics."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path for inferred route."
              }
            }
          },
          "multimodal_od_cost_matrix": {
            "name": "Multimodal Od Cost Matrix",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer."
              },
              "mode_field": {
                "label": "Mode Field",
                "description": "Line attribute field that identifies travel mode per segment."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin/destination points to nearest network node."
              },
              "default_mode_speed": {
                "label": "Default Mode Speed",
                "description": "Default mode speed in coordinate-units per time unit (default: 1)."
              },
              "mode_speed_overrides": {
                "label": "Mode Speed Overrides",
                "description": "Optional comma-separated mode:speed overrides (for example: walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Allowed Modes",
                "description": "Optional comma-separated allow-list of modes to include in routing."
              },
              "transfer_penalty": {
                "label": "Transfer Penalty",
                "description": "Optional additive penalty applied each time the route changes mode."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics when using direct temporal input."
              },
              "scenario_bundle_csv": {
                "label": "Scenario Bundle Csv",
                "description": "Optional CSV listing named temporal scenarios for comparative multi-scenario OD output."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "multimodal_routes_from_od": {
            "name": "Multimodal Routes From Od",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer."
              },
              "mode_field": {
                "label": "Mode Field",
                "description": "Line attribute field that identifies travel mode per segment."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin/destination points to nearest network node."
              },
              "default_mode_speed": {
                "label": "Default Mode Speed",
                "description": "Default mode speed in coordinate-units per time unit (default: 1)."
              },
              "mode_speed_overrides": {
                "label": "Mode Speed Overrides",
                "description": "Optional comma-separated mode:speed overrides (for example: walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Allowed Modes",
                "description": "Optional comma-separated allow-list of modes to include in routing."
              },
              "transfer_penalty": {
                "label": "Transfer Penalty",
                "description": "Optional additive penalty applied each time the route changes mode."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics when using direct temporal input."
              },
              "scenario_bundle_csv": {
                "label": "Scenario Bundle Csv",
                "description": "Optional CSV listing named temporal scenarios for comparative multi-scenario route output."
              },
              "output": {
                "label": "Output",
                "description": "Output route line vector path."
              }
            }
          },
          "multimodal_shortest_path": {
            "name": "Multimodal Shortest Path",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "start_x": {
                "label": "Start X",
                "description": "Start x coordinate."
              },
              "start_y": {
                "label": "Start Y",
                "description": "Start y coordinate."
              },
              "end_x": {
                "label": "End X",
                "description": "End x coordinate."
              },
              "end_y": {
                "label": "End Y",
                "description": "End y coordinate."
              },
              "mode_field": {
                "label": "Mode Field",
                "description": "Line attribute field that identifies travel mode per segment."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from start/end coordinates to nearest network node."
              },
              "default_mode_speed": {
                "label": "Default Mode Speed",
                "description": "Default mode speed in coordinate-units per time unit (default: 1)."
              },
              "mode_speed_overrides": {
                "label": "Mode Speed Overrides",
                "description": "Optional comma-separated mode:speed overrides (for example: walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Allowed Modes",
                "description": "Optional comma-separated allow-list of modes to include in routing."
              },
              "transfer_penalty": {
                "label": "Transfer Penalty",
                "description": "Optional additive penalty applied each time the route changes mode."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path."
              }
            }
          },
          "network_accessibility_metrics": {
            "name": "Network Accessibility Metrics",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin/destination points to nearest network node."
              },
              "impedance_cutoff": {
                "label": "Impedance Cutoff",
                "description": "Optional maximum distance threshold for counting reachable destinations (default: infinite)."
              },
              "decay_function": {
                "label": "Decay Function",
                "description": "Optional decay function: 'none' (default), 'linear', or 'exponential' for distance-weighted accessibility."
              },
              "decay_parameter": {
                "label": "Decay Parameter",
                "description": "Optional decay parameter (lambda for exponential, rate for linear)."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "parallel_execution": {
                "label": "Parallel Execution",
                "description": "If true (default), evaluate origins in parallel for faster accessibility computation."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (origins with accessibility metrics)."
              }
            }
          },
          "network_centrality_metrics": {
            "name": "Network Centrality Metrics",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from graph construction (true/1/yes blocks)."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "network_connected_components": {
            "name": "Network Connected Components",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path."
              }
            }
          },
          "network_node_degree": {
            "name": "Network Node Degree",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "network_od_cost_matrix": {
            "name": "Network Od Cost Matrix",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin/destination points to nearest network node."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "network_routes_from_od": {
            "name": "Network Routes From Od",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin/destination points to nearest network node."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "output": {
                "label": "Output",
                "description": "Output route line vector path."
              }
            }
          },
          "network_service_area": {
            "name": "Network Service Area",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "max_cost": {
                "label": "Max Cost",
                "description": "Maximum reachable path cost."
              },
              "ring_costs": {
                "label": "Ring Costs",
                "description": "Optional comma-separated ring thresholds for multi-ring outputs (for example: 5,10,15)."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin points to nearest network node."
              },
              "output_mode": {
                "label": "Output Mode",
                "description": "Output mode: 'nodes' (default), 'edges' for cost-trimmed reachable edge segments, or 'polygons' for per-origin isochrone-like polygons from reachable edge envelopes."
              },
              "polygon_merge_origins": {
                "label": "Polygon Merge Origins",
                "description": "If true and output_mode='polygons', dissolve overlapping origin polygons into merged coverage per ring instead of emitting one polygon per origin."
              },
              "mode_field": {
                "label": "Mode Field",
                "description": "Optional line attribute field identifying travel mode per segment; enables mode-aware service-area costs."
              },
              "default_mode_speed": {
                "label": "Default Mode Speed",
                "description": "Default mode speed in coordinate-units per time unit when mode_field is provided (default: 1)."
              },
              "mode_speed_overrides": {
                "label": "Mode Speed Overrides",
                "description": "Optional comma-separated mode:speed overrides (for example: walk:1.4,drive:12)."
              },
              "allowed_modes": {
                "label": "Allowed Modes",
                "description": "Optional comma-separated allow-list of modes to include when mode_field is provided."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "snapped_origins_output": {
                "label": "Snapped Origins Output",
                "description": "Optional output vector path for internal snapped origin anchor points used to seed traversal."
              },
              "output": {
                "label": "Output",
                "description": "Output service-area vector path."
              }
            }
          },
          "network_topology_audit": {
            "name": "Network Topology Audit",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked edges to exclude from analysis."
              },
              "report": {
                "label": "Report",
                "description": "Optional JSON output path for the audit summary report."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path for per-node diagnostics."
              }
            }
          },
          "od_sensitivity_analysis": {
            "name": "Od Sensitivity Analysis",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "origins": {
                "label": "Origins",
                "description": "Origin point layer."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Required numeric line field used as an impedance multiplier for perturbation analysis."
              },
              "impedance_disturbance_range": {
                "label": "Impedance Disturbance Range",
                "description": "Range for cost perturbation as 'min_factor,max_factor' (e.g., '0.8,1.2' for ±20% variation)."
              },
              "monte_carlo_samples": {
                "label": "Monte Carlo Samples",
                "description": "Number of Monte Carlo samples for perturbation analysis (default 1, max 100)."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from origin/destination points to nearest network node."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges."
              },
              "node_cost_points": {
                "label": "Node Cost Points",
                "description": "Optional point layer providing per-node entry costs (e.g., intersection delay)."
              },
              "node_cost_field": {
                "label": "Node Cost Field",
                "description": "Numeric field in node_cost_points containing non-negative per-node costs."
              },
              "node_cost_snap_distance": {
                "label": "Node Cost Snap Distance",
                "description": "Optional max distance from each node-cost point to a network node for assignment."
              },
              "parallel_execution": {
                "label": "Parallel Execution",
                "description": "If true (default), evaluates origin searches in parallel for baseline and perturbed OD runs."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path with OD pairs and sensitivity statistics."
              }
            }
          },
          "shortest_path_network": {
            "name": "Shortest Path Network",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line network layer."
              },
              "start_x": {
                "label": "Start X",
                "description": "Start x coordinate."
              },
              "start_y": {
                "label": "Start Y",
                "description": "Start y coordinate."
              },
              "end_x": {
                "label": "End X",
                "description": "End x coordinate."
              },
              "end_y": {
                "label": "End Y",
                "description": "End y coordinate."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional node snapping tolerance for graph construction."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional max distance from start/end coordinates to nearest network node."
              },
              "edge_cost_field": {
                "label": "Edge Cost Field",
                "description": "Optional numeric line field used as an impedance multiplier for segment length."
              },
              "one_way_field": {
                "label": "One Way Field",
                "description": "Optional line field marking one-way digitized edges (supports FT/TF/B plus legacy boolean values)."
              },
              "blocked_field": {
                "label": "Blocked Field",
                "description": "Optional line field marking blocked/closed edges to exclude from routing (true/1/yes blocks)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier point layer; nearest network nodes are blocked from traversal."
              },
              "barrier_snap_distance": {
                "label": "Barrier Snap Distance",
                "description": "Optional max distance from each barrier point to a network node for blocking."
              },
              "turn_penalty": {
                "label": "Turn Penalty",
                "description": "Optional additive cost applied to non-straight turns at network nodes."
              },
              "u_turn_penalty": {
                "label": "U Turn Penalty",
                "description": "Optional additive cost applied to U-turn transitions."
              },
              "forbid_u_turns": {
                "label": "Forbid U Turns",
                "description": "If true, disallow U-turn transitions."
              },
              "forbid_left_turns": {
                "label": "Forbid Left Turns",
                "description": "If true, disallow left-turn transitions."
              },
              "forbid_right_turns": {
                "label": "Forbid Right Turns",
                "description": "If true, disallow right-turn transitions."
              },
              "turn_restrictions_csv": {
                "label": "Turn Restrictions Csv",
                "description": "Optional CSV of turn transitions using columns prev_x,prev_y,node_x,node_y,next_x,next_y. Optional columns: forbidden (default true when no turn_cost column is provided) and turn_cost (or penalty/cost/extra_cost) for per-turn additive cost."
              },
              "temporal_cost_profile": {
                "label": "Temporal Cost Profile",
                "description": "Optional CSV defining time-dependent edge costs (columns: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Temporal Edge Id Field",
                "description": "Optional network field used to match temporal_cost_profile edge_id values (default EDGE_ID)."
              },
              "departure_time": {
                "label": "Departure Time",
                "description": "Optional RFC3339 departure time used for temporal profile lookup."
              },
              "temporal_mode": {
                "label": "Temporal Mode",
                "description": "Optional temporal interpretation mode: multiplier or absolute."
              },
              "temporal_fallback": {
                "label": "Temporal Fallback",
                "description": "Optional fallback when temporal row is missing: static_cost or error."
              },
              "temporal_profile_report": {
                "label": "Temporal Profile Report",
                "description": "Optional JSON output path for temporal profile diagnostics (coverage, unmatched edges, fallback usage)."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path."
              }
            }
          },
          "split_lines_at_intersections": {
            "name": "Split Lines At Intersections",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line layer to split at intersections."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by split operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output split line vector path."
              }
            }
          },
          "snap_points_to_network": {
            "name": "Snap Points To Network",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input point layer to be snapped."
              },
              "network": {
                "label": "Network",
                "description": "Input network line layer."
              },
              "max_snap_distance": {
                "label": "Max Snap Distance",
                "description": "Optional maximum snapping distance in map units."
              },
              "keep_unsnapped": {
                "label": "Keep Unsnapped",
                "description": "If true (default), retains points that cannot be snapped within tolerance."
              },
              "output": {
                "label": "Output",
                "description": "Output snapped point vector path."
              }
            }
          },
          "transfer_attributes": {
            "name": "Transfer Attributes",
            "params": {
              "target": {
                "label": "Target",
                "description": "Target layer receiving transferred attributes."
              },
              "source": {
                "label": "Source",
                "description": "Source layer providing attributes."
              },
              "predicate": {
                "label": "Predicate",
                "description": "Spatial predicate: intersects, within, contains, touches, crosses, overlaps, within_distance."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold when predicate=within_distance."
              },
              "strategy": {
                "label": "Strategy",
                "description": "Transfer strategy: first, last, count, sum, mean, min, max."
              },
              "prefix": {
                "label": "Prefix",
                "description": "Prefix for transferred source fields (default SRC_)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "travelling_salesman_problem": {
            "name": "Travelling Salesman Problem",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "duration": {
                "label": "Duration",
                "description": "Maximum optimization duration in seconds."
              },
              "output": {
                "label": "Output",
                "description": "Optional output polyline path."
              }
            }
          },
          "vehicle_routing_cvrp": {
            "name": "Vehicle Routing Cvrp",
            "params": {
              "network": {
                "label": "Network",
                "description": "Input line network layer (validated for contract parity)."
              },
              "depot_points": {
                "label": "Depot Points",
                "description": "Depot point layer; each point can contribute one or more vehicles."
              },
              "stop_points": {
                "label": "Stop Points",
                "description": "Delivery stop point layer."
              },
              "demand_field": {
                "label": "Demand Field",
                "description": "Numeric demand field in stop_points (default: demand)."
              },
              "priority_field": {
                "label": "Priority Field",
                "description": "Optional stop priority field using values like required/high/normal/low or numeric ranks."
              },
              "allowed_vehicle_profiles_field": {
                "label": "Allowed Vehicle Profiles Field",
                "description": "Optional stop field listing compatible vehicle profiles (comma/semicolon/pipe-delimited)."
              },
              "allowed_route_classes_field": {
                "label": "Allowed Route Classes Field",
                "description": "Optional alias of allowed_vehicle_profiles_field for route-class compatibility rules."
              },
              "depot_id_field": {
                "label": "Depot Id Field",
                "description": "Optional depot ID field used in route/assignment outputs."
              },
              "vehicle_count_field": {
                "label": "Vehicle Count Field",
                "description": "Optional depot field for number of vehicles spawned at each depot."
              },
              "vehicle_capacity_field": {
                "label": "Vehicle Capacity Field",
                "description": "Optional depot field overriding vehicle_capacity per depot/vehicle template."
              },
              "vehicle_fixed_cost_field": {
                "label": "Vehicle Fixed Cost Field",
                "description": "Optional depot field overriding vehicle_fixed_cost per depot/vehicle template."
              },
              "travel_speed_field": {
                "label": "Travel Speed Field",
                "description": "Optional depot field overriding travel_speed per depot/vehicle template."
              },
              "max_route_distance_field": {
                "label": "Max Route Distance Field",
                "description": "Optional depot field overriding max_route_distance per depot/vehicle template."
              },
              "max_route_time_field": {
                "label": "Max Route Time Field",
                "description": "Optional depot field overriding max_route_time per depot/vehicle template."
              },
              "vehicle_profile_field": {
                "label": "Vehicle Profile Field",
                "description": "Optional depot field defining vehicle profile/category token used for stop compatibility."
              },
              "vehicle_route_class_field": {
                "label": "Vehicle Route Class Field",
                "description": "Optional alias of vehicle_profile_field for route-class compatibility rules."
              },
              "vehicle_capacity": {
                "label": "Vehicle Capacity",
                "description": "Per-vehicle capacity (> 0)."
              },
              "vehicle_fixed_cost": {
                "label": "Vehicle Fixed Cost",
                "description": "Optional fixed cost charged per dispatched vehicle/route (default: 0)."
              },
              "max_vehicles": {
                "label": "Max Vehicles",
                "description": "Optional maximum number of vehicles/routes to construct."
              },
              "max_route_distance": {
                "label": "Max Route Distance",
                "description": "Optional maximum travel distance per route, including return to depot."
              },
              "travel_speed": {
                "label": "Travel Speed",
                "description": "Travel speed in coordinate-units per time unit (default: 1)."
              },
              "max_route_time": {
                "label": "Max Route Time",
                "description": "Optional maximum route duration in model time units, including return to depot."
              },
              "max_stops_per_vehicle": {
                "label": "Max Stops Per Vehicle",
                "description": "Optional maximum number of stops assigned to each vehicle route."
              },
              "objective_mode": {
                "label": "Objective Mode",
                "description": "Route-construction objective: minimize_distance, minimize_vehicles, or minimize_cost."
              },
              "apply_local_optimization": {
                "label": "Apply Local Optimization",
                "description": "When true, applies a deterministic 2-opt local improvement pass to each constructed route (default: true)."
              },
              "apply_simulated_annealing": {
                "label": "Apply Simulated Annealing",
                "description": "When true, applies a seeded simulated annealing refinement pass per route after greedy/local optimization (default: false)."
              },
              "sa_iterations": {
                "label": "Sa Iterations",
                "description": "Maximum simulated annealing iterations per route when apply_simulated_annealing=true (default: 1500)."
              },
              "sa_initial_temperature": {
                "label": "Sa Initial Temperature",
                "description": "Initial simulated annealing temperature (> 0, default: 1.0)."
              },
              "sa_cooling_rate": {
                "label": "Sa Cooling Rate",
                "description": "Simulated annealing cooling multiplier in (0, 1); default 0.995."
              },
              "sa_seed": {
                "label": "Sa Seed",
                "description": "Optional deterministic random seed for simulated annealing (default: 42)."
              },
              "output": {
                "label": "Output",
                "description": "Output route line vector path."
              },
              "assignment_output": {
                "label": "Assignment Output",
                "description": "Optional stop assignment point output with visit order/load diagnostics."
              }
            }
          },
          "vehicle_routing_pickup_delivery": {
            "name": "Vehicle Routing Pickup Delivery",
            "params": {
              "network": {
                "label": "Network",
                "description": "Input line network layer (validated for contract parity)."
              },
              "depot_points": {
                "label": "Depot Points",
                "description": "Depot point layer; first point is used as the active depot in this baseline implementation."
              },
              "stop_points": {
                "label": "Stop Points",
                "description": "Stop point layer containing paired pickup and delivery records."
              },
              "request_id_field": {
                "label": "Request Id Field",
                "description": "Request identifier field in stop_points used to pair pickup and delivery records (default: request_id)."
              },
              "stop_type_field": {
                "label": "Stop Type Field",
                "description": "Stop type field in stop_points containing pickup/delivery labels (default: stop_type)."
              },
              "demand_field": {
                "label": "Demand Field",
                "description": "Numeric demand field in stop_points; pickup demand is loaded and delivered demand is ignored (default: demand)."
              },
              "vehicle_capacity": {
                "label": "Vehicle Capacity",
                "description": "Per-vehicle capacity (> 0)."
              },
              "max_vehicles": {
                "label": "Max Vehicles",
                "description": "Optional maximum number of vehicles/routes to construct."
              },
              "output": {
                "label": "Output",
                "description": "Output route line vector path."
              },
              "assignment_output": {
                "label": "Assignment Output",
                "description": "Optional stop assignment point output with request and precedence diagnostics."
              }
            }
          },
          "vehicle_routing_vrptw": {
            "name": "Vehicle Routing Vrptw",
            "params": {
              "network": {
                "label": "Network",
                "description": "Input line network layer (validated for contract parity)."
              },
              "depot_points": {
                "label": "Depot Points",
                "description": "Depot point layer; each point can contribute one or more vehicles."
              },
              "stop_points": {
                "label": "Stop Points",
                "description": "Delivery stop point layer with demand and time-window fields."
              },
              "demand_field": {
                "label": "Demand Field",
                "description": "Numeric demand field in stop_points (default: demand)."
              },
              "priority_field": {
                "label": "Priority Field",
                "description": "Optional stop priority field using values like required/high/normal/low or numeric ranks."
              },
              "allowed_vehicle_profiles_field": {
                "label": "Allowed Vehicle Profiles Field",
                "description": "Optional stop field listing compatible vehicle profiles (comma/semicolon/pipe-delimited)."
              },
              "allowed_route_classes_field": {
                "label": "Allowed Route Classes Field",
                "description": "Optional alias of allowed_vehicle_profiles_field for route-class compatibility rules."
              },
              "tw_start_field": {
                "label": "Tw Start Field",
                "description": "Numeric time-window start field in stop_points (default: tw_start)."
              },
              "tw_end_field": {
                "label": "Tw End Field",
                "description": "Numeric time-window end field in stop_points (default: tw_end)."
              },
              "service_time_field": {
                "label": "Service Time Field",
                "description": "Numeric per-stop service time field in stop_points (default: service_time)."
              },
              "depot_id_field": {
                "label": "Depot Id Field",
                "description": "Optional depot ID field used in route/assignment outputs."
              },
              "vehicle_count_field": {
                "label": "Vehicle Count Field",
                "description": "Optional depot field for number of vehicles spawned at each depot."
              },
              "vehicle_capacity_field": {
                "label": "Vehicle Capacity Field",
                "description": "Optional depot field overriding vehicle_capacity per depot/vehicle template."
              },
              "vehicle_fixed_cost_field": {
                "label": "Vehicle Fixed Cost Field",
                "description": "Optional depot field overriding vehicle_fixed_cost per depot/vehicle template."
              },
              "travel_speed_field": {
                "label": "Travel Speed Field",
                "description": "Optional depot field overriding travel_speed per depot/vehicle template."
              },
              "max_route_distance_field": {
                "label": "Max Route Distance Field",
                "description": "Optional depot field overriding max_route_distance per depot/vehicle template."
              },
              "max_route_time_field": {
                "label": "Max Route Time Field",
                "description": "Optional depot field overriding max_route_time per depot/vehicle template."
              },
              "vehicle_profile_field": {
                "label": "Vehicle Profile Field",
                "description": "Optional depot field defining vehicle profile/category token used for stop compatibility."
              },
              "vehicle_route_class_field": {
                "label": "Vehicle Route Class Field",
                "description": "Optional alias of vehicle_profile_field for route-class compatibility rules."
              },
              "depot_close_time_field": {
                "label": "Depot Close Time Field",
                "description": "Optional depot field overriding depot_close_time per depot/vehicle template."
              },
              "break_start_field": {
                "label": "Break Start Field",
                "description": "Optional depot field overriding break_start_time per depot/vehicle template."
              },
              "break_end_field": {
                "label": "Break End Field",
                "description": "Optional depot field overriding break_end_time per depot/vehicle template."
              },
              "break_duration_field": {
                "label": "Break Duration Field",
                "description": "Optional depot field overriding break_duration per depot/vehicle template."
              },
              "vehicle_capacity": {
                "label": "Vehicle Capacity",
                "description": "Per-vehicle capacity (> 0)."
              },
              "vehicle_fixed_cost": {
                "label": "Vehicle Fixed Cost",
                "description": "Optional fixed cost charged per dispatched vehicle/route (default: 0)."
              },
              "start_time": {
                "label": "Start Time",
                "description": "Route start time in model time units (default: 0)."
              },
              "travel_speed": {
                "label": "Travel Speed",
                "description": "Travel speed in coordinate-units per time unit (default: 1)."
              },
              "enforce_time_windows": {
                "label": "Enforce Time Windows",
                "description": "When true, only stops with lateness <= allowed_lateness are eligible for assignment (default: false)."
              },
              "allowed_lateness": {
                "label": "Allowed Lateness",
                "description": "Maximum lateness tolerated when enforce_time_windows=true (default: 0)."
              },
              "depot_close_time": {
                "label": "Depot Close Time",
                "description": "Optional hard close time by which each route must return to depot."
              },
              "break_start_time": {
                "label": "Break Start Time",
                "description": "Optional global break-window start time for all vehicles."
              },
              "break_end_time": {
                "label": "Break End Time",
                "description": "Optional global break-window end time for all vehicles."
              },
              "break_duration": {
                "label": "Break Duration",
                "description": "Optional global break duration applied once per route when break window is intersected."
              },
              "use_priority_scoring": {
                "label": "Use Priority Scoring",
                "description": "When true, ranks feasible candidates by projected lateness/slack before travel distance; when false, uses nearest-neighbour baseline (default: true)."
              },
              "max_vehicles": {
                "label": "Max Vehicles",
                "description": "Optional maximum number of vehicles/routes to construct."
              },
              "max_route_distance": {
                "label": "Max Route Distance",
                "description": "Optional maximum route travel distance, including return to depot."
              },
              "max_route_time": {
                "label": "Max Route Time",
                "description": "Optional maximum route duration in model time units, including return to depot."
              },
              "max_stops_per_vehicle": {
                "label": "Max Stops Per Vehicle",
                "description": "Optional maximum number of stops assigned to each vehicle route."
              },
              "objective_mode": {
                "label": "Objective Mode",
                "description": "Route-construction objective: minimize_lateness, minimize_distance, minimize_vehicles, or minimize_cost."
              },
              "output": {
                "label": "Output",
                "description": "Output route line vector path."
              },
              "assignment_output": {
                "label": "Assignment Output",
                "description": "Optional stop assignment point output with time-window diagnostics."
              }
            }
          },
          "clip": {
            "name": "Clip",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "difference": {
            "name": "Difference",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "dissolve": {
            "name": "Dissolve",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "dissolve_field": {
                "label": "Dissolve Field",
                "description": "Optional attribute field used to dissolve polygons within groups; if omitted, dissolves all polygons."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used during topology operations."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "erase": {
            "name": "Erase",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "identity": {
            "name": "Identity",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "intersect": {
            "name": "Intersect",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "line_intersections": {
            "name": "Line Intersections",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line or polygon layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay line or polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by geometry operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "line_polygon_clip": {
            "name": "Line Polygon Clip",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line layer."
              },
              "clip": {
                "label": "Clip",
                "description": "Clip polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "near": {
            "name": "Near",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "near": {
                "label": "Near",
                "description": "Near-feature vector layer."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Optional maximum search distance."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "select_by_location": {
            "name": "Select By Location",
            "params": {
              "target": {
                "label": "Target",
                "description": "Target feature layer to filter."
              },
              "query": {
                "label": "Query",
                "description": "Query feature layer."
              },
              "predicate": {
                "label": "Predicate",
                "description": "Spatial predicate: intersects, within, contains, touches, crosses, overlaps, disjoint, within_distance."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for within_distance predicate."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "spatial_join": {
            "name": "Spatial Join",
            "params": {
              "target": {
                "label": "Target",
                "description": "Target layer receiving joined attributes."
              },
              "join": {
                "label": "Join",
                "description": "Join layer providing attributes."
              },
              "predicate": {
                "label": "Predicate",
                "description": "Spatial predicate: intersects, within, contains, touches, crosses, overlaps, within_distance."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for within_distance predicate."
              },
              "strategy": {
                "label": "Strategy",
                "description": "Join strategy: first, last, count, sum, mean, min, max."
              },
              "prefix": {
                "label": "Prefix",
                "description": "Prefix for joined field names (default JOIN_)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "symmetrical_difference": {
            "name": "Symmetrical Difference",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "union": {
            "name": "Union",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "update": {
            "name": "Update",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay polygon layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by topology operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "centroid_vector": {
            "name": "Centroid Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "concave_hull": {
            "name": "Concave Hull",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "concavity": {
                "label": "Concavity",
                "description": "Concavity ratio (default 2.0). Higher values produce a less-concave hull closer to the convex hull. Lower values allow tighter concavities."
              },
              "max_edge_length": {
                "label": "Max Edge Length",
                "description": "Length threshold: hull edges shorter than this value are not refined further. Defaults to unlimited (infinity)."
              },
              "epsilon": {
                "label": "Epsilon",
                "description": "Robustness epsilon (default 1e-9)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "densify_features": {
            "name": "Densify Features",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "spacing": {
                "label": "Spacing",
                "description": "Maximum spacing between adjacent vertices."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "eliminate_coincident_points": {
            "name": "Eliminate Coincident Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "tolerance_dist": {
                "label": "Tolerance Dist",
                "description": "Distance threshold for considering points coincident."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "extend_vector_lines": {
            "name": "Extend Vector Lines",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector layer."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance to extend polyline endpoints."
              },
              "extend_direction": {
                "label": "Extend Direction",
                "description": "Direction to extend endpoints: both, start, or end."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "merge_line_segments": {
            "name": "Merge Line Segments",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional endpoint snapping tolerance used to match line endpoints; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "minimum_bounding_box": {
            "name": "Minimum Bounding Box",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "min_criteria": {
                "label": "Min Criteria",
                "description": "Minimization criterion: area, perimeter, length, or width. Defaults to area."
              },
              "individual_feature_hulls": {
                "label": "Individual Feature Hulls",
                "description": "If true, outputs one box per feature; otherwise outputs one box for the full layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "minimum_bounding_circle": {
            "name": "Minimum Bounding Circle",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "individual_feature_hulls": {
                "label": "Individual Feature Hulls",
                "description": "If true, outputs one circle per feature; otherwise outputs one circle for the full layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "minimum_bounding_envelope": {
            "name": "Minimum Bounding Envelope",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "individual_feature_hulls": {
                "label": "Individual Feature Hulls",
                "description": "If true, outputs one envelope per feature; otherwise outputs one envelope for the full layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "minimum_convex_hull": {
            "name": "Minimum Convex Hull",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "individual_feature_hulls": {
                "label": "Individual Feature Hulls",
                "description": "If true, outputs one hull per input feature; otherwise outputs one hull for the entire layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "polygonize": {
            "name": "Polygonize",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input line vector layers as an array or semicolon/comma-delimited string. If omitted, 'input' is used."
              },
              "input": {
                "label": "Input",
                "description": "Optional single input line vector layer path."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by polygonization; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "representative_point_vector": {
            "name": "Representative Point Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "simplify_features": {
            "name": "Simplify Features",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Simplification tolerance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "smooth_vectors": {
            "name": "Smooth Vectors",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line or polygon vector layer."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Odd moving-average window size (>= 3). Even values are incremented to next odd value."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "snap_endnodes": {
            "name": "Snap Endnodes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector layer."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Endpoint snapping tolerance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output snapped polyline vector path."
              }
            }
          },
          "split_vector_lines": {
            "name": "Split Vector Lines",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector layer."
              },
              "segment_length": {
                "label": "Segment Length",
                "description": "Maximum segment length in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output polyline vector path."
              }
            }
          },
          "split_with_lines": {
            "name": "Split With Lines",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line layer to split."
              },
              "split": {
                "label": "Split",
                "description": "Split line layer used to create break points."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Optional snapping tolerance used by split operations; defaults to machine epsilon."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "compactness_ratio": {
            "name": "Compactness Ratio",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with compactness field appended."
              }
            }
          },
          "deviation_from_regional_direction": {
            "name": "Deviation From Regional Direction",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "elongation_threshold": {
                "label": "Elongation Threshold",
                "description": "Minimum elongation used to include polygons in regional direction estimate; default 0.75."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "elongation_ratio": {
            "name": "Elongation Ratio",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with elongation field appended."
              }
            }
          },
          "hole_proportion": {
            "name": "Hole Proportion",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "linearity_index": {
            "name": "Linearity Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with linearity field appended."
              }
            }
          },
          "narrowness_index_vector": {
            "name": "Narrowness Index Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with narrowness field appended."
              }
            }
          },
          "patch_orientation": {
            "name": "Patch Orientation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "perimeter_area_ratio": {
            "name": "Perimeter Area Ratio",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "polygon_area": {
            "name": "Polygon Area",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "polygon_long_axis": {
            "name": "Polygon Long Axis",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polyline vector path."
              }
            }
          },
          "polygon_perimeter": {
            "name": "Polygon Perimeter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "polygon_short_axis": {
            "name": "Polygon Short Axis",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polyline vector path."
              }
            }
          },
          "related_circumscribing_circle": {
            "name": "Related Circumscribing Circle",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "shape_complexity_index_vector": {
            "name": "Shape Complexity Index Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with complexity index field appended."
              }
            }
          },
          "global_morans_i": {
            "name": "Global Morans I",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to analyze."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "k value for k_nearest mode."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for distance_band mode."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Apply row standardization to weights (default true)."
              },
              "inference": {
                "label": "Inference",
                "description": "Inference mode: asymptotic or permutation (default: asymptotic)."
              },
              "num_simulations": {
                "label": "Num Simulations",
                "description": "Number of permutations for permutation testing (default: 999)."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for reproducible permutation testing."
              },
              "island_policy": {
                "label": "Island Policy",
                "description": "Island handling: drop_with_warning, keep_zero_weight, error."
              },
              "output_json": {
                "label": "Output Json",
                "description": "Optional JSON report output path."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report output path."
              },
              "output_csv": {
                "label": "Output Csv",
                "description": "Optional CSV summary output path."
              },
              "output_distribution": {
                "label": "Output Distribution",
                "description": "Optional path to save permutation distribution as JSON."
              }
            }
          },
          "getis_ord_gi_star": {
            "name": "Getis Ord Gi Star",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to analyze."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "k value for k_nearest mode."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for distance_band mode."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Apply row standardization to weights (default true)."
              },
              "variant": {
                "label": "Variant",
                "description": "Variant: gi or gi_star (default gi_star)."
              },
              "inference": {
                "label": "Inference",
                "description": "Inference mode: asymptotic or permutation (default: asymptotic)."
              },
              "num_simulations": {
                "label": "Num Simulations",
                "description": "Number of permutations for permutation testing (default: 999)."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for reproducible permutation testing."
              },
              "island_policy": {
                "label": "Island Policy",
                "description": "Island handling: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Significance threshold in [0, 1]; default 0.05."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path with GI fields."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report output path."
              }
            }
          },
          "local_morans_i_lisa": {
            "name": "Local Morans I Lisa",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to analyze."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "k value for k_nearest mode."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for distance_band mode."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Apply row standardization to weights (default true)."
              },
              "inference": {
                "label": "Inference",
                "description": "Inference mode: asymptotic or permutation (default: asymptotic)."
              },
              "num_simulations": {
                "label": "Num Simulations",
                "description": "Number of permutations for permutation testing (default: 999)."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for reproducible permutation testing."
              },
              "island_policy": {
                "label": "Island Policy",
                "description": "Island handling: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Significance threshold in [0, 1]; default 0.05."
              },
              "fdr_correction": {
                "label": "Fdr Correction",
                "description": "Apply FDR-BH correction (default true for permutation)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path with LISA fields."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report output path."
              }
            }
          },
          "nearest_neighbour_index": {
            "name": "Nearest Neighbour Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "study_area_mode": {
                "label": "Study Area Mode",
                "description": "Study area mode: hull, envelope, polygon_layer."
              },
              "study_area_polygon": {
                "label": "Study Area Polygon",
                "description": "Polygon layer used when study_area_mode=polygon_layer."
              },
              "output_json": {
                "label": "Output Json",
                "description": "Optional JSON report output path."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report output path."
              },
              "output_csv": {
                "label": "Output Csv",
                "description": "Optional CSV summary output path."
              }
            }
          },
          "quadrat_count_test": {
            "name": "Quadrat Count Test",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "grid_mode": {
                "label": "Grid Mode",
                "description": "Grid mode: rows_cols or cell_size."
              },
              "rows": {
                "label": "Rows",
                "description": "Rows when grid_mode=rows_cols."
              },
              "cols": {
                "label": "Cols",
                "description": "Cols when grid_mode=rows_cols."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Cell size when grid_mode=cell_size."
              },
              "study_area_mode": {
                "label": "Study Area Mode",
                "description": "Study area mode: hull, envelope, polygon_layer."
              },
              "study_area_polygon": {
                "label": "Study Area Polygon",
                "description": "Polygon layer used when study_area_mode=polygon_layer."
              },
              "output_grid": {
                "label": "Output Grid",
                "description": "Optional quadrat polygon grid output path."
              },
              "output_json": {
                "label": "Output Json",
                "description": "Optional JSON report output path."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report output path."
              },
              "output_csv": {
                "label": "Output Csv",
                "description": "Optional CSV summary output path."
              }
            }
          },
          "spatial_lag_regression": {
            "name": "Spatial Lag Regression",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "response_field": {
                "label": "Response Field",
                "description": "Response (dependent) variable."
              },
              "predictor_fields": {
                "label": "Predictor Fields",
                "description": "Comma-separated predictor field names."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Spatial neighborhood mode."
              },
              "k": {
                "label": "K",
                "description": "k value for k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Row standardize weights."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer."
              }
            }
          },
          "spatial_error_regression": {
            "name": "Spatial Error Regression",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "response_field": {
                "label": "Response Field",
                "description": "Response variable."
              },
              "predictor_fields": {
                "label": "Predictor Fields",
                "description": "Comma-separated predictor fields."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Spatial neighborhood mode."
              },
              "k": {
                "label": "K",
                "description": "k for k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Row standardize weights."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer."
              }
            }
          },
          "geographically_weighted_regression": {
            "name": "Geographically Weighted Regression",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer (points, or other geometries via their representative point)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "y_field": {
                "label": "Y Field",
                "description": "Dependent (response) numeric field."
              },
              "x_fields": {
                "label": "X Fields",
                "description": "Comma-separated explanatory numeric field(s)."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Distance-decay kernel: 'gaussian' (default) or 'bisquare'."
              },
              "bandwidth_type": {
                "label": "Bandwidth Type",
                "description": "'adaptive' (default; bandwidth = k nearest neighbours) or 'fixed' (bandwidth = a distance)."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Bandwidth: neighbour count for adaptive, or distance for fixed. Omit to select it by minimizing AICc."
              }
            }
          },
          "ripleys_k_test": {
            "name": "Ripleys K Test",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Maximum analysis distance."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Distance step size."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with K statistics."
              }
            }
          },
          "envelope_test": {
            "name": "Envelope Test",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "num_simulations": {
                "label": "Num Simulations",
                "description": "Number of Monte Carlo simulations."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Maximum analysis distance."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with envelope bounds."
              }
            }
          },
          "point_process_residuals": {
            "name": "Point Process Residuals",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "intensity_field": {
                "label": "Intensity Field",
                "description": "Fitted intensity field."
              },
              "output": {
                "label": "Output",
                "description": "Output vector with residuals."
              }
            }
          },
          "ripleys_k_function": {
            "name": "Ripleys K Function",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point vector layer."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Maximum distance threshold."
              },
              "num_distances": {
                "label": "Num Distances",
                "description": "Number of distance steps."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV."
              }
            }
          },
          "point_pattern_envelope": {
            "name": "Point Pattern Envelope",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point vector layer."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Maximum distance."
              },
              "num_distances": {
                "label": "Num Distances",
                "description": "Distance bins."
              },
              "num_simulations": {
                "label": "Num Simulations",
                "description": "Monte Carlo replicates."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Significance level."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV."
              }
            }
          },
          "inhomogeneous_baseline": {
            "name": "Inhomogeneous Baseline",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point vector layer."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Maximum distance."
              },
              "num_distances": {
                "label": "Num Distances",
                "description": "Distance bins."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "KDE bandwidth (auto-select if omitted)."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV."
              }
            }
          },
          "hotspot_vs_process": {
            "name": "Hotspot Vs Process",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point vector layer."
              },
              "hotspot_field": {
                "label": "Hotspot Field",
                "description": "Hotspot classification field."
              },
              "intensity_field": {
                "label": "Intensity Field",
                "description": "Intensity field."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV."
              }
            }
          },
          "point_process_residuals_comparison": {
            "name": "Point Process Residuals Comparison",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point vector layer."
              },
              "observed_field": {
                "label": "Observed Field",
                "description": "Observed values field."
              },
              "predicted_field": {
                "label": "Predicted Field",
                "description": "Predicted values field."
              },
              "residual_type": {
                "label": "Residual Type",
                "description": "Residual type."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV."
              }
            }
          },
          "construct_vector_tin": {
            "name": "Construct Vector Tin",
            "params": {
              "input_points": {
                "label": "Input Points",
                "description": "Input point or multipoint vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional field name for vertex heights (numeric field)."
              },
              "use_z": {
                "label": "Use Z",
                "description": "If true, use geometry Z values for triangle elevations."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Maximum allowable triangle edge length (filters long edges). Use 0 or negative for no limit."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector layer (TIN)."
              }
            }
          },
          "contours_from_points": {
            "name": "Contours From Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point or multipoint vector path."
              },
              "base": {
                "label": "Base",
                "description": "Base contour elevation (default 0.0)."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Numeric attribute field containing elevation values (ignored when use_z_values=true)."
              },
              "interval": {
                "label": "Interval",
                "description": "Contour interval value (default 10.0)."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Maximum triangle edge length to include in contouring (map units)."
              },
              "smooth": {
                "label": "Smooth",
                "description": "Smoothing filter size (odd integer, default 9)."
              },
              "use_z_values": {
                "label": "Use Z Values",
                "description": "Use geometry Z values as elevations (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "contours_from_raster": {
            "name": "Contours From Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster surface path or typed raster object."
              },
              "base": {
                "label": "Base",
                "description": "Base contour elevation (default 0.0)."
              },
              "interval": {
                "label": "Interval",
                "description": "Contour interval value (default 10.0)."
              },
              "smooth": {
                "label": "Smooth",
                "description": "Smoothing filter size (odd integer, default 9)."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Minimum line deflection angle in degrees for simplification (default 10.0)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "extract_nodes": {
            "name": "Extract Nodes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline or polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "extract_raster_values_at_points": {
            "name": "Extract Raster Values At Points",
            "params": {
              "rasters": {
                "label": "Rasters",
                "description": "Input raster paths as an array or delimited string."
              },
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "find_lowest_or_highest_points": {
            "name": "Find Lowest Or Highest Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "out_type": {
                "label": "Out Type",
                "description": "Output type: lowest, highest, or both."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path."
              }
            }
          },
          "hexagonal_grid_from_raster_base": {
            "name": "Hexagonal Grid From Raster Base",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base raster controlling grid extent."
              },
              "width": {
                "label": "Width",
                "description": "Hexagon width in map units."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Hexagon orientation: horizontal or vertical."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "hexagonal_grid_from_vector_base": {
            "name": "Hexagonal Grid From Vector Base",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base vector layer controlling grid extent."
              },
              "width": {
                "label": "Width",
                "description": "Hexagon width in map units."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Hexagon orientation: horizontal or vertical."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "layer_footprint_raster": {
            "name": "Layer Footprint Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "layer_footprint_vector": {
            "name": "Layer Footprint Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "medoid": {
            "name": "Medoid",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output medoid point vector path."
              }
            }
          },
          "random_points_in_polygon": {
            "name": "Random Points In Polygon",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon layer."
              },
              "num_points": {
                "label": "Num Points",
                "description": "Number of random points to create."
              },
              "seed": {
                "label": "Seed",
                "description": "Optional RNG seed for reproducibility."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "rectangular_grid_from_raster_base": {
            "name": "Rectangular Grid From Raster Base",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base raster controlling grid extent."
              },
              "width": {
                "label": "Width",
                "description": "Grid cell width in map units."
              },
              "height": {
                "label": "Height",
                "description": "Grid cell height in map units."
              },
              "x_origin": {
                "label": "X Origin",
                "description": "Optional x-origin for grid alignment."
              },
              "y_origin": {
                "label": "Y Origin",
                "description": "Optional y-origin for grid alignment."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "rectangular_grid_from_vector_base": {
            "name": "Rectangular Grid From Vector Base",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base vector layer controlling grid extent."
              },
              "width": {
                "label": "Width",
                "description": "Grid cell width in map units."
              },
              "height": {
                "label": "Height",
                "description": "Grid cell height in map units."
              },
              "x_origin": {
                "label": "X Origin",
                "description": "Optional x-origin for grid alignment."
              },
              "y_origin": {
                "label": "Y Origin",
                "description": "Optional y-origin for grid alignment."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path."
              }
            }
          },
          "vector_hex_binning": {
            "name": "Vector Hex Binning",
            "params": {
              "vector_points": {
                "label": "Vector Points",
                "description": "Input point or multipoint vector layer."
              },
              "width": {
                "label": "Width",
                "description": "Hexagon width (distance between opposing sides)."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Hexagon orientation: 'h' for horizontal (pointy-top) or 'v' for vertical (flat-top)."
              },
              "output": {
                "label": "Output",
                "description": "Output hexagon polygon layer with counts."
              }
            }
          },
          "voronoi_diagram": {
            "name": "Voronoi Diagram",
            "params": {
              "input_points": {
                "label": "Input Points",
                "description": "Input point or multipoint vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output Voronoi polygon vector path."
              }
            }
          },
          "add_field": {
            "name": "Add Field",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "field": {
                "label": "Field",
                "description": "New field name."
              },
              "field_type": {
                "label": "Field Type",
                "description": "Field type: integer, float, text, boolean."
              },
              "default": {
                "label": "Default",
                "description": "Optional default value."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "add_geometry_attributes": {
            "name": "Add Geometry Attributes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "measurement_mode": {
                "label": "Measurement Mode",
                "description": "Measurement method: auto (default), planar, or geodesic."
              },
              "area": {
                "label": "Area",
                "description": "Include area field (AREA_M2 for geodesic, AREA_MAP2 for planar)."
              },
              "length": {
                "label": "Length",
                "description": "Include length field (LENGTH_M for geodesic, LENGTH_MAP for planar)."
              },
              "perimeter": {
                "label": "Perimeter",
                "description": "Include perimeter field (PERIM_M for geodesic, PERIM_MAP for planar)."
              },
              "centroid": {
                "label": "Centroid",
                "description": "Include centroid X/Y fields (default true)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "attribute_correlation": {
            "name": "Attribute Correlation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "attribute_histogram": {
            "name": "Attribute Histogram",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field name."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "attribute_scattergram": {
            "name": "Attribute Scattergram",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "fieldx": {
                "label": "Fieldx",
                "description": "Numeric x-axis field name."
              },
              "fieldy": {
                "label": "Fieldy",
                "description": "Numeric y-axis field name."
              },
              "trendline": {
                "label": "Trendline",
                "description": "Include trendline summary (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "delete_field": {
            "name": "Delete Field",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-delimited field names to delete."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "extract_by_attribute": {
            "name": "Extract By Attribute",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "statement": {
                "label": "Statement",
                "description": "Boolean expression evaluated against attribute fields; accepts SQL-style AND/OR/NOT/XOR aliases."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "field_calculator": {
            "name": "Field Calculator",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "field": {
                "label": "Field",
                "description": "Output field name."
              },
              "field_type": {
                "label": "Field Type",
                "description": "Output field type: float, integer, text."
              },
              "expression": {
                "label": "Expression",
                "description": "Expression evaluated per feature. Supports SQL-style CASE, CAST(... AS type), IS NULL/IS NOT NULL, and UPDATE ... SET FIELD = ... [WHERE ...] wrappers."
              },
              "overwrite": {
                "label": "Overwrite",
                "description": "Overwrite existing field if present (default true)."
              },
              "preview_rows": {
                "label": "Preview Rows",
                "description": "Optional number of preview rows to return in the result payload. When > 0, output may be omitted for preview-only evaluation."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. Optional when preview_rows > 0."
              }
            }
          },
          "filter_vector_features_by_area": {
            "name": "Filter Vector Features By Area",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum polygon area to retain, in layer coordinate units squared."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "list_unique_values": {
            "name": "List Unique Values",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "field": {
                "label": "Field",
                "description": "Attribute field name."
              },
              "output": {
                "label": "Output",
                "description": "Optional output CSV path."
              }
            }
          },
          "rename_field": {
            "name": "Rename Field",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "field": {
                "label": "Field",
                "description": "Existing field name."
              },
              "new_field": {
                "label": "New Field",
                "description": "Replacement field name."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "download_osm_vector": {
            "name": "Download Osm Vector",
            "params": {
              "west": {
                "label": "West",
                "description": "West boundary longitude (EPSG:4326)."
              },
              "south": {
                "label": "South",
                "description": "South boundary latitude (EPSG:4326)."
              },
              "east": {
                "label": "East",
                "description": "East boundary longitude (EPSG:4326)."
              },
              "north": {
                "label": "North",
                "description": "North boundary latitude (EPSG:4326)."
              },
              "input_extent_epsg": {
                "label": "Input Extent Epsg",
                "description": "EPSG code for west/south/east/north input extent (default 4326)."
              },
              "filter_preset": {
                "label": "Filter Preset",
                "description": "Feature class preset: all, roads, buildings, water, landuse, trails, parks, rail, amenities, boundaries, transit, poi (default all)."
              },
              "include_tags": {
                "label": "Include Tags",
                "description": "Semicolon-delimited tag keys filter list, e.g. amenity;shop."
              },
              "include_key_values": {
                "label": "Include Key Values",
                "description": "Semicolon-delimited key=value filter list, e.g. amenity=school;building=yes."
              },
              "filter_key": {
                "label": "Filter Key",
                "description": "Legacy single tag-key filter (deprecated; use include_tags)."
              },
              "filter_key_value": {
                "label": "Filter Key Value",
                "description": "Legacy single key=value filter (deprecated; use include_key_values)."
              },
              "include_points": {
                "label": "Include Points",
                "description": "Include OSM node features with tags as Point geometries (default true)."
              },
              "include_lines": {
                "label": "Include Lines",
                "description": "Include OSM way features as LineString geometries (default true)."
              },
              "include_polygons": {
                "label": "Include Polygons",
                "description": "Include closed OSM ways with area tags as Polygon geometries (default true)."
              },
              "clip_to_extent": {
                "label": "Clip To Extent",
                "description": "Clip output geometries to the query bbox extent (default true)."
              },
              "split_output_by_geometry": {
                "label": "Split Output By Geometry",
                "description": "Write separate outputs per geometry type (<output>_points|lines|polygons.ext)."
              },
              "output_epsg": {
                "label": "Output Epsg",
                "description": "Reproject output to this EPSG code; omit to keep EPSG:4326."
              },
              "overpass_profile": {
                "label": "Overpass Profile",
                "description": "Overpass endpoint profile: main, kumi, fr, or custom (default main)."
              },
              "overpass_url": {
                "label": "Overpass Url",
                "description": "Overpass API endpoint URL (default https://overpass-api.de/api/interpreter)."
              },
              "timeout_seconds": {
                "label": "Timeout Seconds",
                "description": "Query timeout in seconds (default 25)."
              },
              "max_elements": {
                "label": "Max Elements",
                "description": "Maximum number of returned Overpass elements before an error is raised (default 50 000)."
              },
              "chunk_large_aoi": {
                "label": "Chunk Large Aoi",
                "description": "Automatically split larger AOIs into multiple Overpass requests (default true)."
              },
              "chunk_max_area_deg2": {
                "label": "Chunk Max Area Deg2",
                "description": "Maximum area per chunk in square degrees when chunking (default 4.0)."
              },
              "max_chunk_count": {
                "label": "Max Chunk Count",
                "description": "Hard cap on chunk count when chunking large AOIs (default 64)."
              },
              "chunk_parallel_requests": {
                "label": "Chunk Parallel Requests",
                "description": "Maximum parallel chunk requests for large AOIs (default 1 = sequential)."
              },
              "cache_dir": {
                "label": "Cache Dir",
                "description": "Optional directory for caching Overpass JSON responses by endpoint+query hash."
              },
              "cache_ttl_hours": {
                "label": "Cache Ttl Hours",
                "description": "Cache time-to-live in hours (default 24; 0 means no expiry check)."
              },
              "provenance_output": {
                "label": "Provenance Output",
                "description": "Optional JSON path to write query/provenance metadata sidecar."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path; when omitted, a temporary output is used."
              }
            }
          },
          "assign_projection_lidar": {
            "name": "Assign Projection Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LiDAR file path (LAS/LAZ/COPC, or in-memory handle)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG code of the CRS to assign, e.g. 4326 (WGS84) or 3857 (Web Mercator). Coordinates are not transformed."
              },
              "output": {
                "label": "Output",
                "description": "Optional output LiDAR path. If omitted, the result is stored in memory."
              }
            }
          },
          "assign_projection_raster": {
            "name": "Assign Projection Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path (or in-memory handle)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG code of the CRS to assign, e.g. 4326 (WGS84) or 3857 (Web Mercator). Coordinates are not transformed."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              }
            }
          },
          "assign_projection_vector": {
            "name": "Assign Projection Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path, format auto-detected (or in-memory handle)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG code of the CRS to assign, e.g. 4326 (WGS84) or 3857 (Web Mercator). Coordinates are not transformed."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              }
            }
          },
          "georeference_raster_from_control_points": {
            "name": "Georeference Raster From Control Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "control_points": {
                "label": "Control Points",
                "description": "Control point CSV path with pixel_x,pixel_y,map_x,map_y (and accepted aliases)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Target EPSG code."
              },
              "transform_type": {
                "label": "Transform Type",
                "description": "Transform type: affine, projective, polynomial, or thin_plate_spline."
              },
              "transform_order": {
                "label": "Transform Order",
                "description": "Polynomial order when transform_type=polynomial."
              },
              "resample": {
                "label": "Resample",
                "description": "Resampling method; default bilinear."
              },
              "allow_auto_downgrade": {
                "label": "Allow Auto Downgrade",
                "description": "Allow automatic downgrade to a simpler transform when GCPs are sparse."
              },
              "output": {
                "label": "Output",
                "description": "Output georeferenced raster path."
              },
              "report": {
                "label": "Report",
                "description": "Output report JSON path."
              }
            }
          },
          "reproject_lidar": {
            "name": "Reproject Lidar",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input"
              },
              "dst_epsg": {
                "label": "Dst Epsg",
                "description": "Dst Epsg"
              },
              "output": {
                "label": "Output",
                "description": "Output"
              },
              "use_3d_transform": {
                "label": "Use 3d Transform",
                "description": "Use 3d Transform"
              },
              "failure_policy": {
                "label": "Failure Policy",
                "description": "Failure Policy"
              },
              "coordinate_epoch": {
                "label": "Coordinate Epoch",
                "description": "Coordinate Epoch"
              },
              "source_reference_epoch": {
                "label": "Source Reference Epoch",
                "description": "Source Reference Epoch"
              },
              "target_reference_epoch": {
                "label": "Target Reference Epoch",
                "description": "Target Reference Epoch"
              },
              "operation_code": {
                "label": "Operation Code",
                "description": "Operation Code"
              },
              "prefer_official_operation": {
                "label": "Prefer Official Operation",
                "description": "Prefer Official Operation"
              },
              "epoch_policy": {
                "label": "Epoch Policy",
                "description": "Epoch Policy"
              }
            }
          },
          "reproject_raster": {
            "name": "Reproject Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path. Must carry a source CRS (EPSG or WKT)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Destination EPSG code, e.g. 3857 (Web Mercator) or 4326 (WGS84)."
              },
              "method": {
                "label": "Method",
                "description": "Resampling method: nearest (default), bilinear, cubic, lanczos, average, min, max, mode, median."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              }
            }
          },
          "reproject_vector": {
            "name": "Reproject Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Destination EPSG code."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "orthorectification": {
            "name": "Orthorectification",
            "params": {
              "input_raster": {
                "label": "Input Raster",
                "description": "Input raw (uncorrected) image raster path. RPC metadata must be embedded in the file or present in an adjacent .RPB sidecar."
              },
              "input_dem": {
                "label": "Input Dem",
                "description": "DEM raster used to obtain terrain elevation for each output pixel. Should cover the full scene extent. If not in geographic coordinates, the tool reprojects as needed."
              },
              "output_epsg": {
                "label": "Output Epsg",
                "description": "EPSG code of the output coordinate reference system (default 4326 geographic; specify a projected CRS like 32617 for UTM zone 17N)."
              },
              "output_resolution": {
                "label": "Output Resolution",
                "description": "Output pixel resolution in the output CRS units (e.g., degrees for geographic, metres for projected). Defaults to the approximate GSD of the input image."
              },
              "resample_method": {
                "label": "Resample Method",
                "description": "Resampling method for output: nearest, bilinear (default), cubic."
              },
              "nodata_value": {
                "label": "Nodata Value",
                "description": "No-data value to assign to pixels with no valid source coverage (default same as input)."
              },
              "output": {
                "label": "Output",
                "description": "Output orthoimage raster path."
              }
            }
          },
          "average_flowpath_slope": {
            "name": "Average Flowpath Slope",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "average_upslope_flowpath_length": {
            "name": "Average Upslope Flowpath Length",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "d8_flow_accum": {
            "name": "D8 Flow Accum",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM or D8 pointer raster"
              },
              "clip": {
                "label": "Clip",
                "description": "Clip display max (accepted for compatibility)"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI pointer encoding for pointer inputs"
              },
              "input_is_pointer": {
                "label": "Input Is Pointer",
                "description": "Treat input as D8 pointer raster"
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "out_type": {
                "label": "Out Type",
                "description": "Output type: cells, ca, or sca"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "d8_mass_flux": {
            "name": "D8 Mass Flux",
            "params": {
              "absorption": {
                "label": "Absorption",
                "description": "Raster of per-cell mass losses in loading units."
              },
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster used to derive D8 flow directions."
              },
              "efficiency": {
                "label": "Efficiency",
                "description": "Raster of transfer efficiency values, either in `[0, 1]` or percent."
              },
              "loading": {
                "label": "Loading",
                "description": "Raster of initial mass loading values."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "d8_pointer": {
            "name": "D8 Pointer",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI pointer encoding"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "dinf_flow_accum": {
            "name": "Dinf Flow Accum",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM or D-Infinity pointer raster"
              },
              "clip": {
                "label": "Clip",
                "description": "Clip display max (accepted for compatibility)"
              },
              "convergence_threshold": {
                "label": "Convergence Threshold",
                "description": "Threshold above which flow is not dispersed"
              },
              "input_is_pointer": {
                "label": "Input Is Pointer",
                "description": "Treat input as D-Infinity pointer raster"
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "out_type": {
                "label": "Out Type",
                "description": "Output type: cells, ca, or sca"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "dinf_mass_flux": {
            "name": "Dinf Mass Flux",
            "params": {
              "absorption": {
                "label": "Absorption",
                "description": "Input absorption raster in loading units."
              },
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "efficiency": {
                "label": "Efficiency",
                "description": "Input efficiency raster (`0-1` or percent values)."
              },
              "loading": {
                "label": "Loading",
                "description": "Input loading raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "dinf_pointer": {
            "name": "Dinf Pointer",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "downslope_flowpath_length": {
            "name": "Downslope Flowpath Length",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster"
              },
              "watersheds": {
                "label": "Watersheds",
                "description": "Optional watershed raster"
              },
              "weights": {
                "label": "Weights",
                "description": "Optional per-cell distance weighting raster"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI pointer encoding"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "fd8_flow_accum": {
            "name": "Fd8 Flow Accum",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "clip": {
                "label": "Clip",
                "description": "Clip display max (accepted for compatibility)"
              },
              "exponent": {
                "label": "Exponent",
                "description": "Slope weighting exponent"
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "out_type": {
                "label": "Out Type",
                "description": "Output type: cells, ca, or sca"
              },
              "threshold": {
                "label": "Threshold",
                "description": "Threshold"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "fd8_pointer": {
            "name": "Fd8 Pointer",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "flow_accum_full_workflow": {
            "name": "Flow Accum Full Workflow",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "clip": {
                "label": "Clip",
                "description": "If true, clip accumulation display maximum (compatibility behavior)."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, encode flow-direction output in Esri pointer style."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "If true, log-transform accumulation values."
              },
              "out_type": {
                "label": "Out Type",
                "description": "One of `\"cells\"`, `\"ca\"`, `\"sca\"` (default)."
              },
              "breached_dem_output": {
                "label": "Breached Dem Output",
                "description": "Optional output path for the depressionless DEM raster."
              },
              "flow_dir_output": {
                "label": "Flow Dir Output",
                "description": "Optional output path for the flow-direction raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the flow-accumulation raster."
              },
              "output_pointer": {
                "label": "Output Pointer",
                "description": "Optional output path for the D8 flow-direction pointer (alias of flow_dir_output; ESRI-encoded when esri_pntr is set)"
              }
            }
          },
          "flow_length_diff": {
            "name": "Flow Length Diff",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster."
              },
              "weights": {
                "label": "Weights",
                "description": "Weights"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, interpret pointer values using ESRI D8 encoding."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "max_upslope_flowpath_length": {
            "name": "Max Upslope Flowpath Length",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "max_upslope_value": {
            "name": "Max Upslope Value",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "values": {
                "label": "Values",
                "description": "Input values raster"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "mdinf_flow_accum": {
            "name": "Mdinf Flow Accum",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "clip": {
                "label": "Clip",
                "description": "Compatibility flag accepted by the API."
              },
              "convergence_threshold": {
                "label": "Convergence Threshold",
                "description": "Threshold above which flow is not dispersed"
              },
              "exponent": {
                "label": "Exponent",
                "description": "Slope weighting exponent (default `1.1`)."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "out_type": {
                "label": "Out Type",
                "description": "One of `\"cells\"`, `\"ca\"`, `\"sca\"` (default)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "minimal_dispersion_flow_algorithm": {
            "name": "Minimal Dispersion Flow Algorithm",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "clip": {
                "label": "Clip",
                "description": "Compatibility flag accepted by the API."
              },
              "debug_stats": {
                "label": "Debug Stats",
                "description": "Emit one-line MDFA diagnostics (counts and raw max)"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, encode flow-direction output in Esri pointer style."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "If true, log-transform accumulation values."
              },
              "out_type": {
                "label": "Out Type",
                "description": "One of `\"cells\"`, `\"ca\"`, `\"sca\"` (default)."
              },
              "path_corrected_direction_preference": {
                "label": "Path Corrected Direction Preference",
                "description": "Preference parameter `p` in `[0, 1]`; `1.0` is fully non-dispersive."
              },
              "flow_dir_output": {
                "label": "Flow Dir Output",
                "description": "Optional output path for the flow-direction raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the flow-accumulation raster."
              }
            }
          },
          "num_inflowing_neighbours": {
            "name": "Num Inflowing Neighbours",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "qin_flow_accumulation": {
            "name": "Qin Flow Accumulation",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "clip": {
                "label": "Clip",
                "description": "Compatibility flag accepted by the API."
              },
              "convergence_threshold": {
                "label": "Convergence Threshold",
                "description": "Threshold above which flow is not dispersed"
              },
              "exponent": {
                "label": "Exponent",
                "description": "Upper-bound exponent parameter (default `10.0`)."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "max_slope": {
                "label": "Max Slope",
                "description": "Upper-bound slope in degrees used by the dynamic exponent function (default `45.0`)."
              },
              "out_type": {
                "label": "Out Type",
                "description": "One of `\"cells\"`, `\"ca\"`, `\"sca\"` (default)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "quinn_flow_accumulation": {
            "name": "Quinn Flow Accumulation",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "clip": {
                "label": "Clip",
                "description": "Compatibility flag accepted by the API."
              },
              "convergence_threshold": {
                "label": "Convergence Threshold",
                "description": "Threshold above which flow is not dispersed"
              },
              "exponent": {
                "label": "Exponent",
                "description": "Exponent parameter (default `1.1`)."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "out_type": {
                "label": "Out Type",
                "description": "One of `\"cells\"`, `\"ca\"`, `\"sca\"` (default)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "rho8_flow_accum": {
            "name": "Rho8 Flow Accum",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Dem"
              },
              "clip": {
                "label": "Clip",
                "description": "Clip display max (accepted for compatibility)"
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Log-transform output"
              },
              "out_type": {
                "label": "Out Type",
                "description": "Output type: cells, ca, or sca"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "rho8_pointer": {
            "name": "Rho8 Pointer",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "trace_downslope_flowpaths": {
            "name": "Trace Downslope Flowpaths",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster."
              },
              "seed_points": {
                "label": "Seed Points",
                "description": "Input point vector of seed locations."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, interpret D8 pointers with ESRI encoding."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, background is `0`; otherwise background is NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "breach_depressions_least_cost": {
            "name": "Breach Depressions Least Cost",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "fill_deps": {
                "label": "Fill Deps",
                "description": "If true, fill unresolved depressions after breaching."
              },
              "flat_increment": {
                "label": "Flat Increment",
                "description": "Optional monotonic decrement increment."
              },
              "max_cost": {
                "label": "Max Cost",
                "description": "Maximum allowed breach cost."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance in cells."
              },
              "minimize_dist": {
                "label": "Minimize Dist",
                "description": "If true, distance-weight breach costs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "breach_single_cell_pits": {
            "name": "Breach Single Cell Pits",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is returned in memory when supported."
              }
            }
          },
          "burn_streams": {
            "name": "Burn Streams",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Input streams vector."
              },
              "decrement_value": {
                "label": "Decrement Value",
                "description": "Elevation decrement applied to stream cells (default 5.0)."
              },
              "gradient_distance": {
                "label": "Gradient Distance",
                "description": "Gradient distance in grid cells (0 = flat decrement only; default 5)."
              },
              "output": {
                "label": "Output",
                "description": "Output burned DEM path."
              }
            }
          },
          "burn_streams_at_roads": {
            "name": "Burn Streams At Roads",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "roads": {
                "label": "Roads",
                "description": "Road vector layer."
              },
              "streams": {
                "label": "Streams",
                "description": "Stream vector layer."
              },
              "method": {
                "label": "Method",
                "description": "Method"
              },
              "road_width": {
                "label": "Road Width",
                "description": "Maximum embankment width in map units used to set burn reach along the stream."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "depth_in_sink": {
            "name": "Depth In Sink",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, assign `0.0` to cells outside sinks; otherwise assign NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "fill_burn": {
            "name": "Fill Burn",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Input streams vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "fill_depressions": {
            "name": "Fill Depressions",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "fix_flats": {
                "label": "Fix Flats",
                "description": "If true, impose a small gradient across filled flats."
              },
              "flat_increment": {
                "label": "Flat Increment",
                "description": "Flat increment (default `0.0001`)."
              },
              "flat_resolution": {
                "label": "Flat Resolution",
                "description": "Flat-resolution mode. One of `\"garbrecht_martz\"` or `\"natural\"`."
              },
              "max_depth": {
                "label": "Max Depth",
                "description": "Maximum allowed fill depth."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "fill_depressions_planchon_and_darboux": {
            "name": "Fill Depressions Planchon And Darboux",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "fix_flats": {
                "label": "Fix Flats",
                "description": "If true, impose a small gradient across filled flats."
              },
              "flat_increment": {
                "label": "Flat Increment",
                "description": "Flat increment (default `0.0001`)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "fill_depressions_wang_and_liu": {
            "name": "Fill Depressions Wang And Liu",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "fix_flats": {
                "label": "Fix Flats",
                "description": "If true, impose a small gradient across filled flats."
              },
              "flat_increment": {
                "label": "Flat Increment",
                "description": "Flat increment (default `0.0001`)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "fill_pits": {
            "name": "Fill Pits",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is returned in memory when supported."
              }
            }
          },
          "flatten_lakes": {
            "name": "Flatten Lakes",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "lakes": {
                "label": "Lakes",
                "description": "Input polygon vector of lake features."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "impoundment_size_index": {
            "name": "Impoundment Size Index",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "max_dam_length": {
                "label": "Max Dam Length",
                "description": "Maximum dam length in map units."
              },
              "output_area": {
                "label": "Output Area",
                "description": "Include flooded-area raster in output tuple."
              },
              "output_height": {
                "label": "Output Height",
                "description": "Include dam-height raster in output tuple."
              },
              "output_max": {
                "label": "Output Max",
                "description": "Include max flooded-depth raster in output tuple."
              },
              "output_mean": {
                "label": "Output Mean",
                "description": "Include mean flooded-depth raster in output tuple."
              },
              "output_volume": {
                "label": "Output Volume",
                "description": "Include flooded-volume raster in output tuple."
              },
              "out_area": {
                "label": "Out Area",
                "description": "Optional output path for area raster"
              },
              "out_dam_height": {
                "label": "Out Dam Height",
                "description": "Optional output path for dam-height raster"
              },
              "out_max": {
                "label": "Out Max",
                "description": "Optional output path for max depth raster"
              },
              "out_mean": {
                "label": "Out Mean",
                "description": "Optional output path for mean depth raster"
              },
              "out_volume": {
                "label": "Out Volume",
                "description": "Optional output path for volume raster"
              }
            }
          },
          "insert_dams": {
            "name": "Insert Dams",
            "params": {
              "dam_points": {
                "label": "Dam Points",
                "description": "Input point vector of dam locations."
              },
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "dam_length": {
                "label": "Dam Length",
                "description": "Maximum dam length in map units."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "raise_walls": {
            "name": "Raise Walls",
            "params": {
              "breach_lines": {
                "label": "Breach Lines",
                "description": "Optional vector defining breach locations."
              },
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "walls": {
                "label": "Walls",
                "description": "Input line or polygon vector defining wall segments."
              },
              "wall_height": {
                "label": "Wall Height",
                "description": "Elevation increment applied to wall cells."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "sink": {
            "name": "Sink",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, assign `0.0` to cells outside sinks; otherwise assign NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "stochastic_depression_analysis": {
            "name": "Stochastic Depression Analysis",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Number of Monte Carlo iterations."
              },
              "range": {
                "label": "Range",
                "description": "Error autocorrelation range in map units."
              },
              "rmse": {
                "label": "Rmse",
                "description": "Elevation RMSE used for Gaussian perturbation."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "topological_breach_burn": {
            "name": "Topological Breach Burn",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Input stream network vector."
              },
              "snap_distance": {
                "label": "Snap Distance",
                "description": "Optional stream snapping distance used in burn-depth scaling."
              },
              "out_dem": {
                "label": "Out Dem",
                "description": "Optional output path for burned/conditioned DEM."
              },
              "out_dir": {
                "label": "Out Dir",
                "description": "Optional output path for D8 pointer raster."
              },
              "out_fa": {
                "label": "Out Fa",
                "description": "Optional output path for flow-accumulation raster."
              },
              "out_streams": {
                "label": "Out Streams",
                "description": "Optional output path for rasterized streams."
              }
            }
          },
          "upslope_depression_storage": {
            "name": "Upslope Depression Storage",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "basins": {
            "name": "Basins",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, interpret pointer values using ESRI D8 encoding."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "flood_order": {
            "name": "Flood Order",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "hillslopes": {
            "name": "Hillslopes",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 pointer raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Stream-network raster where stream cells have value > 0 and are not NoData."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "ESRI pointer encoding flag."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "isobasins": {
            "name": "Isobasins",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input hydrologically-conditioned DEM raster."
              },
              "target_size": {
                "label": "Target Size",
                "description": "Target isobasin area in number of grid cells (positive integer or float)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, returns an in-memory raster."
              }
            }
          },
          "jenson_snap_pour_points": {
            "name": "Jenson Snap Pour Points",
            "params": {
              "pour_pts": {
                "label": "Pour Pts",
                "description": "Input vector file of pour points (point or multipoint geometries)."
              },
              "streams": {
                "label": "Streams",
                "description": "Input stream-network raster where stream cells have value > 0 and are not NoData."
              },
              "snap_dist": {
                "label": "Snap Dist",
                "description": "Maximum search radius in map units. Defaults to one cell width when omitted or zero."
              },
              "output": {
                "label": "Output",
                "description": "Output path for the snapped pour-point vector file (required; defaults to `snapped_pour_points.geojson` in the working directory when not supplied to the wrapper)."
              }
            }
          },
          "longest_flowpath": {
            "name": "Longest Flowpath",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster"
              },
              "basins": {
                "label": "Basins",
                "description": "Input basin raster"
              },
              "output": {
                "label": "Output",
                "description": "Output vector path"
              }
            }
          },
          "max_branch_length": {
            "name": "Max Branch Length",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Apply natural log transform to positive outputs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "snap_pour_points": {
            "name": "Snap Pour Points",
            "params": {
              "flow_accum": {
                "label": "Flow Accum",
                "description": "Input flow-accumulation raster."
              },
              "pour_pts": {
                "label": "Pour Pts",
                "description": "Input vector file of pour points (point or multipoint geometries)."
              },
              "snap_dist": {
                "label": "Snap Dist",
                "description": "Maximum search radius in map units. Defaults to one cell width when omitted or zero."
              },
              "output": {
                "label": "Output",
                "description": "Output path for the snapped pour-point vector file (required; defaults to `snapped_pour_points.geojson` in the working directory when not supplied to the wrapper)."
              }
            }
          },
          "subbasins": {
            "name": "Subbasins",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 pointer raster produced by `d8_pointer`."
              },
              "streams": {
                "label": "Streams",
                "description": "Stream-network raster where stream cells have value > 0 and are not NoData."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, interpret pointer values using ESRI encoding. Default `False`."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, returns an in-memory raster."
              }
            }
          },
          "unnest_basins": {
            "name": "Unnest Basins",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster"
              },
              "pour_points": {
                "label": "Pour Points",
                "description": "Input pour-point vector"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Interpret pointers as ESRI style"
              },
              "output": {
                "label": "Output",
                "description": "Optional base output path for numbered rasters"
              }
            }
          },
          "watershed": {
            "name": "Watershed",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster."
              },
              "pour_pts": {
                "label": "Pour Pts",
                "description": "Input vector file of pour points (point or multipoint geometries)."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, interpret pointer values using ESRI D8 encoding."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "watershed_from_raster_pour_points": {
            "name": "Watershed From Raster Pour Points",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster."
              },
              "pour_points": {
                "label": "Pour Points",
                "description": "Pour-points raster; non-zero, non-NoData cell values become outlet IDs."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "If true, interpret pointer values using ESRI D8 encoding."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "depth_to_water": {
            "name": "Depth To Water",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "stream_raster": {
                "label": "Stream Raster",
                "description": "Stream Raster"
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "distance_to_outlet": {
            "name": "Distance To Outlet",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "downslope_distance_to_stream": {
            "name": "Downslope Distance To Stream",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Input stream raster; stream cells are values `> 0` and not NoData."
              },
              "dinf": {
                "label": "Dinf",
                "description": "If true, use D-infinity routing; otherwise uses D8 routing."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "downslope_index": {
            "name": "Downslope Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output_type": {
                "label": "Output Type",
                "description": "Output metric: tangent, degrees, radians, distance (default tangent)."
              },
              "vertical_drop": {
                "label": "Vertical Drop",
                "description": "Vertical drop threshold d for downslope traversal."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "edge_contamination": {
            "name": "Edge Contamination",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster."
              },
              "flow_type": {
                "label": "Flow Type",
                "description": "Routing method to use: one of `\"d8\"`, `\"mfd\"`/`\"fd8\"`, or `\"dinf\"`."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor. Values `<= 0` are treated as `1.0`."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "elev_relative_to_watershed_min_max": {
            "name": "Elev Relative To Watershed Min Max",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path or typed raster object."
              },
              "watersheds": {
                "label": "Watersheds",
                "description": "Watershed ID raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "elevation_above_stream": {
            "name": "Elevation Above Stream",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Input stream raster; stream cells are values `> 0` and not NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "elevation_above_stream_euclidean": {
            "name": "Elevation Above Stream Euclidean",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Input stream raster; stream cells are values `> 0` and not NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "find_noflow_cells": {
            "name": "Find Noflow Cells",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "interior_only": {
                "label": "Interior Only",
                "description": "If true, only flags true interior no-flow cells (excluding raster-border and NoData-adjacent outlets)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "find_parallel_flow": {
            "name": "Find Parallel Flow",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "Input D8 pointer raster."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, returns an in-memory raster."
              }
            }
          },
          "hydrologic_connectivity": {
            "name": "Hydrologic Connectivity",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "convergence_threshold": {
                "label": "Convergence Threshold",
                "description": "Optional stream-initiation threshold in contributing cells."
              },
              "exponent": {
                "label": "Exponent",
                "description": "Compatibility parameter for dispersion control."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor."
              },
              "output1": {
                "label": "Output1",
                "description": "Optional output path for DUL raster."
              },
              "output2": {
                "label": "Output2",
                "description": "Optional output path for UDSA raster."
              }
            }
          },
          "relative_stream_power_index": {
            "name": "Relative Stream Power Index",
            "params": {
              "sca": {
                "label": "Sca",
                "description": "Specific catchment area raster path or typed raster object."
              },
              "slope": {
                "label": "Slope",
                "description": "Slope raster in degrees."
              },
              "exponent": {
                "label": "Exponent",
                "description": "Specific catchment area exponent p (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "sediment_transport_index": {
            "name": "Sediment Transport Index",
            "params": {
              "sca": {
                "label": "Sca",
                "description": "Specific catchment area raster path or typed raster object."
              },
              "slope": {
                "label": "Slope",
                "description": "Slope raster in degrees."
              },
              "sca_exponent": {
                "label": "Sca Exponent",
                "description": "Specific catchment area exponent n (default 0.4)."
              },
              "slope_exponent": {
                "label": "Slope Exponent",
                "description": "Slope exponent m (default 1.3)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "wetness_index": {
            "name": "Wetness Index",
            "params": {
              "sca": {
                "label": "Sca",
                "description": "Specific catchment area raster path or typed raster object."
              },
              "slope": {
                "label": "Slope",
                "description": "Slope raster in degrees."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "extract_streams": {
            "name": "Extract Streams",
            "params": {
              "flow_accumulation": {
                "label": "Flow Accumulation",
                "description": "Input flow accumulation raster."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum accumulation value required to be part of a stream channel."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, non-stream background is 0 instead of NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output stream raster path."
              }
            }
          },
          "extract_valleys": {
            "name": "Extract Valleys",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Dem"
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Filter Size"
              },
              "line_thin": {
                "label": "Line Thin",
                "description": "Line Thin"
              },
              "variant": {
                "label": "Variant",
                "description": "Variant"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "prune_vector_streams": {
            "name": "Prune Vector Streams",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster used to determine flow direction"
              },
              "streams": {
                "label": "Streams",
                "description": "Input vector stream network"
              },
              "max_ridge_cutting_height": {
                "label": "Max Ridge Cutting Height",
                "description": "Maximum elevation rise allowed when connecting downstream links"
              },
              "snap_distance": {
                "label": "Snap Distance",
                "description": "Maximum snapping distance for endpoint connectivity"
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum Shreve magnitude to retain"
              },
              "output": {
                "label": "Output",
                "description": "Output vector path"
              }
            }
          },
          "raster_streams_to_vector": {
            "name": "Raster Streams To Vector",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams_raster": {
                "label": "Streams Raster",
                "description": "Stream raster"
              },
              "all_vertices": {
                "label": "All Vertices",
                "description": "All Vertices"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "rasterize_streams": {
            "name": "Rasterize Streams",
            "params": {
              "input_vector": {
                "label": "Input Vector",
                "description": "Input Vector"
              },
              "reference_raster": {
                "label": "Reference Raster",
                "description": "Reference Raster"
              },
              "use_feature_id": {
                "label": "Use Feature Id",
                "description": "Use Feature Id"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "remove_short_streams": {
            "name": "Remove Short Streams",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "min_length": {
                "label": "Min Length",
                "description": "Min Length"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "repair_stream_vector_topology": {
            "name": "Repair Stream Vector Topology",
            "params": {
              "input_vector": {
                "label": "Input Vector",
                "description": "Input Vector"
              },
              "snap": {
                "label": "Snap",
                "description": "Snap"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "river_centerlines": {
            "name": "River Centerlines",
            "params": {
              "raster": {
                "label": "Raster",
                "description": "Binary water/non-water raster"
              },
              "min_length": {
                "label": "Min Length",
                "description": "Minimum centerline length in raster cells"
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Search radius (cells) used to connect nearby endpoints"
              },
              "output": {
                "label": "Output",
                "description": "Output centerline vector path"
              }
            }
          },
          "farthest_channel_head": {
            "name": "Farthest Channel Head",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "find_main_stem": {
            "name": "Find Main Stem",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "length_of_upstream_channels": {
            "name": "Length Of Upstream Channels",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "long_profile": {
            "name": "Long Profile",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "dem": {
                "label": "Dem",
                "description": "Dem"
              },
              "streams_raster": {
                "label": "Streams Raster",
                "description": "Stream raster"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "long_profile_from_points": {
            "name": "Long Profile From Points",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "dem": {
                "label": "Dem",
                "description": "Dem"
              },
              "points": {
                "label": "Points",
                "description": "Points"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "hack_stream_order": {
            "name": "Hack Stream Order",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Stream raster"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI-style pointer"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Assign zero to background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "horton_ratios": {
            "name": "Horton Ratios",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "streams_raster": {
                "label": "Streams Raster",
                "description": "Binary stream raster (positive = stream)."
              },
              "output": {
                "label": "Output",
                "description": "Output text report path (optional)."
              }
            }
          },
          "horton_stream_order": {
            "name": "Horton Stream Order",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Stream raster"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI-style pointer"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Assign zero to background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "shreve_stream_magnitude": {
            "name": "Shreve Stream Magnitude",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Stream raster"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI-style pointer"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Assign zero to background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "strahler_order_basins": {
            "name": "Strahler Order Basins",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 pointer raster."
              },
              "streams": {
                "label": "Streams",
                "description": "Stream-network raster where stream cells have value > 0 and are not NoData."
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "ESRI pointer encoding flag."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "strahler_stream_order": {
            "name": "Strahler Stream Order",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Stream raster (positive values = stream cells)"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Use ESRI-style pointer values (default: Whitebox)"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Assign zero to background instead of NoData"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "stream_link_class": {
            "name": "Stream Link Class",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "stream_link_identifier": {
            "name": "Stream Link Identifier",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "stream_link_length": {
            "name": "Stream Link Length",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "linkid": {
                "label": "Linkid",
                "description": "Linkid"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "stream_link_slope": {
            "name": "Stream Link Slope",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "dem": {
                "label": "Dem",
                "description": "Dem"
              },
              "linkid": {
                "label": "Linkid",
                "description": "Linkid"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "stream_slope_continuous": {
            "name": "Stream Slope Continuous",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "dem": {
                "label": "Dem",
                "description": "Dem"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "topological_stream_order": {
            "name": "Topological Stream Order",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "tributary_identifier": {
            "name": "Tributary Identifier",
            "params": {
              "d8_pntr": {
                "label": "D8 Pntr",
                "description": "D8 flow pointer raster"
              },
              "streams": {
                "label": "Streams",
                "description": "Streams"
              },
              "esri_pntr": {
                "label": "Esri Pntr",
                "description": "Esri Pntr"
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero Background"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "vector_stream_network_analysis": {
            "name": "Vector Stream Network Analysis",
            "params": {
              "streams": {
                "label": "Streams",
                "description": "Input stream network vector layer."
              },
              "dem": {
                "label": "Dem",
                "description": "Input elevation raster (DEM)."
              },
              "max_ridge_cutting_height": {
                "label": "Max Ridge Cutting Height",
                "description": "Maximum allowable ridge-cutting height."
              },
              "snap_distance": {
                "label": "Snap Distance",
                "description": "Snapping distance tolerance for network cleanup."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path."
              }
            }
          },
          "add_point_coordinates_to_table": {
            "name": "Add Point Coordinates To Table",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "clean_vector": {
            "name": "Clean Vector",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "csv_points_to_vector": {
            "name": "Csv Points To Vector",
            "params": {
              "input_file": {
                "label": "Input File",
                "description": "Input CSV file path."
              },
              "x_field_num": {
                "label": "X Field Num",
                "description": "Zero-based index for X coordinate field. Defaults to 0."
              },
              "y_field_num": {
                "label": "Y Field Num",
                "description": "Zero-based index for Y coordinate field. Defaults to 1."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Optional EPSG code for output CRS."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "export_table_to_csv": {
            "name": "Export Table To Csv",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "output_csv_file": {
                "label": "Output Csv File",
                "description": "Output CSV file path."
              },
              "headers": {
                "label": "Headers",
                "description": "Include header row in output. Defaults to true."
              }
            }
          },
          "join_tables": {
            "name": "Join Tables",
            "params": {
              "primary_vector": {
                "label": "Primary Vector",
                "description": "Primary vector path to receive joined fields."
              },
              "primary_key_field": {
                "label": "Primary Key Field",
                "description": "Primary key field in primary vector."
              },
              "foreign_vector": {
                "label": "Foreign Vector",
                "description": "Foreign vector path containing source fields."
              },
              "foreign_key_field": {
                "label": "Foreign Key Field",
                "description": "Foreign key field in foreign vector."
              },
              "import_field": {
                "label": "Import Field",
                "description": "Optional single field to import; defaults to all non-key, non-FID fields."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. Defaults to a derived GeoJSON path beside primary input."
              }
            }
          },
          "merge_table_with_csv": {
            "name": "Merge Table With Csv",
            "params": {
              "primary_vector": {
                "label": "Primary Vector",
                "description": "Primary vector path to receive merged fields."
              },
              "primary_key_field": {
                "label": "Primary Key Field",
                "description": "Primary key field in primary vector."
              },
              "foreign_csv_filename": {
                "label": "Foreign Csv Filename",
                "description": "CSV file containing foreign table."
              },
              "foreign_key_field": {
                "label": "Foreign Key Field",
                "description": "Foreign key field name in CSV header."
              },
              "import_field": {
                "label": "Import Field",
                "description": "Optional single CSV field to import; defaults to all non-key fields."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. Defaults to a derived GeoJSON path beside primary input."
              }
            }
          },
          "merge_vectors": {
            "name": "Merge Vectors",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of input vector paths (at least two required)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "reinitialize_attribute_table": {
            "name": "Reinitialize Attribute Table",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. If omitted, overwrites the input path."
              }
            }
          },
          "vector_summary_statistics": {
            "name": "Vector Summary Statistics",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Grouping field name."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric value field name."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "fix_dangling_arcs": {
            "name": "Fix Dangling Arcs",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector path."
              },
              "snap": {
                "label": "Snap",
                "description": "Snap distance threshold in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "lines_to_polygons": {
            "name": "Lines To Polygons",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "multipart_to_singlepart": {
            "name": "Multipart To Singlepart",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path (polyline, polygon, or multipoint)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. Defaults to a timestamped GeoJSON beside the input."
              },
              "exclude_holes": {
                "label": "Exclude Holes",
                "description": "When true, polygon holes remain attached to their enclosing exterior ring (default: false)."
              }
            }
          },
          "polygons_to_lines": {
            "name": "Polygons To Lines",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "remove_polygon_holes": {
            "name": "Remove Polygon Holes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "singlepart_to_multipart": {
            "name": "Singlepart To Multipart",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. Defaults to a timestamped GeoJSON beside the input."
              },
              "field": {
                "label": "Field",
                "description": "Optional attribute field name to group features by. When omitted, all features are merged into one geometry."
              }
            }
          },
          "topology_rule_autofix": {
            "name": "Topology Rule Autofix",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "rule_set": {
                "label": "Rule Set",
                "description": "Rule configuration as JSON array/object, CSV string, or file path. Rules with automatic fixes: line_endpoints_must_snap_within_tolerance, line_must_not_have_dangles, point_must_be_covered_by_line. polygon_must_not_have_gaps is accepted but never produces changes."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Tolerance for snapping operations in coordinate units. Defaults to 0.01."
              },
              "dry_run": {
                "label": "Dry Run",
                "description": "If true (THE DEFAULT), previews only: the change report is emitted but no output is written. Pass false to apply fixes."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path for fixed features. If omitted, derived beside input."
              },
              "change_report": {
                "label": "Change Report",
                "description": "Optional JSON change audit-trail report path."
              }
            }
          },
          "topology_rule_validate": {
            "name": "Topology Rule Validate",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "rule_set": {
                "label": "Rule Set",
                "description": "Rule configuration as JSON array/object, CSV string, or file path. Defaults to all 6 MVP rules. Supported: line_must_not_self_intersect, polygon_must_not_overlap, polygon_must_not_have_gaps, line_must_not_have_dangles, point_must_be_covered_by_line, line_endpoints_must_snap_within_tolerance."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Tolerance for line_endpoints_must_snap_within_tolerance rule in coordinate units. Defaults to 1.0."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path for violations. If omitted, derived beside input."
              },
              "report": {
                "label": "Report",
                "description": "Optional JSON summary report path."
              }
            }
          },
          "topology_validation_report": {
            "name": "Topology Validation Report",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path."
              }
            }
          },
          "convert_nodata_to_zero": {
            "name": "Convert Nodata To Zero",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, returns an in-memory raster."
              }
            }
          },
          "modify_nodata_value": {
            "name": "Modify Nodata Value",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "new_value": {
                "label": "New Value",
                "description": "New nodata value. Defaults to -32768.0."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, returns an in-memory raster."
              }
            }
          },
          "new_raster_from_base_raster": {
            "name": "New Raster From Base Raster",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, returns an in-memory raster."
              },
              "out_val": {
                "label": "Out Val",
                "description": "Optional fill value. Defaults to raster nodata."
              },
              "data_type": {
                "label": "Data Type",
                "description": "Optional data type: 'float', 'double', or 'integer'."
              }
            }
          },
          "new_raster_from_base_vector": {
            "name": "New Raster From Base Vector",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base vector path."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output grid cell size (> 0)."
              },
              "out_val": {
                "label": "Out Val",
                "description": "Optional fill value. Defaults to nodata (-32768)."
              },
              "data_type": {
                "label": "Data Type",
                "description": "Optional output data type keyword: integer, float, or double."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, output remains in memory."
              }
            }
          },
          "raster_to_vector_lines": {
            "name": "Raster To Vector Lines",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path (single-band)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "raster_to_vector_points": {
            "name": "Raster To Vector Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "raster_to_vector_polygons": {
            "name": "Raster To Vector Polygons",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path (single-band)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path. If omitted, a GeoJSON path is derived beside the input."
              }
            }
          },
          "remove_raster_polygon_holes": {
            "name": "Remove Raster Polygon Holes",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path (single-band)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Optional maximum hole size in cells to remove. 0 means all enclosed holes."
              },
              "use_diagonals": {
                "label": "Use Diagonals",
                "description": "Use 8-neighbour connectedness for clumping and edge connectivity."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, output remains in memory."
              }
            }
          },
          "set_nodata_value": {
            "name": "Set Nodata Value",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "back_value": {
                "label": "Back Value",
                "description": "Background value to assign as nodata. Defaults to 0.0."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, returns an in-memory raster."
              }
            }
          },
          "vector_lines_to_raster": {
            "name": "Vector Lines To Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path (lines or polygons)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, output remains in memory."
              },
              "field": {
                "label": "Field",
                "description": "Optional numeric field name to burn. Defaults to FID."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "When true, initialize output background to 0 instead of nodata."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when 'base' is not supplied. If omitted and no base is given, auto cell size is max extent / 500."
              },
              "base": {
                "label": "Base",
                "description": "Optional base raster path defining output grid and extent."
              }
            }
          },
          "vector_points_to_raster": {
            "name": "Vector Points To Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector path (point/multipoint)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, result is in-memory."
              },
              "field": {
                "label": "Field",
                "description": "Optional numeric field used for raster values. Defaults to FID."
              },
              "assign": {
                "label": "Assign",
                "description": "Assignment operation: last, first, min, max, sum, num, mean."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "When true, initializes background to 0; otherwise nodata."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size. Required when 'base' is not provided."
              },
              "base": {
                "label": "Base",
                "description": "Optional base raster path to define extent/grid."
              }
            }
          },
          "vector_polygons_to_raster": {
            "name": "Vector Polygons To Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector path."
              },
              "field": {
                "label": "Field",
                "description": "Optional numeric field name for burn values (defaults to FID)."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "When true, initializes output background to 0 instead of nodata."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when 'base' is not supplied."
              },
              "base": {
                "label": "Base",
                "description": "Optional base raster path defining output grid and extent."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, output remains in memory."
              }
            }
          },
          "local_morans_i_lisa_raster": {
            "name": "Local Morans I Lisa Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer with observation points."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to analyze."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "k value for k_nearest mode (default 8)."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for distance_band mode."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Apply row standardization to weights (default true)."
              },
              "island_policy": {
                "label": "Island Policy",
                "description": "Island handling: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Significance threshold in [0, 1]; default 0.05."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size (optional; auto-computed from extent)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path (classification: 0=NS, 1=HH, 2=LL, 3=HL, 4=LH)."
              }
            }
          },
          "getis_ord_gi_star_raster": {
            "name": "Getis Ord Gi Star Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer with observation points."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to analyze."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "k value for k_nearest mode (default 8)."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold for distance_band mode."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Apply row standardization to weights (default true)."
              },
              "island_policy": {
                "label": "Island Policy",
                "description": "Island handling: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Significance threshold in [0, 1]; default 0.05."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size (optional; auto-computed from extent)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path (classification: -1=Cold, 0=NS, 1=Hot)."
              }
            }
          },
          "ordinary_kriging": {
            "name": "Ordinary Kriging",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric attribute field containing values to interpolate."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units (required if no base_raster)."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "local_kriging": {
            "name": "Local Kriging",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric attribute field containing values to interpolate."
              },
              "k_neighbors": {
                "label": "K Neighbors",
                "description": "Number of nearest neighbors to use; defaults to 10."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units (required if no base_raster)."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "simple_kriging": {
            "name": "Simple Kriging",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric attribute field containing values to interpolate."
              },
              "known_mean": {
                "label": "Known Mean",
                "description": "Known mean of the spatial field."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units (required if no base_raster)."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "universal_kriging": {
            "name": "Universal Kriging",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric attribute field containing values to interpolate."
              },
              "trend_order": {
                "label": "Trend Order",
                "description": "Polynomial trend order (1=linear, 2=quadratic); defaults to 1."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units (required if no base_raster)."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "spacetime_kriging": {
            "name": "Spacetime Kriging",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric attribute field containing values to interpolate."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Temporal attribute field containing time values."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units (required if no base_raster)."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "spatial_lag_regression_raster": {
            "name": "Spatial Lag Regression Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "response_field": {
                "label": "Response Field",
                "description": "Response variable."
              },
              "predictor_fields": {
                "label": "Predictor Fields",
                "description": "Predictor fields."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode."
              },
              "k": {
                "label": "K",
                "description": "k for k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Row standardize weights."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size."
              },
              "output": {
                "label": "Output",
                "description": "Output raster."
              }
            }
          },
          "spatial_error_regression_raster": {
            "name": "Spatial Error Regression Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "response_field": {
                "label": "Response Field",
                "description": "Response variable."
              },
              "predictor_fields": {
                "label": "Predictor Fields",
                "description": "Predictor fields."
              },
              "weights_mode": {
                "label": "Weights Mode",
                "description": "Neighborhood mode."
              },
              "k": {
                "label": "K",
                "description": "k for k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance threshold."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Row standardize weights."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size."
              },
              "output": {
                "label": "Output",
                "description": "Output raster."
              }
            }
          },
          "geographically_weighted_regression_raster": {
            "name": "Geographically Weighted Regression Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "response_field": {
                "label": "Response Field",
                "description": "Response variable."
              },
              "predictor_fields": {
                "label": "Predictor Fields",
                "description": "Predictor fields."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Kernel bandwidth."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Kernel type."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size."
              },
              "output_prefix": {
                "label": "Output Prefix",
                "description": "Output raster prefix."
              }
            }
          },
          "inhomogeneous_intensity_raster": {
            "name": "Inhomogeneous Intensity Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Kernel bandwidth."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Kernel type."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size."
              },
              "output": {
                "label": "Output",
                "description": "Output intensity raster."
              }
            }
          },
          "add": {
            "name": "Add",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "average_overlay": {
            "name": "Average Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "bool_and": {
            "name": "Bool And",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "bool_not": {
            "name": "Bool Not",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "bool_or": {
            "name": "Bool Or",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "bool_xor": {
            "name": "Bool Xor",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "count_if": {
            "name": "Count If",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison_value": {
                "label": "Comparison Value",
                "description": "Comparison value to count within the raster stack."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "divide": {
            "name": "Divide",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "highest_position": {
            "name": "Highest Position",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "lowest_position": {
            "name": "Lowest Position",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "max_absolute_overlay": {
            "name": "Max Absolute Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "max_overlay": {
            "name": "Max Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "min_absolute_overlay": {
            "name": "Min Absolute Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "min_overlay": {
            "name": "Min Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "modulo": {
            "name": "Modulo",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "multiply": {
            "name": "Multiply",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "multiply_overlay": {
            "name": "Multiply Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "percent_equal_to": {
            "name": "Percent Equal To",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparison",
                "description": "Comparison raster path or in-memory raster handle."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "percent_greater_than": {
            "name": "Percent Greater Than",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparison",
                "description": "Comparison raster path or in-memory raster handle."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "percent_less_than": {
            "name": "Percent Less Than",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparison",
                "description": "Comparison raster path or in-memory raster handle."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "pick_from_list": {
            "name": "Pick From List",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "pos_input": {
                "label": "Pos Input",
                "description": "Zero-based raster of stack positions."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "power": {
            "name": "Power",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "standard_deviation_overlay": {
            "name": "Standard Deviation Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "subtract": {
            "name": "Subtract",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "sum_overlay": {
            "name": "Sum Overlay",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack as an array of paths or a semicolon/comma-delimited string."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result remains in memory."
              }
            }
          },
          "update_nodata_cells": {
            "name": "Update Nodata Cells",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Primary raster to update."
              },
              "input2": {
                "label": "Input2",
                "description": "Secondary raster providing replacement values."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "weighted_overlay": {
            "name": "Weighted Overlay",
            "params": {
              "factors": {
                "label": "Factors",
                "description": "Input factor raster stack."
              },
              "weights": {
                "label": "Weights",
                "description": "Numeric weights corresponding to each factor raster."
              },
              "cost": {
                "label": "Cost",
                "description": "Optional boolean flags indicating cost factors."
              },
              "constraints": {
                "label": "Constraints",
                "description": "Optional raster constraints stack; values <= 0 force output to zero."
              },
              "scale_max": {
                "label": "Scale Max",
                "description": "Maximum scale value used after factor normalization."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "weighted_sum": {
            "name": "Weighted Sum",
            "params": {
              "input_rasters": {
                "label": "Input Rasters",
                "description": "Input raster stack."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "weights": {
                "label": "Weights",
                "description": "Numeric weights corresponding to each input raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "image_correlation_neighbourhood_analysis": {
            "name": "Image Correlation Neighbourhood Analysis",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster path."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Moving window size in cells (minimum 3, default 11)."
              },
              "correlation_stat": {
                "label": "Correlation Stat",
                "description": "Correlation metric: pearson, spearman, or kendall (default pearson)."
              },
              "output1": {
                "label": "Output1",
                "description": "Optional output path for correlation raster."
              },
              "output2": {
                "label": "Output2",
                "description": "Optional output path for significance (p-value) raster."
              }
            }
          },
          "natural_neighbour_interpolation": {
            "name": "Natural Neighbour Interpolation",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "clip_to_hull": {
                "label": "Clip To Hull",
                "description": "Limit interpolation to the convex hull of points."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "nearest_neighbour_interpolation": {
            "name": "Nearest Neighbour Interpolation",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Optional maximum search distance in map units; defaults to infinity."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "conditional_evaluation": {
            "name": "Conditional Evaluation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "statement": {
                "label": "Statement",
                "description": "Conditional expression evaluated per cell."
              },
              "true": {
                "label": "True",
                "description": "Value or raster/expression used when condition is true."
              },
              "false": {
                "label": "False",
                "description": "Value or raster/expression used when condition is false."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "reclass": {
            "name": "Reclass",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "reclass_values": {
                "label": "Reclass Values",
                "description": "Reclassification values as rows of [new, from, to_less_than] or [new, old] when assign_mode=true."
              },
              "assign_mode": {
                "label": "Assign Mode",
                "description": "If true, use exact assignment mode with [new_value, old_value] pairs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, result is kept in memory."
              }
            }
          },
          "reclass_equal_interval": {
            "name": "Reclass Equal Interval",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "interval_size": {
                "label": "Interval Size",
                "description": "Equal-interval bin width."
              },
              "start_value": {
                "label": "Start Value",
                "description": "Optional lower bound for reclassification; defaults to raster minimum."
              },
              "end_value": {
                "label": "End Value",
                "description": "Optional upper bound for reclassification; defaults to raster maximum."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, result is kept in memory."
              }
            }
          },
          "buffer_raster": {
            "name": "Buffer Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster where non-zero cells are buffer targets."
              },
              "buffer_size": {
                "label": "Buffer Size",
                "description": "Buffer distance threshold."
              },
              "grid_cell_units": {
                "label": "Grid Cell Units",
                "description": "If true, interpret buffer_size in grid-cell units instead of map units."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "cost_allocation": {
            "name": "Cost Allocation",
            "params": {
              "source": {
                "label": "Source",
                "description": "Source raster with positive source cells."
              },
              "backlink": {
                "label": "Backlink",
                "description": "Backlink raster from cost_distance."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "cost_distance": {
            "name": "Cost Distance",
            "params": {
              "source": {
                "label": "Source",
                "description": "Source raster with positive source cells."
              },
              "cost": {
                "label": "Cost",
                "description": "Cost/friction raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional accumulated-cost output raster path."
              },
              "backlink_output": {
                "label": "Backlink Output",
                "description": "Optional backlink output raster path."
              }
            }
          },
          "cost_pathway": {
            "name": "Cost Pathway",
            "params": {
              "destination": {
                "label": "Destination",
                "description": "Destination raster with positive destination cells."
              },
              "backlink": {
                "label": "Backlink",
                "description": "Backlink raster from cost_distance."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, output background is zero instead of NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "euclidean_allocation": {
            "name": "Euclidean Allocation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster with non-zero target cells."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "euclidean_distance": {
            "name": "Euclidean Distance",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster with non-zero target cells."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "abs": {
            "name": "Abs",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "aggregate_raster": {
            "name": "Aggregate Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "aggregation_factor": {
                "label": "Aggregation Factor",
                "description": "Block size in source cells."
              },
              "aggregation_type": {
                "label": "Aggregation Type",
                "description": "One of mean, sum, maximum, minimum, or range."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "anova": {
            "name": "Anova",
            "params": {
              "input": {
                "label": "Input",
                "description": "Measurement raster path."
              },
              "features": {
                "label": "Features",
                "description": "Class/category raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "arccos": {
            "name": "Arccos",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "arcosh": {
            "name": "Arcosh",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "arcsin": {
            "name": "Arcsin",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "arctan": {
            "name": "Arctan",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "arsinh": {
            "name": "Arsinh",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "artanh": {
            "name": "Artanh",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "atan2": {
            "name": "Atan2",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "block_maximum": {
            "name": "Block Maximum",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field to rasterize; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "block_minimum": {
            "name": "Block Minimum",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field to rasterize; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "boundary_shape_complexity": {
            "name": "Boundary Shape Complexity",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch-ID raster with positive integer-like IDs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "ceil": {
            "name": "Ceil",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "centroid_raster": {
            "name": "Centroid Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "clip_raster_to_polygon": {
            "name": "Clip Raster To Polygon",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "polygons": {
                "label": "Polygons",
                "description": "Input polygon vector layer."
              },
              "maintain_dimensions": {
                "label": "Maintain Dimensions",
                "description": "Preserve original raster dimensions instead of cropping to polygon extent."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "clump": {
            "name": "Clump",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical raster."
              },
              "diag": {
                "label": "Diag",
                "description": "If true, include diagonal connectivity (8-neighbour); otherwise use 4-neighbour."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, treat zero-valued cells as background and keep them as zero in output."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "cos": {
            "name": "Cos",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "cosh": {
            "name": "Cosh",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "create_plane": {
            "name": "Create Plane",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base raster that defines output geometry."
              },
              "gradient": {
                "label": "Gradient",
                "description": "Plane slope gradient in degrees."
              },
              "aspect": {
                "label": "Aspect",
                "description": "Plane aspect in degrees."
              },
              "constant": {
                "label": "Constant",
                "description": "Additive constant term in plane equation."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "crispness_index": {
            "name": "Crispness Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "cross_tabulation": {
            "name": "Cross Tabulation",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Input raster 1 path."
              },
              "input2": {
                "label": "Input2",
                "description": "Input raster 2 path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "cumulative_distribution": {
            "name": "Cumulative Distribution",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "dbscan": {
            "name": "Dbscan",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma/semicolon-delimited list or JSON array of input raster paths (feature bands)."
              },
              "scaling_method": {
                "label": "Scaling Method",
                "description": "Feature scaling: 'none' (default), 'normalize' (0-1 range), or 'standardize' (z-scores)."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Epsilon: neighbourhood search radius in feature space (default 1.0)."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum number of neighbours within epsilon for a core point (default 5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path for cluster-ID labels."
              }
            }
          },
          "decrement": {
            "name": "Decrement",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "value": {
                "label": "Value",
                "description": "The amount to subtract from each cell. Defaults to 1.0."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "edge_proportion": {
            "name": "Edge Proportion",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch-ID raster with positive integer-like IDs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "equal_to": {
            "name": "Equal To",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "erase_polygon_from_raster": {
            "name": "Erase Polygon From Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "polygons": {
                "label": "Polygons",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "exp": {
            "name": "Exp",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "exp2": {
            "name": "Exp2",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "fft_random_field": {
            "name": "Fft Random Field",
            "params": {
              "base_raster": {
                "label": "Base Raster",
                "description": "Base raster path used for grid geometry."
              },
              "range": {
                "label": "Range",
                "description": "Approximate correlation range in map units. Default: 1.0."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "filter_raster_features_by_area": {
            "name": "Filter Raster Features By Area",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster containing integer class labels."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum feature size in cells to retain."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, removed features are assigned 0; otherwise removed features are assigned NoData."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, result is kept in memory."
              }
            }
          },
          "find_patch_edge_cells": {
            "name": "Find Patch Edge Cells",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch-ID raster; positive values are treated as patch cells."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "floor": {
            "name": "Floor",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "greater_than": {
            "name": "Greater Than",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "heat_map": {
            "name": "Heat Map",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric weight field; defaults to unweighted occurrences."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Kernel bandwidth in map units."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "kernel_function": {
                "label": "Kernel Function",
                "description": "Kernel function type; defaults to quartic."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "idw_interpolation": {
            "name": "Idw Interpolation",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "weight": {
                "label": "Weight",
                "description": "IDW distance exponent; defaults to 2.0."
              },
              "radius": {
                "label": "Radius",
                "description": "Optional neighbourhood radius in map units; <=0 uses k-nearest fallback."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum number of neighbours to use; defaults to 0."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "image_autocorrelation": {
            "name": "Image Autocorrelation",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster path list."
              },
              "contiguity": {
                "label": "Contiguity",
                "description": "Neighbourhood rule: rook, king/queen, or bishop."
              }
            }
          },
          "image_correlation": {
            "name": "Image Correlation",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster path list."
              }
            }
          },
          "image_regression": {
            "name": "Image Regression",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Independent-variable raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Dependent-variable raster path."
              },
              "standardize_residuals": {
                "label": "Standardize Residuals",
                "description": "Whether to standardize residuals by model standard error."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for residual raster."
              }
            }
          },
          "increment": {
            "name": "Increment",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "value": {
                "label": "Value",
                "description": "The amount to add to each cell. Defaults to 1.0."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "inplace_add": {
            "name": "Inplace Add",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Input raster to modify."
              },
              "input2": {
                "label": "Input2",
                "description": "Input raster path or numeric constant."
              }
            }
          },
          "inplace_divide": {
            "name": "Inplace Divide",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Input raster to modify."
              },
              "input2": {
                "label": "Input2",
                "description": "Input raster path or non-zero numeric constant."
              }
            }
          },
          "inplace_multiply": {
            "name": "Inplace Multiply",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Input raster to modify."
              },
              "input2": {
                "label": "Input2",
                "description": "Input raster path or numeric constant."
              }
            }
          },
          "inplace_subtract": {
            "name": "Inplace Subtract",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Input raster to modify."
              },
              "input2": {
                "label": "Input2",
                "description": "Input raster path or numeric constant."
              }
            }
          },
          "integer_division": {
            "name": "Integer Division",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "inverse_pca": {
            "name": "Inverse Pca",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Component raster paths."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "pca_report": {
                "label": "Pca Report",
                "description": "JSON report string from PCA."
              },
              "output": {
                "label": "Output",
                "description": "Optional base output path."
              }
            }
          },
          "is_nodata": {
            "name": "Is Nodata",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "kappa_index": {
            "name": "Kappa Index",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "Input classification raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Input reference raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "ks_normality_test": {
            "name": "Ks Normality Test",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Optional random sample size. Omit to use all valid cells."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "less_than": {
            "name": "Less Than",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "list_unique_values_raster": {
            "name": "List Unique Values Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output CSV path."
              },
              "strict_parity": {
                "label": "Strict Parity",
                "description": "When true, return complete category-frequency output (default true)."
              },
              "max_values": {
                "label": "Max Values",
                "description": "Maximum unique values to include when strict_parity is false (default 10000)."
              }
            }
          },
          "ln": {
            "name": "Ln",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "log10": {
            "name": "Log10",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "log2": {
            "name": "Log2",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "map_features": {
            "name": "Map Features",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "min_feature_height": {
                "label": "Min Feature Height",
                "description": "Minimum vertical separation for independent features."
              },
              "min_feature_size": {
                "label": "Min Feature Size",
                "description": "Minimum feature size in cells."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "max": {
            "name": "Max",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First raster path or numeric constant."
              },
              "input2": {
                "label": "Input2",
                "description": "Second raster path or numeric constant."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "min": {
            "name": "Min",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First raster path or numeric constant."
              },
              "input2": {
                "label": "Input2",
                "description": "Second raster path or numeric constant."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "modified_shepard_interpolation": {
            "name": "Modified Shepard Interpolation",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "weight": {
                "label": "Weight",
                "description": "Shepard weight exponent; defaults to 2.0."
              },
              "radius": {
                "label": "Radius",
                "description": "Optional neighbourhood radius in map units."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum number of neighbours; defaults to 8."
              },
              "use_quadratic_basis": {
                "label": "Use Quadratic Basis",
                "description": "Apply local quadratic basis corrections (legacy-compatible mode)."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "use_data_hull": {
                "label": "Use Data Hull",
                "description": "Limit interpolation to the convex hull of points."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "narrowness_index": {
            "name": "Narrowness Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch-ID raster with positive integer-like IDs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "negate": {
            "name": "Negate",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "nibble": {
            "name": "Nibble",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster to be nibbled."
              },
              "mask": {
                "label": "Mask",
                "description": "Binary mask raster."
              },
              "use_nodata": {
                "label": "Use Nodata",
                "description": "Treat input nodata as class value (not background)."
              },
              "nibble_nodata": {
                "label": "Nibble Nodata",
                "description": "Also nibble into mask-off nodata areas."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "not_equal_to": {
            "name": "Not Equal To",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "paired_sample_t_test": {
            "name": "Paired Sample T Test",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster path."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Optional sample size with replacement."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "phi_coefficient": {
            "name": "Phi Coefficient",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First binary raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Second binary raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              }
            }
          },
          "principal_component_analysis": {
            "name": "Principal Component Analysis",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input raster paths (≥3)."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "num_components": {
                "label": "Num Components",
                "description": "Number of components. Default: all."
              },
              "standardized": {
                "label": "Standardized",
                "description": "Use correlation matrix. Default: false."
              },
              "output": {
                "label": "Output",
                "description": "Optional base output path."
              }
            }
          },
          "print_geotiff_tags": {
            "name": "Print Geotiff Tags",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              }
            }
          },
          "quantiles": {
            "name": "Quantiles",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "num_quantiles": {
                "label": "Num Quantiles",
                "description": "Number of quantiles (default 5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "radial_basis_function_interpolation": {
            "name": "Radial Basis Function Interpolation",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "approximate_mode": {
                "label": "Approximate Mode",
                "description": "If true, use NG fast approximate weighting; if false, solve local RBF systems (legacy-style)."
              },
              "radius": {
                "label": "Radius",
                "description": "Optional neighbourhood radius in map units."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum number of neighbours to use."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "func_type": {
                "label": "Func Type",
                "description": "Radial basis type (thinplatespline, polyharmonic, gaussian, multiquadric, inversemultiquadric)."
              },
              "poly_order": {
                "label": "Poly Order",
                "description": "Polynomial order hint (none, constant, quadratic)."
              },
              "weight": {
                "label": "Weight",
                "description": "Basis shape parameter/exponent depending on func_type."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "radius_of_gyration": {
            "name": "Radius Of Gyration",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch-ID raster with positive integer-like IDs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "random_field": {
            "name": "Random Field",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base raster path used for grid geometry."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "random_forest_classification_fit": {
            "name": "Random Forest Classification Fit",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point/polygon vector training data path."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "split_criterion": {
                "label": "Split Criterion",
                "description": "Tree split criterion hint (retained for legacy compatibility)."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees in the forest (default 200)."
              },
              "min_samples_leaf": {
                "label": "Min Samples Leaf",
                "description": "Minimum number of samples required at a leaf node (default 1)."
              },
              "min_samples_split": {
                "label": "Min Samples Split",
                "description": "Minimum number of samples required to split an internal node (default 2)."
              },
              "test_proportion": {
                "label": "Test Proportion",
                "description": "Legacy compatibility argument; reserved for future diagnostics."
              }
            }
          },
          "random_forest_classification_predict": {
            "name": "Random Forest Classification Predict",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "model_bytes": {
                "label": "Model Bytes",
                "description": "Model bytes produced by random_forest_classification_fit."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "random_forest_regression_fit": {
            "name": "Random Forest Regression Fit",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "training_data": {
                "label": "Training Data",
                "description": "Point vector training data path."
              },
              "field": {
                "label": "Field",
                "description": "Numeric target field in training_data attributes."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Feature scaling mode: none (default), normalize, standardize."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees in the forest (default 200)."
              },
              "min_samples_leaf": {
                "label": "Min Samples Leaf",
                "description": "Minimum number of samples required at a leaf node (default 1)."
              },
              "min_samples_split": {
                "label": "Min Samples Split",
                "description": "Minimum number of samples required to split an internal node (default 2)."
              },
              "test_proportion": {
                "label": "Test Proportion",
                "description": "Legacy compatibility argument; reserved for future diagnostics."
              }
            }
          },
          "random_forest_regression_predict": {
            "name": "Random Forest Regression Predict",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Array of single-band input rasters."
              },
              "model_bytes": {
                "label": "Model Bytes",
                "description": "Model bytes produced by random_forest_regression_fit."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "random_sample": {
            "name": "Random Sample",
            "params": {
              "base": {
                "label": "Base",
                "description": "Base raster path used for grid geometry and valid-cell mask."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Number of sample cells to generate."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "raster_area": {
            "name": "Raster Area",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical raster."
              },
              "units": {
                "label": "Units",
                "description": "Area units: 'map units' (default) or 'grid cells'."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, zero-valued cells are excluded from analysis."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "raster_calculator": {
            "name": "Raster Calculator",
            "params": {
              "expression": {
                "label": "Expression",
                "description": "Math expression with quoted raster variable names."
              },
              "inputs": {
                "label": "Inputs",
                "description": "Ordered input raster paths."
              },
              "auto_reproject": {
                "label": "Auto Reproject",
                "description": "If true (default), automatically reproject stack rasters to match inputs[0] when CRS differs."
              },
              "auto_reproject_method": {
                "label": "Auto Reproject Method",
                "description": "Optional reprojection resampling method override: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "raster_cell_assignment": {
            "name": "Raster Cell Assignment",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input base raster."
              },
              "what_to_assign": {
                "label": "What To Assign",
                "description": "Assignment target: column, row, x, or y."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "raster_histogram": {
            "name": "Raster Histogram",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional HTML report output path (alias: output_html_file)."
              },
              "bins": {
                "label": "Bins",
                "description": "Number of histogram bins (default log2(rows*cols)+1)."
              }
            }
          },
          "raster_perimeter": {
            "name": "Raster Perimeter",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical raster."
              },
              "units": {
                "label": "Units",
                "description": "Perimeter units: 'map units' (default) or 'grid cells'."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "If true, zero-valued cells are excluded from analysis."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "raster_summary_stats": {
            "name": "Raster Summary Stats",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output report path (.json or .csv)."
              }
            }
          },
          "reciprocal": {
            "name": "Reciprocal",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "rescale_value_range": {
            "name": "Rescale Value Range",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "out_min": {
                "label": "Out Min",
                "description": "Minimum output value."
              },
              "out_max": {
                "label": "Out Max",
                "description": "Maximum output value."
              },
              "clip_min": {
                "label": "Clip Min",
                "description": "Optional input minimum for clipping before rescale."
              },
              "clip_max": {
                "label": "Clip Max",
                "description": "Optional input maximum for clipping before rescale."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "root_mean_square_error": {
            "name": "Root Mean Square Error",
            "params": {
              "input": {
                "label": "Input",
                "description": "Comparison raster path."
              },
              "base": {
                "label": "Base",
                "description": "Base raster path."
              }
            }
          },
          "round": {
            "name": "Round",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "shape_complexity_index_raster": {
            "name": "Shape Complexity Index Raster",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input patch-ID raster with positive integer-like IDs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "sieve": {
            "name": "Sieve",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical raster."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum patch size in cells to keep."
              },
              "zero_background": {
                "label": "Zero Background",
                "description": "Zero-out background (value 0) cells in output."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "sin": {
            "name": "Sin",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "sinh": {
            "name": "Sinh",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "sqrt": {
            "name": "Sqrt",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "square": {
            "name": "Square",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "tan": {
            "name": "Tan",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "tanh": {
            "name": "Tanh",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "tin_interpolation": {
            "name": "Tin Interpolation",
            "params": {
              "points": {
                "label": "Points",
                "description": "Input points vector layer."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Optional numeric attribute field; defaults to FID fallback."
              },
              "use_z": {
                "label": "Use Z",
                "description": "Use Z values from point geometry instead of attributes."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size when base_raster is not provided."
              },
              "base_raster": {
                "label": "Base Raster",
                "description": "Optional base raster controlling output geometry."
              },
              "max_triangle_edge_length": {
                "label": "Max Triangle Edge Length",
                "description": "Optional maximum allowed triangle edge length in map units."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "to_degrees": {
            "name": "To Degrees",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "to_radians": {
            "name": "To Radians",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "trend_surface": {
            "name": "Trend Surface",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "polynomial_order": {
                "label": "Polynomial Order",
                "description": "Polynomial order 1–10. Default: 1."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "trend_surface_vector_points": {
            "name": "Trend Surface Vector Points",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector points file path."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output raster cell size in map units."
              },
              "field_name": {
                "label": "Field Name",
                "description": "Attribute field for Z values. Default: 'FID'."
              },
              "polynomial_order": {
                "label": "Polynomial Order",
                "description": "Polynomial order 1–10. Default: 1."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "truncate": {
            "name": "Truncate",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, the result is stored in memory."
              }
            }
          },
          "turning_bands_simulation": {
            "name": "Turning Bands Simulation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Base raster path."
              },
              "range": {
                "label": "Range",
                "description": "Correlation range in map units. Default: 1.0."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Number of band directions. Default: 1000."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "two_sample_ks_test": {
            "name": "Two Sample Ks Test",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster path."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Optional sample size with replacement per raster."
              }
            }
          },
          "wilcoxon_signed_rank_test": {
            "name": "Wilcoxon Signed Rank Test",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster path."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster path."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Optional sample size with replacement."
              }
            }
          },
          "z_scores": {
            "name": "Z Scores",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "zonal_statistics": {
            "name": "Zonal Statistics",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input data raster path."
              },
              "features": {
                "label": "Features",
                "description": "Zone-definition raster path."
              },
              "stat_type": {
                "label": "Stat Type",
                "description": "Statistic: 'mean', 'median', 'min', 'max', 'range', 'standard deviation', 'diversity', 'total'. Default: 'mean'."
              },
              "zero_is_background": {
                "label": "Zero Is Background",
                "description": "Exclude zone-0 cells. Default: false."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "assess_route": {
            "name": "Assess Route",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path or typed raster object."
              },
              "routes": {
                "label": "Routes",
                "description": "Input polyline routes vector path."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Visibility search radius in grid cells (default 15, minimum 4)."
              },
              "segment_length": {
                "label": "Segment Length",
                "description": "Target route segment length in map units (default 100.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path."
              }
            }
          },
          "breakline_mapping": {
            "name": "Breakline Mapping",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Minimum log-curvedness threshold used for breakline extraction (default 0.8)."
              },
              "min_length": {
                "label": "Min Length",
                "description": "Minimum output line length in grid cells (default 3)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (default temporary .shp)."
              }
            }
          },
          "convergence_index": {
            "name": "Convergence Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "dem_void_filling": {
            "name": "Dem Void Filling",
            "params": {
              "fill": {
                "label": "Fill",
                "description": "Fill DEM raster path or typed raster object used to populate voids."
              },
              "input": {
                "label": "Input",
                "description": "Input DEM raster (with voids) path or typed raster object."
              },
              "edge_treatment": {
                "label": "Edge Treatment",
                "description": "Void-edge treatment: 'dem', 'fill', or 'average' (default 'dem')."
              },
              "mean_plane_dist": {
                "label": "Mean Plane Dist",
                "description": "Distance in cells from void edges beyond which offsets are set to the global mean offset (default 20)."
              },
              "weight_value": {
                "label": "Weight Value",
                "description": "Inverse-distance interpolation power for near-edge offset interpolation (default 2.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "deviation_from_mean_elevation": {
            "name": "Deviation From Mean Elevation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd filter width in cells (default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd filter height in cells (default filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "difference_from_mean_elevation": {
            "name": "Difference From Mean Elevation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd filter width in cells (default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd filter height in cells (default filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "directional_relief": {
            "name": "Directional Relief",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Direction azimuth in degrees clockwise from north."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Optional maximum ray distance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "elev_above_pit": {
            "name": "Elev Above Pit",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "elev_above_pit_dist": {
            "name": "Elev Above Pit Dist",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "elevation_percentile": {
            "name": "Elevation Percentile",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd filter width in cells (default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd filter height in cells (default filter_size_x). Alias: filtery."
              },
              "sig_digits": {
                "label": "Sig Digits",
                "description": "Number of significant decimal digits to preserve during binning (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "embankment_mapping": {
            "name": "Embankment Mapping",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path or typed raster object."
              },
              "roads_vector": {
                "label": "Roads Vector",
                "description": "Input roads vector path (polyline geometry)."
              },
              "embankment_max_width": {
                "label": "Embankment Max Width",
                "description": "Maximum embankment width in map units (default 60.0)."
              },
              "max_upwards_increment": {
                "label": "Max Upwards Increment",
                "description": "Maximum permitted local upward increment during growth (default 0.05)."
              },
              "min_road_width": {
                "label": "Min Road Width",
                "description": "Minimum mapped road width in map units (default 6.0)."
              },
              "remove_embankments": {
                "label": "Remove Embankments",
                "description": "If true, additionally outputs an embankment-removed DEM via local interpolation."
              },
              "search_dist": {
                "label": "Search Dist",
                "description": "Road seed reposition distance in map units (default 2.5)."
              },
              "spillout_slope": {
                "label": "Spillout Slope",
                "description": "Maximum spillout slope in degrees for uphill transitions (default 4.0)."
              },
              "typical_embankment_max_height": {
                "label": "Typical Embankment Max Height",
                "description": "Typical embankment max height in elevation units (default 2.0)."
              },
              "typical_embankment_width": {
                "label": "Typical Embankment Width",
                "description": "Typical embankment width in map units (default 30.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional embankment mask output path."
              },
              "output_dem": {
                "label": "Output Dem",
                "description": "Optional embankment-removed DEM output path when remove_embankments=true."
              }
            }
          },
          "exposure_towards_wind_flux": {
            "name": "Exposure Towards Wind Flux",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Dominant wind azimuth in degrees clockwise from north."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance for upwind horizon angle in map units."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor for projected DEMs."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "feature_preserving_smoothing": {
            "name": "Feature Preserving Smoothing",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Odd filter size in cells (default 11)."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Number of smoothing iterations (default 3)."
              },
              "max_elevation_diff": {
                "label": "Max Elevation Diff",
                "description": "Maximum allowed vertical change from original DEM (default inf)."
              },
              "normal_diff_threshold": {
                "label": "Normal Diff Threshold",
                "description": "Maximum normal angle difference in degrees (default 8.0)."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "feature_preserving_smoothing_multiscale": {
            "name": "Feature Preserving Smoothing Multiscale",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "smoothing_amount": {
                "label": "Smoothing Amount",
                "description": "Overall smoothing amount in [0,1] (default 0.65). Higher values increase the diffusion budget, especially at coarse scales."
              },
              "edge_preservation": {
                "label": "Edge Preservation",
                "description": "Edge preservation strength in [0,1] (default 0.75). Higher values suppress smoothing across major breaks-in-slope more strongly."
              },
              "scale_levels": {
                "label": "Scale Levels",
                "description": "Number of pyramid levels for coarse-to-fine smoothing (default 3)."
              },
              "fidelity": {
                "label": "Fidelity",
                "description": "Data-fidelity weight in screened Poisson reconstruction (default 0.45). Higher values keep the result closer to the source DEM."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "fetch_analysis": {
            "name": "Fetch Analysis",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Wind azimuth in degrees clockwise from north."
              },
              "hgt_inc": {
                "label": "Hgt Inc",
                "description": "Height increment threshold in m/m (default 0.05)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "fill_missing_data": {
            "name": "Fill Missing Data",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster path or typed raster object."
              },
              "exclude_edge_nodata": {
                "label": "Exclude Edge Nodata",
                "description": "Exclude edge-connected NoData regions from filling (default false). Alias: no_edges."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Search radius in grid cells (default 11)."
              },
              "weight": {
                "label": "Weight",
                "description": "Inverse-distance power exponent (default 2.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "find_ridges": {
            "name": "Find Ridges",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "line_thin": {
                "label": "Line Thin",
                "description": "Apply iterative line thinning (default true)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "hillshade": {
            "name": "Hillshade",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster"
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical exaggeration applied to elevations"
              },
              "altitude": {
                "label": "Altitude",
                "description": "Illumination altitude above the horizon in degrees"
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Illumination azimuth in degrees clockwise from north"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "hypsometrically_tinted_hillshade": {
            "name": "Hypsometrically Tinted Hillshade",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path."
              },
              "solar_altitude": {
                "label": "Solar Altitude",
                "description": "Solar altitude in degrees [0, 90]."
              },
              "hillshade_weight": {
                "label": "Hillshade Weight",
                "description": "Hillshade blending weight in [0, 1]."
              },
              "brightness": {
                "label": "Brightness",
                "description": "Brightness control in [0, 1]."
              },
              "atmospheric_effects": {
                "label": "Atmospheric Effects",
                "description": "Atmospheric haze amount in [0, 1]."
              },
              "palette": {
                "label": "Palette",
                "description": "Palette name (atlas, high_relief, arid, soft, muted, viridis, dem, grey, white, etc.)."
              },
              "reverse_palette": {
                "label": "Reverse Palette",
                "description": "Reverse palette order."
              },
              "full_360_mode": {
                "label": "Full 360 Mode",
                "description": "Use 8-direction illumination instead of 4-direction mode."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical exaggeration multiplier."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "local_hypsometric_analysis": {
            "name": "Local Hypsometric Analysis",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 4)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Base step size in cells (default 1). Alias: step."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of scales to evaluate (default 10)."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Scale-step nonlinearity in [1,4] (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for local HI minimum raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for scale-of-minimum-HI raster."
              }
            }
          },
          "low_points_on_headwater_divides": {
            "name": "Low Points On Headwater Divides",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input depressionless DEM raster path or typed raster object."
              },
              "streams": {
                "label": "Streams",
                "description": "Input stream raster path (positive values indicate channel cells)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (default temporary .shp)."
              }
            }
          },
          "max_downslope_elev_change": {
            "name": "Max Downslope Elev Change",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "max_upslope_elev_change": {
            "name": "Max Upslope Elev Change",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "min_downslope_elev_change": {
            "name": "Min Downslope Elev Change",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "multidirectional_hillshade": {
            "name": "Multidirectional Hillshade",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster"
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical exaggeration applied to elevations"
              },
              "altitude": {
                "label": "Altitude",
                "description": "Illumination altitude above the horizon in degrees"
              },
              "full_360_mode": {
                "label": "Full 360 Mode",
                "description": "Combine 8 light sources over the full 360 degrees instead of the default 4"
              },
              "output": {
                "label": "Output",
                "description": "Output raster path"
              }
            }
          },
          "num_downslope_neighbours": {
            "name": "Num Downslope Neighbours",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "num_upslope_neighbours": {
            "name": "Num Upslope Neighbours",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "profile": {
            "name": "Profile",
            "params": {
              "lines_vector": {
                "label": "Lines Vector",
                "description": "Input polyline vector path."
              },
              "surface": {
                "label": "Surface",
                "description": "Input surface raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML report path."
              }
            }
          },
          "slope_vs_aspect_plot": {
            "name": "Slope Vs Aspect Plot",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "aspect_bin_size": {
                "label": "Aspect Bin Size",
                "description": "Aspect bin size in degrees (default 2.0)."
              },
              "min_slope": {
                "label": "Min Slope",
                "description": "Ignore slopes below this threshold in degrees (default 0.1)."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical scaling factor for elevation values."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML report path."
              }
            }
          },
          "slope_vs_elev_plot": {
            "name": "Slope Vs Elev Plot",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input DEM paths as ';' or ',' separated string, or list."
              },
              "watershed": {
                "label": "Watershed",
                "description": "Optional watershed rasters matching each input DEM."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML report path."
              }
            }
          },
          "surface_area_ratio": {
            "name": "Surface Area Ratio",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "topographic_hachures": {
            "name": "Topographic Hachures",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path or typed raster object."
              },
              "base": {
                "label": "Base",
                "description": "Base contour elevation (default 0.0)."
              },
              "depth": {
                "label": "Depth",
                "description": "Recursive infill depth used in divergent areas (default 16)."
              },
              "discretization": {
                "label": "Discretization",
                "description": "Flowline step length in average-cell units (default 0.5)."
              },
              "distmax": {
                "label": "Distmax",
                "description": "Maximum spacing multiplier used to insert additional hachures (default 2.0)."
              },
              "distmin": {
                "label": "Distmin",
                "description": "Minimum spacing multiplier used to truncate nearby hachures (default 0.5)."
              },
              "interval": {
                "label": "Interval",
                "description": "Contour interval value (default 10.0)."
              },
              "separation": {
                "label": "Separation",
                "description": "Nominal contour seed separation in average-cell units (default 2.0)."
              },
              "slopemin": {
                "label": "Slopemin",
                "description": "Minimum slope angle in degrees for tracing continuation (default 0.5)."
              },
              "smooth": {
                "label": "Smooth",
                "description": "Contour smoothing filter size (odd integer preferred, default 9)."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Minimum contour bend angle in degrees retained during simplification (default 10.0)."
              },
              "turnmax": {
                "label": "Turnmax",
                "description": "Maximum permitted turn angle in degrees while tracing hachures (default 45.0)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "map_off_terrain_objects": {
            "name": "Map Off Terrain Objects",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DSM raster path or typed raster object."
              },
              "max_slope": {
                "label": "Max Slope",
                "description": "Maximum connecting slope in degrees [1, 90] (default inf, clamped to 90)."
              },
              "min_feature_size": {
                "label": "Min Feature Size",
                "description": "Minimum retained segment size in cells (default 0). Smaller segments are assigned to background class 1."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "remove_off_terrain_objects": {
            "name": "Remove Off Terrain Objects",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Maximum expected object width in cells; coerced to odd size >= 3 (default 11)."
              },
              "slope_threshold": {
                "label": "Slope Threshold",
                "description": "Minimum object edge slope in degrees (default 15.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "ridge_and_valley_vectors": {
            "name": "Ridge And Valley Vectors",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Neighbourhood size for elevation percentile."
              },
              "ep_threshold": {
                "label": "Ep Threshold",
                "description": "Elevation percentile threshold [5, 50]."
              },
              "slope_threshold": {
                "label": "Slope Threshold",
                "description": "Minimum slope threshold in degrees."
              },
              "min_length": {
                "label": "Min Length",
                "description": "Minimum centreline length in cells."
              },
              "output_ridges": {
                "label": "Output Ridges",
                "description": "Output ridge centrelines path."
              },
              "output_valleys": {
                "label": "Output Valleys",
                "description": "Output valley centrelines path."
              }
            }
          },
          "smooth_vegetation_residual": {
            "name": "Smooth Vegetation Residual",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum DEV half-window radius in cells (default 30)."
              },
              "dev_threshold": {
                "label": "Dev Threshold",
                "description": "Minimum DEV magnitude used to flag roughness cells (default 1.0)."
              },
              "scale_threshold": {
                "label": "Scale Threshold",
                "description": "Maximum scale considered roughness (default 5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "average_horizon_distance": {
            "name": "Average Horizon Distance",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "az_fraction": {
                "label": "Az Fraction",
                "description": "Azimuth step in degrees [1, 45]."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance in map units."
              },
              "observer_hgt_offset": {
                "label": "Observer Hgt Offset",
                "description": "Observer height offset above terrain."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "horizon_angle": {
            "name": "Horizon Angle",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Azimuth in degrees [0, 360)."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "horizon_area": {
            "name": "Horizon Area",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "az_fraction": {
                "label": "Az Fraction",
                "description": "Azimuth step in degrees [1, 45]."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance in map units."
              },
              "observer_hgt_offset": {
                "label": "Observer Hgt Offset",
                "description": "Observer height offset above terrain."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "openness": {
            "name": "Openness",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "dist": {
                "label": "Dist",
                "description": "Search distance in cells (default 20)."
              },
              "neg_output": {
                "label": "Neg Output",
                "description": "Optional output path for negative openness."
              },
              "pos_output": {
                "label": "Pos Output",
                "description": "Optional output path for positive openness."
              }
            }
          },
          "shadow_animation": {
            "name": "Shadow Animation",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "date": {
                "label": "Date",
                "description": "Date in DD/MM/YYYY format."
              },
              "delay": {
                "label": "Delay",
                "description": "Per-frame GIF delay in milliseconds."
              },
              "image_height": {
                "label": "Image Height",
                "description": "Displayed image height in pixels."
              },
              "label": {
                "label": "Label",
                "description": "Optional label displayed in the viewer."
              },
              "location": {
                "label": "Location",
                "description": "Location string LAT/LON/UTC_OFFSET, e.g. 43.5448/-80.2482/-4."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum horizon search distance in map units."
              },
              "palette": {
                "label": "Palette",
                "description": "Hypsometric palette name (e.g. soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "time_interval": {
                "label": "Time Interval",
                "description": "Frame interval in minutes [1, 60]."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML path."
              }
            }
          },
          "shadow_image": {
            "name": "Shadow Image",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "date": {
                "label": "Date",
                "description": "Date in DD/MM/YYYY format."
              },
              "location": {
                "label": "Location",
                "description": "Location string LAT/LON/UTC_OFFSET, e.g. 43.5448/-80.2482/-4."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum horizon search distance in map units."
              },
              "palette": {
                "label": "Palette",
                "description": "Hypsometric palette name (e.g. soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "time": {
                "label": "Time",
                "description": "Local time in HH:MM or HH:MMAM/HH:MMPM format."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "sky_view_factor": {
            "name": "Sky View Factor",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "az_fraction": {
                "label": "Az Fraction",
                "description": "Azimuth step in degrees [1, 45]."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance in map units."
              },
              "observer_hgt_offset": {
                "label": "Observer Hgt Offset",
                "description": "Observer height offset above terrain."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "skyline_analysis": {
            "name": "Skyline Analysis",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "points": {
                "label": "Points",
                "description": "Input point vector path."
              },
              "az_fraction": {
                "label": "Az Fraction",
                "description": "Azimuth step in degrees [0.01, 45]."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum search distance in map units."
              },
              "observer_hgt_offset": {
                "label": "Observer Hgt Offset",
                "description": "Observer height offset above terrain."
              },
              "output_as_polygons": {
                "label": "Output As Polygons",
                "description": "Write polygon horizons instead of polylines."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional HTML report path."
              }
            }
          },
          "time_in_daylight": {
            "name": "Time In Daylight",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM/DSM raster path."
              },
              "az_fraction": {
                "label": "Az Fraction",
                "description": "Azimuth bin size in degrees (0, 360)."
              },
              "end_day": {
                "label": "End Day",
                "description": "End day-of-year (1..366)."
              },
              "end_time": {
                "label": "End Time",
                "description": "End time HH:MM:SS or 'sunset'."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Optional latitude override in degrees; otherwise inferred from DEM CRS."
              },
              "longitude": {
                "label": "Longitude",
                "description": "Optional longitude override in degrees; otherwise inferred from DEM CRS."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum horizon search distance in map units."
              },
              "start_day": {
                "label": "Start Day",
                "description": "Start day-of-year (1..366)."
              },
              "start_time": {
                "label": "Start Time",
                "description": "Start time HH:MM:SS or 'sunrise'."
              },
              "utc_offset": {
                "label": "Utc Offset",
                "description": "Optional UTC offset string like UTC+00:00; if omitted, estimated from center longitude."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path."
              }
            }
          },
          "viewshed": {
            "name": "Viewshed",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "stations": {
                "label": "Stations",
                "description": "Input point vector file of viewing stations."
              },
              "height": {
                "label": "Height",
                "description": "Viewing station height above ground in DEM z units (default 2.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "visibility_index": {
            "name": "Visibility Index",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum visibility search distance in map units."
              },
              "resolution_factor": {
                "label": "Resolution Factor",
                "description": "Sampling resolution factor [1, 25]."
              },
              "station_height": {
                "label": "Station Height",
                "description": "Observer height above ground."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "accumulation_curvature": {
            "name": "Accumulation Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "aspect": {
            "name": "Aspect",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "casorati_curvature": {
            "name": "Casorati Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "curvedness": {
            "name": "Curvedness",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "difference_curvature": {
            "name": "Difference Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "gaussian_curvature": {
            "name": "Gaussian Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor when vertical and horizontal units differ (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values for readability (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "generating_function": {
            "name": "Generating Function",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "horizontal_excess_curvature": {
            "name": "Horizontal Excess Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "maximal_curvature": {
            "name": "Maximal Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "mean_curvature": {
            "name": "Mean Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor when vertical and horizontal units differ (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values for readability (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "minimal_curvature": {
            "name": "Minimal Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "plan_curvature": {
            "name": "Plan Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor when vertical and horizontal units differ (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values for readability (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "principal_curvature_direction": {
            "name": "Principal Curvature Direction",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "profile_curvature": {
            "name": "Profile Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor when vertical and horizontal units differ (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values for readability (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "relative_aspect": {
            "name": "Relative Aspect",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Reference azimuth in degrees clockwise from north."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "ring_curvature": {
            "name": "Ring Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "rotor": {
            "name": "Rotor",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "shape_index": {
            "name": "Shape Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "slope": {
            "name": "Slope",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "units": {
                "label": "Units",
                "description": "Output units: degrees, radians, percent."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "tangential_curvature": {
            "name": "Tangential Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor when vertical and horizontal units differ (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values for readability (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "total_curvature": {
            "name": "Total Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor when vertical and horizontal units differ (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values for readability (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "unsphericity": {
            "name": "Unsphericity",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "vertical_excess_curvature": {
            "name": "Vertical Excess Curvature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional z conversion factor (default 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Optional log-transform of output values (default false). Alias: log."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "average_normal_vector_angular_deviation": {
            "name": "Average Normal Vector Angular Deviation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Odd neighbourhood size in cells (default 11). Alias: filter."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "circular_variance_of_aspect": {
            "name": "Circular Variance Of Aspect",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter": {
                "label": "Filter",
                "description": "Odd neighbourhood size in cells (default 11)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "edge_density": {
            "name": "Edge Density",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Odd neighbourhood size in cells (default 11). Alias: filter."
              },
              "norm_diff": {
                "label": "Norm Diff",
                "description": "Normal-vector angular threshold in degrees (default 5)."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "ruggedness_index": {
            "name": "Ruggedness Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "spherical_std_dev_of_normals": {
            "name": "Spherical Std Dev Of Normals",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Odd neighbourhood size in cells (default 11). Alias: filter."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "standard_deviation_of_slope": {
            "name": "Standard Deviation Of Slope",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size": {
                "label": "Filter Size",
                "description": "Odd filter size in cells (default 11)."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd filter width in cells (default filter_size). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd filter height in cells (default filter_size). Alias: filtery."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor when vertical and horizontal units differ (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result stays in memory."
              }
            }
          },
          "elev_relative_to_min_max": {
            "name": "Elev Relative To Min Max",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, result is stored in memory."
              }
            }
          },
          "geomorphons": {
            "name": "Geomorphons",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "analyze_residuals": {
                "label": "Analyze Residuals",
                "description": "If true, detrends the DEM using a fitted linear plane before classification."
              },
              "flatness_distance": {
                "label": "Flatness Distance",
                "description": "Distance in cells after which the flatness threshold tapers with horizon distance (default 0)."
              },
              "flatness_threshold": {
                "label": "Flatness Threshold",
                "description": "Flatness threshold in degrees (default 1.0), applied to the zenith-nadir angle difference."
              },
              "output_forms": {
                "label": "Output Forms",
                "description": "If true, outputs 10 common landform classes; otherwise outputs the raw ternary geomorphon code ordered counter-clockwise from east."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Maximum look-up distance in cells per direction (default 50); the endpoint cell is included."
              },
              "skip_distance": {
                "label": "Skip Distance",
                "description": "Distance in cells to skip before evaluating line-of-sight (default 0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "hypsometric_analysis": {
            "name": "Hypsometric Analysis",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Input DEM paths as ';' or ',' separated string, or list."
              },
              "watershed": {
                "label": "Watershed",
                "description": "Optional watershed rasters matching each input DEM."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML report path."
              }
            }
          },
          "multiscale_topographic_position_class": {
            "name": "Multiscale Topographic Position Class",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "local_min_scale": {
                "label": "Local Min Scale",
                "description": "Minimum half-window radius in cells for the local scale range (default 5)."
              },
              "local_max_scale": {
                "label": "Local Max Scale",
                "description": "Maximum half-window radius in cells for the local scale range (default 80)."
              },
              "local_step_size": {
                "label": "Local Step Size",
                "description": "Scale increment in cells for the local scale range (default 1). Alias: local_step."
              },
              "broad_min_scale": {
                "label": "Broad Min Scale",
                "description": "Minimum half-window radius in cells for the broad scale range (default 500)."
              },
              "broad_max_scale": {
                "label": "Broad Max Scale",
                "description": "Maximum half-window radius in cells for the broad scale range (default 2000)."
              },
              "broad_step_size": {
                "label": "Broad Step Size",
                "description": "Scale increment in cells for the broad scale range (default 20). Alias: broad_step."
              },
              "local_threshold": {
                "label": "Local Threshold",
                "description": "DEV threshold used to classify the local scale mosaic into hollow, mid-position, and knoll states (default 0.5)."
              },
              "broad_threshold": {
                "label": "Broad Threshold",
                "description": "DEV threshold used to classify the broad scale mosaic into lowland, intermediate, and upland states (default 0.5)."
              },
              "min_patch_size": {
                "label": "Min Patch Size",
                "description": "Optional minimum patch size in cells for post-classification patch filtering (default 0, disabled)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the nine-class categorical raster."
              },
              "output_confidence": {
                "label": "Output Confidence",
                "description": "Optional output path for a confidence raster in the range [0, 1]."
              }
            }
          },
          "pennock_landform_classification": {
            "name": "Pennock Landform Classification",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "plan_curv_threshold": {
                "label": "Plan Curv Threshold",
                "description": "Plan curvature threshold in degrees (default 0.0)."
              },
              "prof_curv_threshold": {
                "label": "Prof Curv Threshold",
                "description": "Profile curvature threshold in degrees (default 0.1)."
              },
              "slope_threshold": {
                "label": "Slope Threshold",
                "description": "Slope threshold in degrees (default 3.0)."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Optional vertical scaling factor (if < 0 and CRS is geographic, estimated from mid-latitude)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "percent_elev_range": {
            "name": "Percent Elev Range",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd filter width in cells (default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd filter height in cells (default filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "relative_topographic_position": {
            "name": "Relative Topographic Position",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "filter_size_x": {
                "label": "Filter Size X",
                "description": "Odd filter width in cells (default 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Filter Size Y",
                "description": "Odd filter height in cells (default filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path."
              }
            }
          },
          "max_anisotropy_dev": {
            "name": "Max Anisotropy Dev",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 3)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 2). Alias: step."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for anisotropy magnitude raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for raster storing scale of max response."
              }
            }
          },
          "max_anisotropy_dev_signature": {
            "name": "Max Anisotropy Dev Signature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path."
              },
              "points": {
                "label": "Points",
                "description": "Input vector point or multipoint file path."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 1). Alias: step."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the HTML signature report."
              }
            }
          },
          "max_difference_from_mean": {
            "name": "Max Difference From Mean",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 1). Alias: step."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for max-difference magnitude raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for raster storing scale of max response."
              }
            }
          },
          "max_elevation_deviation": {
            "name": "Max Elevation Deviation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 1). Alias: step."
              },
              "min_vertical": {
                "label": "Min Vertical",
                "description": "Minimum local standard deviation threshold; weaker-relief responses are suppressed (default 0.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for DEVmax magnitude raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for raster storing scale of max response."
              }
            }
          },
          "max_elev_dev_signature": {
            "name": "Max Elev Dev Signature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path."
              },
              "points": {
                "label": "Points",
                "description": "Input vector point or multipoint file path."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 10). Alias: step."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the HTML signature report."
              }
            }
          },
          "multiscale_curvatures": {
            "name": "Multiscale Curvatures",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object. Alias: dem."
              },
              "curv_type": {
                "label": "Curv Type",
                "description": "Curvature type."
              },
              "out_mag": {
                "label": "Out Mag",
                "description": "Optional output magnitude path. Alias: output."
              },
              "out_scale": {
                "label": "Out Scale",
                "description": "Optional output scale path when num_steps > 1."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum search-neighbourhood radius in grid cells."
              },
              "step": {
                "label": "Step",
                "description": "Step size."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of sampled scale steps."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Step nonlinearity factor."
              },
              "log_transform": {
                "label": "Log Transform",
                "description": "Apply signed log transform. Alias: log."
              },
              "standardize": {
                "label": "Standardize",
                "description": "Standardize each scale to z-scores."
              }
            }
          },
          "multiscale_elevated_index": {
            "name": "Multiscale Elevated Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum search radius in grid cells (default 2)."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of scales to evaluate (default 100)."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Scale-step nonlinearity in [1,4] (default 1.1)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Base step size in cells (default 1). Alias: step."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for index raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for key-scale raster."
              }
            }
          },
          "multiscale_elevation_percentile": {
            "name": "Multiscale Elevation Percentile",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 4)."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of scales to evaluate (default 10)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 1). Alias: step."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Nonlinear scaling exponent; >1.0 clusters scales toward finer resolutions (default 1.0)."
              },
              "sig_digits": {
                "label": "Sig Digits",
                "description": "Significant decimal digits used during percentile binning (default 3)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for percentile magnitude raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for raster storing scale of most extreme percentile response."
              }
            }
          },
          "multiscale_low_lying_index": {
            "name": "Multiscale Low Lying Index",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum search radius in grid cells (default 2)."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of scales to evaluate (default 100)."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Scale-step nonlinearity in [1,4] (default 1.1)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Base step size in cells (default 1). Alias: step."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for index raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for key-scale raster."
              }
            }
          },
          "multiscale_roughness": {
            "name": "Multiscale Roughness",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 1). Alias: step."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor when vertical and horizontal units differ (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for roughness magnitude raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for raster storing scale of max response."
              }
            }
          },
          "multiscale_roughness_signature": {
            "name": "Multiscale Roughness Signature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path."
              },
              "points": {
                "label": "Points",
                "description": "Input vector point or multipoint file path."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "max_scale": {
                "label": "Max Scale",
                "description": "Maximum half-window radius in cells (default 100)."
              },
              "step_size": {
                "label": "Step Size",
                "description": "Scale increment in cells (default 1). Alias: step."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor when vertical and horizontal units differ (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the HTML signature report."
              }
            }
          },
          "multiscale_std_dev_normals": {
            "name": "Multiscale Std Dev Normals",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 4)."
              },
              "step": {
                "label": "Step",
                "description": "Base step size in cells used by nonlinear scale schedule (default 1)."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of sampled scales (default 10)."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Nonlinearity exponent for scale schedule (default 1.0)."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor when vertical and horizontal units differ (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for spherical standard-deviation magnitude raster."
              },
              "output_scale": {
                "label": "Output Scale",
                "description": "Optional output path for raster storing scale of max response."
              }
            }
          },
          "multiscale_std_dev_normals_signature": {
            "name": "Multiscale Std Dev Normals Signature",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path."
              },
              "points": {
                "label": "Points",
                "description": "Input vector point or multipoint file path."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 4)."
              },
              "step": {
                "label": "Step",
                "description": "Base step size in cells used by nonlinear scale schedule (default 1)."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of sampled scales (default 10)."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Nonlinearity exponent for scale schedule (default 1.0)."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Z conversion factor when vertical and horizontal units differ (default 1.0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the HTML signature report."
              }
            }
          },
          "multiscale_topographic_position_image": {
            "name": "Multiscale Topographic Position Image",
            "params": {
              "local": {
                "label": "Local",
                "description": "Input local-scale DEVmax raster path."
              },
              "meso": {
                "label": "Meso",
                "description": "Input meso-scale DEVmax raster path."
              },
              "broad": {
                "label": "Broad",
                "description": "Input broad-scale DEVmax raster path."
              },
              "hillshade": {
                "label": "Hillshade",
                "description": "Optional hillshade raster path used for illumination modulation."
              },
              "lightness": {
                "label": "Lightness",
                "description": "Image lightness scaling factor (default 1.2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for packed RGB raster."
              }
            }
          },
          "topographic_position_animation": {
            "name": "Topographic Position Animation",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster path or typed raster object."
              },
              "delay": {
                "label": "Delay",
                "description": "Per-frame GIF delay in milliseconds."
              },
              "image_height": {
                "label": "Image Height",
                "description": "Displayed image height in pixels."
              },
              "label": {
                "label": "Label",
                "description": "Optional label displayed in the viewer."
              },
              "min_scale": {
                "label": "Min Scale",
                "description": "Minimum half-window radius in cells (default 1)."
              },
              "num_steps": {
                "label": "Num Steps",
                "description": "Number of animation steps (default 10)."
              },
              "palette": {
                "label": "Palette",
                "description": "Palette name used to colour DEV values."
              },
              "step_nonlinearity": {
                "label": "Step Nonlinearity",
                "description": "Nonlinear scale exponent in [1, 4] controlling coarse-to-fine spacing."
              },
              "use_dev_max": {
                "label": "Use Dev Max",
                "description": "If true, frames accumulate the strongest absolute DEV response encountered so far."
              },
              "output": {
                "label": "Output",
                "description": "Output HTML path."
              }
            }
          },
          "topo_render": {
            "name": "Topo Render",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster path."
              },
              "palette": {
                "label": "Palette",
                "description": "Palette name (soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "reverse_palette": {
                "label": "Reverse Palette",
                "description": "Reverse palette order."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Light-source azimuth in degrees [0, 360]."
              },
              "altitude": {
                "label": "Altitude",
                "description": "Light-source altitude in degrees [0, 90]."
              },
              "clipping_polygon": {
                "label": "Clipping Polygon",
                "description": "Optional polygon vector path; only DEM cells inside polygon(s) are rendered."
              },
              "background_hgt_offset": {
                "label": "Background Hgt Offset",
                "description": "Vertical offset from minimum DEM elevation to background plane."
              },
              "background_clr": {
                "label": "Background Clr",
                "description": "Background RGBA colour as array [r,g,b,a]."
              },
              "attenuation_parameter": {
                "label": "Attenuation Parameter",
                "description": "Distance attenuation exponent (>= 0)."
              },
              "ambient_light": {
                "label": "Ambient Light",
                "description": "Ambient light amount in [0, 1]."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Vertical exaggeration multiplier."
              },
              "max_dist": {
                "label": "Max Dist",
                "description": "Maximum shadow search distance in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path."
              }
            }
          },
          "add_surface_information": {
            "name": "Add Surface Information",
            "description": "Append per-feature surface statistics from an elevation raster — Z, 3D surface length, 3D surface area, min/max/mean Z, and min/max/avg slope — as attribute fields without altering the input geometry, like ArcGIS Add Surface Information.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points, lines, or polygons) sharing the surface's CRS."
              },
              "surface": {
                "label": "Surface",
                "description": "Elevation/surface raster to sample."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "properties": {
                "label": "Properties",
                "description": "Comma list of surface property groups to append: Z, SURFACE_LENGTH, SURFACE_AREA, MIN_MAX_MEAN_Z, MIN_MAX_AVG_SLOPE. Default: all applicable to the layer's geometry."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Densification interval in CRS units for line/perimeter sampling; long segments are split so they follow the surface. Default: the raster cell size."
              },
              "method": {
                "label": "Method",
                "description": "Vertex surface sampling: 'bilinear' (default) or 'nearest'."
              },
              "band": {
                "label": "Band",
                "description": "1-based surface band to sample (default 1)."
              }
            }
          },
          "add_z_information": {
            "name": "Add Z Information",
            "description": "Appends Z-derived geometry statistics to 3D features — spot/min/max/mean Z, 3D length, mesh surface area and volume, slope statistics and vertex counts (ArcGIS Add Z Information). vector_summary_statistics and attribute_histogram summarise attributes rather than geometry, and polygon_volume / surface_volume measure a raster against a reference plane, so nothing currently annotates a 3D vector feature from its own Z.",
            "params": {
              "input": {
                "label": "Input",
                "description": "3D point, line, polygon or multipatch features. Note that a Z of zero is indistinguishable from an absent Z, so 'features_with_z' is a hint rather than a guarantee."
              },
              "output": {
                "label": "Output",
                "description": "Input features with the requested fields appended. If omitted, stored in memory."
              },
              "properties": {
                "label": "Properties",
                "description": "Comma-separated subset of spot_z, min_z, max_z, mean_z, length_3d, surface_area, volume, min_slope, max_slope, mean_slope, point_count, vertex_count. Default: all of them (fields not applicable to a geometry are left null)."
              },
              "noise_filtering": {
                "label": "Noise Filtering",
                "description": "Percentage (0-50) trimmed from each end of the Z distribution before min_z / max_z, so a single spike vertex does not define the reported extremes. Default 0."
              }
            }
          },
          "adjust_3d_z": {
            "name": "Adjust 3D Z",
            "description": "Apply a Z-unit conversion, vertical offset, and/or multiplicative factor to the Z ordinates of 3D features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (features should carry Z ordinates)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path. If omitted, the result is stored in memory."
              },
              "factor": {
                "label": "Factor",
                "description": "Multiplicative factor applied to Z (default 1.0). Useful for vertical exaggeration or a datum scale."
              },
              "offset": {
                "label": "Offset",
                "description": "Additive vertical offset applied after the factor, in target units (default 0.0)."
              },
              "from_unit": {
                "label": "From Unit",
                "description": "Source Z unit preset (meters, feet, us_feet, centimeters, millimeters, kilometers, miles, yards, inches). Requires to_unit."
              },
              "to_unit": {
                "label": "To Unit",
                "description": "Target Z unit preset. Requires from_unit. Z is scaled by (meters-per-from_unit / meters-per-to_unit)."
              }
            }
          },
          "adjust_stream_to_raster": {
            "name": "Adjust Stream To Raster",
            "description": "Move stream polyline vertices onto the flow path implied by a DEM so vector hydrography and the elevation surface agree, by snapping nodes to high-accumulation cells and tracing the D8 pointer chain between them. The inverse of stream burning. Like ArcGIS Adjust Stream To Raster.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Stream polyline features to adjust."
              },
              "dem": {
                "label": "Dem",
                "description": "Surface raster defining the true flow path."
              },
              "output": {
                "label": "Output",
                "description": "Output adjusted stream path. If omitted, stored in memory."
              },
              "snap_distance": {
                "label": "Snap Distance",
                "description": "Search radius in map units for snapping nodes to a high-accumulation cell (default: 5 cells)."
              },
              "channel_threshold": {
                "label": "Channel Threshold",
                "description": "Flow-accumulation value (in cells) at or above which a cell counts as channelised for snapping (default: 1% of the DEM's maximum accumulation)."
              },
              "remove_disconnected": {
                "label": "Remove Disconnected",
                "description": "Drop lines that cannot be routed at all (default true). When false they are passed through unchanged and flagged."
              },
              "output_stream_raster": {
                "label": "Output Stream Raster",
                "description": "Optional raster marking the adjusted stream cells."
              },
              "output_flow_direction": {
                "label": "Output Flow Direction",
                "description": "Optional D8 pointer raster derived from the DEM."
              },
              "output_split_points": {
                "label": "Output Split Points",
                "description": "Optional points where the pointer trace failed and a least-cost fallback was used."
              }
            }
          },
          "aggregate_multidimensional_raster": {
            "name": "Aggregate Multidimensional Raster",
            "description": "Bins the slices of a raster cube along its dimension and reduces each bin to one output band — daily scenes into monthly composites, a decade into annual means (ArcGIS Aggregate Multidimensional Raster). Round 17's cell_statistics reduces a stack only to a single layer and has no notion of a dimension, while round 16's multidimensional_anomaly performs the opposite operation and preserves the slice count.",
            "params": {
              "input": {
                "label": "Input",
                "description": "One multiband raster (each band is a slice) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband raster, one band per bin. If omitted, stored in memory."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Name of the dimension, used only in the report (default 'slice')."
              },
              "dimension_values": {
                "label": "Dimension Values",
                "description": "Comma-separated coordinate of each slice, strictly increasing. Defaults to the 1-based slice index."
              },
              "aggregation_definition": {
                "label": "Aggregation Definition",
                "description": "'all' (default), 'interval_value', 'interval_count', or 'interval_ranges'."
              },
              "interval_value": {
                "label": "Interval Value",
                "description": "Bin width in dimension units, for 'interval_value'."
              },
              "interval_count": {
                "label": "Interval Count",
                "description": "Number of equal-width bins, for 'interval_count'."
              },
              "interval_ranges": {
                "label": "Interval Ranges",
                "description": "Explicit bins as 'start:end,start:end', for 'interval_ranges'."
              },
              "aggregation_method": {
                "label": "Aggregation Method",
                "description": "'mean' (default), 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'range', 'std', 'sum', or 'variety'."
              },
              "percentile_value": {
                "label": "Percentile Value",
                "description": "Percentile in [0, 100] for method 'percentile' (default 50)."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "Skip no-data slices per cell (default true). When false, one no-data slice makes the whole bin no-data at that cell."
              }
            }
          },
          "aggregate_points": {
            "name": "Aggregate Points",
            "description": "Group points that fall within an aggregation distance of each other into cluster polygons (convex hull or buffered union), each carrying a point count and optional per-cluster field sums, like ArcGIS Aggregate Points.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (Point or MultiPoint)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path (driver from extension). If omitted, stored in memory."
              },
              "aggregation_distance": {
                "label": "Aggregation Distance",
                "description": "Maximum distance between points for them to join the same cluster (map units)."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum points a cluster needs to be output (default 2; set 1 to keep singletons)."
              },
              "method": {
                "label": "Method",
                "description": "'convex_hull' (default) or 'buffer' (buffered union eroded back)."
              },
              "sum_fields": {
                "label": "Sum Fields",
                "description": "Comma-separated numeric fields to sum per cluster (output columns 'sum_<field>')."
              }
            }
          },
          "aggregate_polygons": {
            "name": "Aggregate Polygons",
            "description": "Combine polygons within an aggregation distance into larger polygons (morphological closing), with minimum-area and minimum-hole-size filters and an optional barrier layer aggregation may not cross.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "aggregation_distance": {
                "label": "Aggregation Distance",
                "description": "Polygons within this distance (CRS units) of each other are aggregated. Sets the morphological-closing radius to half this value."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Drop aggregated polygons whose area (CRS units squared) is below this value. Default: keep all."
              },
              "min_hole_size": {
                "label": "Min Hole Size",
                "description": "Fill interior holes whose area (CRS units squared) is below this value. Default: keep all holes."
              },
              "barrier": {
                "label": "Barrier",
                "description": "Optional barrier vector layer (lines or polygons) that aggregation may not cross; bridges spanning a barrier are severed. Existing input polygons are never split."
              }
            }
          },
          "align_features": {
            "name": "Align Features",
            "description": "Conform source line/polygon edges to a nearby trusted target layer within a search distance, pulling whole edge runs (not just endpoints) with a smooth taper and coincident shared boundaries, like ArcGIS Align Features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Source vector layer to align (lines or polygons)."
              },
              "target": {
                "label": "Target",
                "description": "Trusted target layer (lines, or polygon boundaries) that source vertices are pulled toward."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from extension). If omitted, stored in memory."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Max distance (CRS units) a source vertex may be pulled toward the target. Required."
              },
              "match_field": {
                "label": "Match Field",
                "description": "Optional source attribute field; only target edges whose target_match_field value matches are candidates for that feature's vertices."
              },
              "target_match_field": {
                "label": "Target Match Field",
                "description": "Target attribute field compared against match_field. Defaults to match_field's name if omitted; requires match_field."
              }
            }
          },
          "analyze_changes_ccdc": {
            "name": "Analyze Changes Using CCDC",
            "description": "CCDC continuous change detection on a dense image time series (like ArcGIS Analyze Changes Using CCDC): per-pixel harmonic (seasonal) OLS regression, then a sliding residual test (k×RMSE, min consecutive anomalies) that declares breaks and refits segments. Emits break-count, first-break-date, and initial-segment RMSE/slope/amplitude rasters — the seasonal, multi-break change history the yearly landtrendr and two-date change_vector_analysis can't produce.",
            "params": {
              "input": {
                "label": "Input",
                "description": "A single multiband raster (each band is a time slice) OR a comma-separated list of co-registered single-band raster paths, in time order."
              },
              "output": {
                "label": "Output",
                "description": "Output break-count raster (breaks detected per pixel). If omitted, stored in memory."
              },
              "dates": {
                "label": "Dates",
                "description": "Comma-separated numeric dates (decimal years or day numbers) matching the slices. Default 0,1,2,..."
              },
              "period": {
                "label": "Period",
                "description": "Length of one seasonal cycle in the units of 'dates' (default 1.0 for decimal years; use 365 for day numbers)."
              },
              "harmonic_order": {
                "label": "Harmonic Order",
                "description": "Number of sine/cosine harmonic pairs at the annual frequency (default 1 = annual only; 2 adds the semi-annual term)."
              },
              "change_threshold": {
                "label": "Change Threshold",
                "description": "Anomaly threshold as a multiple k of the segment RMSE (default 3.0). A residual > k×RMSE flags an observation."
              },
              "min_consecutive": {
                "label": "Min Consecutive",
                "description": "Number of consecutive flagged observations required to declare a break (default 3)."
              },
              "min_observations": {
                "label": "Min Observations",
                "description": "Minimum valid observations used to initialize a segment's harmonic model (default 12). Pixels with fewer valid observations become no-data."
              },
              "band": {
                "label": "Band",
                "description": "For a comma-separated list input: 1-based band to read from each raster (default 1). Ignored for a single multiband input."
              },
              "break_date_output": {
                "label": "Break Date Output",
                "description": "Optional raster of the date of the first detected break per pixel (no-data where no break)."
              },
              "rmse_output": {
                "label": "Rmse Output",
                "description": "Optional raster of the initial-segment harmonic model RMSE."
              },
              "slope_output": {
                "label": "Slope Output",
                "description": "Optional raster of the initial-segment linear trend (slope) coefficient."
              },
              "amplitude_output": {
                "label": "Amplitude Output",
                "description": "Optional raster of the initial-segment first-harmonic amplitude sqrt(a²+b²)."
              }
            }
          },
          "apply_radiometric_calibration": {
            "name": "Apply Radiometric Calibration",
            "description": "Converts raw SAR digital numbers into calibrated backscatter — beta nought, sigma nought or gamma nought — so acquisitions become physically comparable and published thresholds apply (ArcGIS Apply Radiometric Calibration). Nothing in either registry does this: rescale_value_range is a linear stretch with no radiometric meaning, and multilook, sar_coherence, the Lee speckle filters and compute_sar_indices all consume whatever values they are handed.",
            "params": {
              "input": {
                "label": "Input",
                "description": "SAR raster in digital numbers, amplitude, intensity or dB (see 'input_units')."
              },
              "output": {
                "label": "Output",
                "description": "Output calibrated backscatter raster. If omitted, stored in memory."
              },
              "calibration_type": {
                "label": "Calibration Type",
                "description": "'sigma0' (default), 'beta0', or 'gamma0'. sigma0 and gamma0 require 'incidence_angle'."
              },
              "calibration_constant": {
                "label": "Calibration Constant",
                "description": "Sensor calibration constant A (default 1.0). Ignored when 'calibration_lut' is given."
              },
              "calibration_lut": {
                "label": "Calibration Lut",
                "description": "Optional co-registered raster of per-cell calibration constants A, overriding 'calibration_constant'."
              },
              "incidence_angle": {
                "label": "Incidence Angle",
                "description": "Local incidence angle in degrees: a constant, or a co-registered raster path. Required for 'sigma0' and 'gamma0'."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'dn' (default), 'amplitude', 'intensity', or 'db'. dn and amplitude are squared to power; db is delinearised first."
              },
              "output_units": {
                "label": "Output Units",
                "description": "'linear' (default) or 'db'."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to calibrate (default 1)."
              }
            }
          },
          "apportion_polygon": {
            "name": "Apportion Polygon",
            "description": "Transfer numeric attributes from a source polygon layer onto a target polygon layer, apportioned by area of overlap (dasymetric reaggregation between zone systems), like ArcGIS Apportion Polygon.",
            "params": {
              "target": {
                "label": "Target",
                "description": "Target polygon layer (receives the apportioned values; its features and attributes are preserved)."
              },
              "source": {
                "label": "Source",
                "description": "Source polygon layer carrying the values to distribute."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated numeric field name(s) on the source to apportion."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (a copy of the target with apportioned columns). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'area' (default; split by overlap area) or 'weight' (split by overlap area times the target 'weight_field')."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Target numeric field used as an extra weight when method=weight."
              },
              "suffix": {
                "label": "Suffix",
                "description": "Suffix for the apportioned output columns. Default '_app'."
              }
            }
          },
          "areal_interpolation": {
            "name": "Areal Interpolation",
            "description": "Predicts aggregated values for target polygons from source polygons with a different geography, by fitting a smooth underlying surface and re-integrating it rather than weighting by area (ArcGIS Areal Interpolation Layer To Polygons). apportion_polygon assumes the quantity is uniform inside each source polygon — the classic modifiable-areal-unit-problem failure — and gives no standard errors; the bundled kriging suite is entirely point-support and cannot accept polygon observations.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Source polygons carrying the measured field."
              },
              "target": {
                "label": "Target",
                "description": "Target polygons to predict values for."
              },
              "field": {
                "label": "Field",
                "description": "Numeric value field on the source polygons."
              },
              "output": {
                "label": "Output",
                "description": "Target polygons with PREDICTED, PRED_STD_ERR and the diagnostics appended. If omitted, stored in memory."
              },
              "field_type": {
                "label": "Field Type",
                "description": "'count' (default): an extensive total, rescaled to preserve the source sum. 'average': an intensive mean, predicted directly with no rescaling."
              },
              "discretization": {
                "label": "Discretization",
                "description": "Approximate number of interior points used to represent each polygon's area support (default 25). Higher is more accurate and much slower."
              },
              "model": {
                "label": "Model",
                "description": "Variogram model: 'exponential' (default), 'spherical', or 'gaussian'."
              },
              "preserve_total": {
                "label": "Preserve Total",
                "description": "Rescale count predictions so the target total matches the source total (default true for 'count', always off for 'average'). Only applied when the targets cover the sources — the applied factor is reported as 'mass_scale' so a partial-coverage run is visible."
              }
            }
          },
          "attribute_uncertainty": {
            "name": "Attribute Uncertainty",
            "description": "Seeded Monte-Carlo error propagation over an uncertain attribute (like ArcGIS Attribute Uncertainty): draw NORMAL/UNIFORM realizations from a per-feature error field or bound pair and append mean/std/p5/p50/p95/CV statistics.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (or table) with the uncertain attribute."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field holding the estimate (distribution mean/center) for each feature."
              },
              "error_field": {
                "label": "Error Field",
                "description": "Numeric field holding the symmetric uncertainty: a standard error for NORMAL, or a half-width for UNIFORM. Provide this OR both lower_field/upper_field."
              },
              "lower_field": {
                "label": "Lower Field",
                "description": "Numeric field with the lower bound of the value. Use together with upper_field instead of error_field."
              },
              "upper_field": {
                "label": "Upper Field",
                "description": "Numeric field with the upper bound of the value. Use together with lower_field instead of error_field."
              },
              "distribution": {
                "label": "Distribution",
                "description": "Error distribution: NORMAL (default) or UNIFORM."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Number of Monte-Carlo realizations per feature (default 1000)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic RNG (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer with the appended statistics. If omitted, stored in memory."
              }
            }
          },
          "band_collection_statistics": {
            "name": "Band Collection Statistics",
            "description": "Per-band min/max/mean/std plus the cross-band covariance and correlation matrices for a raster stack (like ArcGIS Band Collection Statistics) — the multivariate summary (PCA / classification precursor) the bundled suite lacks; distinct from per-pixel cell_statistics.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "One multiband raster (each band is a layer) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Optional CSV path for the statistics report. The matrices are always returned in the result."
              },
              "detail": {
                "label": "Detail",
                "description": "'detailed' (default) includes covariance/correlation matrices; 'brief' returns per-band statistics only."
              }
            }
          },
          "bivariate_spatial_association": {
            "name": "Bivariate Spatial Association",
            "description": "Lee's L global and local statistic measuring where two continuous variables co-vary spatially, with a seeded permutation-test p-value and a High-High/High-Low/Low-High/Low-Low class per feature — like ArcGIS Bivariate Spatial Association. The continuous-field counterpart of colocation_analysis.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer with two numeric fields."
              },
              "x_field": {
                "label": "X Field",
                "description": "First numeric variable field."
              },
              "y_field": {
                "label": "Y Field",
                "description": "Second numeric variable field."
              },
              "output": {
                "label": "Output",
                "description": "Output layer with local L, p-value, and class fields. If omitted, stored in memory."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Number of nearest neighbours for the spatial weights (default 8)."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Number of permutations for the significance test (default 199; 0 disables)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the permutation RNG (default 1), for reproducible results."
              }
            }
          },
          "block_statistics": {
            "name": "Block Statistics",
            "description": "Partitions a raster into non-overlapping blocks, reduces each by a statistic, and writes that value back to every cell in the block at the input resolution (ArcGIS Block Statistics). Complements the shipped focal_statistics (overlapping window), zonal_statistics (by zone layer) and cell_statistics (across a stack); unlike the bundled aggregate_raster it preserves cell size, so input - block mean gives a local residual surface, and it adds the categorical statistics majority/minority/median/variety.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "One of mean (default), majority, maximum, median, minimum, minority, range, std, sum, variety."
              },
              "neighborhood": {
                "label": "Neighborhood",
                "description": "Block shape: rectangle (default), circle, annulus, or wedge."
              },
              "size": {
                "label": "Size",
                "description": "Block dimensions in cells: 'width,height' for rectangle (default '3,3'), 'radius' for circle/wedge, or 'inner,outer' for annulus."
              },
              "start_angle": {
                "label": "Start Angle",
                "description": "Wedge start angle in degrees counter-clockwise from east (default 0)."
              },
              "end_angle": {
                "label": "End Angle",
                "description": "Wedge end angle in degrees counter-clockwise from east (default 90)."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "If true (default), blocks are computed from valid cells only; if false, any no-data cell makes the whole block no-data."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "boundary_clean": {
            "name": "Boundary Clean",
            "description": "Smooth categorical raster zone boundaries and remove speckle via majority filtering or expand/shrink boundary cleaning, the standard cleanup before polygonization — like ArcGIS Boundary Clean / Majority Filter.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical (integer-valued) raster."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'majority' (neighbour-majority speckle removal; default) or 'expand_shrink' (Boundary Clean smoothing)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Neighbourhood connectivity: 4 (rook) or 8 (queen; default)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "majority mode only: 'majority' (strict majority of neighbours; default) or 'half' (at least half)."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Number of passes to run (default 1)."
              },
              "sort": {
                "label": "Sort",
                "description": "expand_shrink mode only: zone priority by cell count — 'descending' (larger zones win; default), 'ascending' (smaller zones win), or 'none'."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "buffer_3d": {
            "name": "Buffer 3D",
            "description": "Buffer 3D points and lines into volumetric geometry (spheres and capsules) emitted as a triangulated surface, like ArcGIS Buffer 3D.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input 3D point or polyline layer (missing Z is treated as 0)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "distance": {
                "label": "Distance",
                "description": "Buffer radius in map units."
              },
              "distance_field": {
                "label": "Distance Field",
                "description": "Optional per-feature radius field, overriding 'distance'."
              },
              "shape": {
                "label": "Shape",
                "description": "round (default; hemispherical caps) or flat (cylinder with flat caps)."
              },
              "quality": {
                "label": "Quality",
                "description": "Tessellation resolution: segments around the circumference (default 12, min 4, max 64)."
              }
            }
          },
          "buffer_vector": {
            "name": "Buffer Vector",
            "description": "Extends geometries by a specified distance, creating polygon buffers with customizable cap/join styles. Optional dissolve merges overlapping buffers into unified polygons.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "distance": {
                "label": "Distance",
                "description": "Buffer distance in map units."
              },
              "quadrant_segments": {
                "label": "Quadrant Segments",
                "description": "Arc resolution in segments per quadrant; defaults to 8."
              },
              "cap_style": {
                "label": "Cap Style",
                "description": "Line end-cap style: round, flat, or square."
              },
              "join_style": {
                "label": "Join Style",
                "description": "Corner join style: round, bevel, or mitre."
              },
              "mitre_limit": {
                "label": "Mitre Limit",
                "description": "Mitre join limit used when join_style=mitre; defaults to 5.0."
              },
              "dissolve": {
                "label": "Dissolve",
                "description": "Dissolve overlapping buffers into a single unified polygon; defaults to false."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path."
              }
            }
          },
          "build_balanced_zones": {
            "name": "Build Balanced Zones",
            "description": "Group contiguous polygons into a target number of connected zones that balance feature count, an attribute sum, or attribute homogeneity, using SKATER spanning-tree partitioning.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon layer, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "zones": {
                "label": "Zones",
                "description": "Target number of zones to create."
              },
              "criterion": {
                "label": "Criterion",
                "description": "Balance objective: 'homogeneity' (default), 'equal_count', or 'equal_sum' (of the first field)."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated numeric analysis field(s). Required for 'homogeneity' and 'equal_sum'; drives the spanning-tree edge weights."
              },
              "contiguity": {
                "label": "Contiguity",
                "description": "Adjacency rule: 'rook' (shared edge, default) or 'queen' (shared edge or vertex)."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum distance for two boundary segments to count as shared (rook). Default 1e-6."
              }
            }
          },
          "build_seamlines": {
            "name": "Build Seamlines",
            "description": "Given a set of overlapping rasters (and optional footprints), compute where each image should be cut so the mosaic joins along a minimally visible seam, emitting one non-overlapping seamline polygon per image via a Voronoi, priority-order, radiometric or edge-aware assignment. Like ArcGIS Build Seamlines.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma/semicolon-separated raster paths to mosaic."
              },
              "output": {
                "label": "Output",
                "description": "Output seamline polygon path (one feature per input raster). If omitted, stored in memory."
              },
              "footprints": {
                "label": "Footprints",
                "description": "Optional polygon layer giving each raster's valid extent, in input order. Derived from valid data when omitted."
              },
              "method": {
                "label": "Method",
                "description": "'voronoi' (default), 'order', 'radiometry' or 'edge_detection'."
              },
              "sort_ascending": {
                "label": "Sort Ascending",
                "description": "For method 'order': true (default) gives earlier rasters priority, false gives later ones priority."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Analysis cell size (default: the finest input cell size)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band used for the radiometric methods (default 1)."
              },
              "min_region_size": {
                "label": "Min Region Size",
                "description": "Reassign assigned regions smaller than this many cells to a neighbouring image (default 0, i.e. keep all)."
              },
              "blend_width": {
                "label": "Blend Width",
                "description": "Feather width in map units, written as an attribute for downstream mosaicking (default 0)."
              },
              "blend_type": {
                "label": "Blend Type",
                "description": "'both' (default), 'inside' or 'outside'; written as an attribute."
              }
            }
          },
          "calculate_adjacent_fields": {
            "name": "Calculate Adjacent Fields",
            "description": "Populate eight directional neighbour-sheet fields (N, NE, E, SE, S, SW, W, NW) on each tile of a map-series index grid with the adjoining page's name, for 'continued on sheet …' margin labels — like ArcGIS Calculate Adjacent Fields.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon map-series index grid (e.g. output of grid_index_features)."
              },
              "page_name_field": {
                "label": "Page Name Field",
                "description": "Field whose value labels each page (written into the neighbours' directional fields)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector (driver from extension). If omitted, stored in memory."
              },
              "include_diagonal": {
                "label": "Include Diagonal",
                "description": "Also populate the four diagonal fields (NE, SE, SW, NW) from corner-touching tiles. Default true."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Quantize vertices onto a grid of this size (CRS units) before matching borders. Default 0 (exact coordinates)."
              }
            }
          },
          "calculate_central_meridian_and_parallels": {
            "name": "Calculate Central Meridian And Parallels",
            "description": "Compute a per-feature central meridian and two standard parallels from each feature's extent, for map-series and atlas pages, like ArcGIS Calculate Central Meridian And Parallels.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input features in geographic coordinates (longitude/latitude), typically a grid_index_features page grid."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "field": {
                "label": "Field",
                "description": "Name of the central-meridian field to write (default 'central_meridian')."
              },
              "standard_offset": {
                "label": "Standard Offset",
                "description": "Fraction of the latitude range used to inset each standard parallel from the feature's edge (default 0.1667, Esri's 1/6 rule). Must be in [0, 0.5)."
              }
            }
          },
          "calculate_composite_index": {
            "name": "Calculate Composite Index",
            "description": "Combine several numeric attributes into a composite index (like ArcGIS Calculate Composite Index): per-variable scaling (min-max/z-score/percentile) with optional reversal, weighted combination (mean/sum/geometric mean), and output rescaling — the vector-side sibling of fuzzy_overlay.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (or table) with numeric variable fields."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated variable fields; append ':reverse' to a field whose high values should lower the index (e.g. 'income:reverse,unemployment')."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer with the index fields added. If omitted, stored in memory."
              },
              "scaling": {
                "label": "Scaling",
                "description": "Per-variable scaling: 'minmax' (default), 'zscore', 'percentile', or 'none'."
              },
              "weights": {
                "label": "Weights",
                "description": "Comma-separated weights matching 'fields' (default: equal weights)."
              },
              "combine": {
                "label": "Combine",
                "description": "How to combine scaled variables: 'mean' (default), 'sum', or 'geometric_mean'."
              },
              "output_range": {
                "label": "Output Range",
                "description": "Rescale the combined index: 'minmax' (0–1, default), 'zero_to_100', 'zscore', or 'none'."
              }
            }
          },
          "calculate_distance_band": {
            "name": "Calculate Distance Band",
            "description": "Report the minimum, average, and maximum distance at which every feature has at least N neighbours (like ArcGIS Calculate Distance Band from Neighbor Count) — the threshold diagnostic that guarantees no feature is left with zero neighbours before distance-based spatial stats. The bundled generate_spatial_weights_matrix builds the matrix but never reports this band.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point/feature vector layer (projected CRS; distances in its units)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Neighbour count k (>= 1). Default 1."
              },
              "distance_method": {
                "label": "Distance Method",
                "description": "'euclidean' (default) or 'manhattan'."
              },
              "output": {
                "label": "Output",
                "description": "Optional CSV path for a feature_id,kth_neighbor_distance table."
              }
            }
          },
          "calculate_end_time": {
            "name": "Calculate End Time",
            "description": "Fills an end-time field from the start time of the next record within each entity group, turning instant-in-time observations into time-extent records (ArcGIS Calculate End Time). transform_fields does per-value transforms and summary_statistics aggregates groups, but nothing performed a row-ordered temporal fill.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer or table."
              },
              "start_field": {
                "label": "Start Field",
                "description": "Timestamp field: a numeric epoch, or an ISO-8601 date/date-time string."
              },
              "end_field": {
                "label": "End Field",
                "description": "Field receiving the end time (default 'END_TIME'). Created if absent, overwritten if present."
              },
              "id_fields": {
                "label": "Id Fields",
                "description": "Comma- or semicolon-separated grouping fields. End times are derived within a group only, never across group boundaries."
              },
              "last_record": {
                "label": "Last Record",
                "description": "What to write for each group's final row: 'null' (default), 'same_as_start', or 'duration' (start + default_duration)."
              },
              "default_duration": {
                "label": "Default Duration",
                "description": "Seconds added to the start for last_record 'duration'."
              },
              "output": {
                "label": "Output",
                "description": "Output layer. If omitted, stored in memory."
              }
            }
          },
          "calculate_grid_convergence_angle": {
            "name": "Calculate Grid Convergence Angle",
            "description": "Compute, per feature, the grid convergence angle between grid north and true north from the centroid lon/lat and a central meridian (default the feature's own UTM central meridian), writing it to a field for correct symbol/label rotation on projected maps — like ArcGIS Calculate Grid Convergence Angle. Geographic (clockwise from north) or arithmetic (counter-clockwise from east) convention. Pure math, no PROJ; unrelated to the bundled convergence_index terrain metric. Geometry is read as lon/lat degrees.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry type) in geographic coordinates (lon/lat degrees, EPSG:4326)."
              },
              "angle_field": {
                "label": "Angle Field",
                "description": "Name of the float field to hold the convergence angle in degrees. Default 'GRID_CONV'."
              },
              "angle_type": {
                "label": "Angle Type",
                "description": "Angle convention: 'geographic' (degrees clockwise from north, positive east) or 'arithmetic' (degrees counter-clockwise from east, 90 − geographic). Default 'geographic'."
              },
              "central_meridian": {
                "label": "Central Meridian",
                "description": "Central meridian longitude in degrees. If omitted, each feature uses its own UTM-zone central meridian derived from its longitude."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "calculate_missing_z_values": {
            "name": "Calculate Missing Z Values",
            "description": "Fill placeholder or absent Z values along 3D features by interpolating from the valid Z values on either side, like ArcGIS Calculate Missing Z Values.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer with 3D vertices."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "placeholder": {
                "label": "Placeholder",
                "description": "Sentinel value marking a missing Z (e.g. -9999). Vertices with no Z at all are always treated as missing."
              },
              "method": {
                "label": "Method",
                "description": "Fill method: 'linear' (default; interpolate by distance along the feature) or 'nearest'."
              },
              "extrapolate": {
                "label": "Extrapolate",
                "description": "Fill leading/trailing gaps by extending the nearest valid vertex (default false; unfilled vertices are counted instead)."
              }
            }
          },
          "calculate_motion_statistics": {
            "name": "Calculate Motion Statistics",
            "description": "Annotate timestamped track points with motion statistics — speed, acceleration, bearing, segment and cumulative distance, elapsed time and idle flag — grouped by track and ordered by time, like ArcGIS Calculate Motion Statistics.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of timestamped observations."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying each track/mover."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: numeric seconds or an ISO-8601 timestamp."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector (original attributes + motion fields). If omitted, stored in memory."
              },
              "window": {
                "label": "Window",
                "description": "Trailing number of points for the smoothed 'avg_speed' (default 1 = instantaneous)."
              },
              "idle_distance": {
                "label": "Idle Distance",
                "description": "Idle radius: a point is idle when the mover travelled no more than this over the last idle_duration seconds. Default 0 (idle detection off)."
              },
              "idle_duration": {
                "label": "Idle Duration",
                "description": "Look-back window (seconds) for idle detection. Default 60."
              }
            }
          },
          "calculate_polygon_main_angle": {
            "name": "Calculate Polygon Main Angle",
            "description": "Write each polygon's dominant orientation (the long-side direction of its minimum-area bounding rectangle, via rotating calipers) to an angle field — like ArcGIS Calculate Polygon Main Angle. The per-polygon vector orientation the bundled raster-only patch_orientation lacks; feeds symbol/label rotation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer with the angle field added. If omitted, stored in memory."
              },
              "angle_field": {
                "label": "Angle Field",
                "description": "Name of the angle field to write (default 'MainAngle')."
              },
              "convention": {
                "label": "Convention",
                "description": "'arithmetic' (CCW from east; default), 'geographic' (CW from north), or 'graphic' (CW from east)."
              }
            }
          },
          "calculate_rates": {
            "name": "Calculate Rates",
            "description": "Compute smoothed rates from count and population fields (like ArcGIS Calculate Rates): crude rate, Marshall global empirical Bayes, or spatial empirical Bayes over k-nearest neighbours — the standard stabilization step before hot-spot analysis of disease/crime rates.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon or point layer with count and population fields."
              },
              "count_field": {
                "label": "Count Field",
                "description": "Field holding the event count (numerator)."
              },
              "population_field": {
                "label": "Population Field",
                "description": "Field holding the population at risk (denominator)."
              },
              "output": {
                "label": "Output",
                "description": "Output layer with rate fields added. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'crude', 'eb_global' (default), or 'eb_spatial'."
              },
              "per": {
                "label": "Per",
                "description": "Rate multiplier, e.g. 100000 for per-100k (default 100000)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "eb_spatial only: number of nearest neighbours for the local reference rate (default 8)."
              }
            }
          },
          "calculate_transformation_errors": {
            "name": "Calculate Transformation Errors",
            "description": "Fit a similarity/affine/projective transformation from displacement links and report each link's residual error plus the overall RMSE, so bad control points can be found and removed before transforming. Like ArcGIS Calculate Transformation Errors.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Displacement link lines: first vertex is the source (from) point, last vertex the target (to) point."
              },
              "output": {
                "label": "Output",
                "description": "Output path for the link table with residual fields appended. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'affine' (default, 6 parameters), 'similarity' (4) or 'projective' (8)."
              },
              "keep_geometry": {
                "label": "Keep Geometry",
                "description": "Keep each link's geometry on the output (default true). Set false for a pure table."
              }
            }
          },
          "calculate_transit_service_frequency": {
            "name": "Calculate Transit Service Frequency",
            "description": "Windowed GTFS transit service frequency: for a service date (via calendar/calendar_dates) and time window, count trips serving each stop or route line and report trips-per-hour, like ArcGIS Calculate Transit Service Frequency.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Path to an extracted GTFS feed directory."
              },
              "target": {
                "label": "Target",
                "description": "'stops' (point per stop, default) or 'lines' (polyline per route)."
              },
              "date": {
                "label": "Date",
                "description": "Service date YYYYMMDD, resolved via calendar.txt/calendar_dates.txt. If omitted, all services count."
              },
              "start_time": {
                "label": "Start Time",
                "description": "Window start HH:MM or HH:MM:SS (GTFS times may exceed 24:00). If omitted, the whole day counts."
              },
              "duration_minutes": {
                "label": "Duration Minutes",
                "description": "Window length in minutes (used with start_time; also sets the per-hour denominator)."
              },
              "count": {
                "label": "Count",
                "description": "'departures' (default) or 'arrivals' — which stop-time field to count."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "calculate_utm_zone": {
            "name": "Calculate UTM Zone",
            "description": "Compute the optimal UTM zone and WGS84 EPSG code for each feature from its centroid longitude/latitude, adding a zone (1–60) and an EPSG (326##/327##) field — for adaptive-projection map series, like ArcGIS Calculate UTM Zone. Pure math with the Norway/Svalbard exceptions; no PROJ. Geometry is read as lon/lat degrees.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry type) in geographic coordinates (lon/lat degrees, EPSG:4326)."
              },
              "zone_field": {
                "label": "Zone Field",
                "description": "Name of the integer field to hold the UTM zone number (1–60). Default 'utm_zone'."
              },
              "epsg_field": {
                "label": "Epsg Field",
                "description": "Name of the integer field to hold the WGS84 UTM EPSG code (326## north, 327## south). Default 'utm_epsg'."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "cartogram": {
            "name": "Cartogram",
            "description": "Distort polygons so area is proportional to an attribute value: non-contiguous (scale each polygon about its centroid) or Dorling (proportional circles with overlap removal).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field whose value each feature's area should be proportional to."
              },
              "method": {
                "label": "Method",
                "description": "'non_contiguous' (default; scale polygons in place) or 'dorling' (proportional circles)."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Dorling overlap-removal iterations (default 100). Ignored by non_contiguous."
              }
            }
          },
          "causal_inference_analysis": {
            "name": "Causal Inference Analysis",
            "description": "Estimate the causal effect of a binary treatment on an outcome via propensity-score matching, inverse-probability weighting, or regression adjustment, with a seeded bootstrap CI and a per-confounder covariate-balance table before/after adjustment (like ArcGIS Causal Inference Analysis).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer."
              },
              "outcome_field": {
                "label": "Outcome Field",
                "description": "Numeric outcome (dependent) field."
              },
              "treatment_field": {
                "label": "Treatment Field",
                "description": "Binary (0/1, or boolean) treatment field. Continuous treatments are not supported in this version."
              },
              "confounding_fields": {
                "label": "Confounding Fields",
                "description": "Comma-separated numeric confounder field(s) to adjust for."
              },
              "method": {
                "label": "Method",
                "description": "'ps_matching' (default, nearest-neighbour caliper matching on the propensity score), 'ipw' (stabilized inverse-probability weighting), or 'regression_adjustment' (outcome ~ treatment + confounders)."
              },
              "add_spatial_confounders": {
                "label": "Add Spatial Confounders",
                "description": "If true, widen the confounder set with each feature's x/y coordinates plus the k-nearest-neighbour average of each confounder (default false)."
              },
              "balance_threshold": {
                "label": "Balance Threshold",
                "description": "Standardized-mean-difference threshold for the post-adjustment balance check (default 0.1)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (input copy + propensity score / weight / match-id columns). If omitted, stored in memory."
              },
              "seed": {
                "label": "Seed",
                "description": "Integer seed for the deterministic bootstrap confidence interval (default 42)."
              }
            }
          },
          "cell_position_statistics": {
            "name": "Cell Position Statistics",
            "description": "Per-cell position and rank statistics across a stack of aligned rasters (ArcGIS Highest Position, Lowest Position, Popularity and Rank): which layer holds the extreme value, the value occurring a given number of times, or the nth-smallest value. cell_statistics reduces a stack to a value and can never report which layer that value came from, and the bundled find_argument_statistics works along one multiband raster's argument axis without the popularity/rank selector semantics.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "One multiband raster (each band is a layer) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Output raster. If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "'highest_position' (default), 'lowest_position', 'popularity', or 'rank'."
              },
              "selector": {
                "label": "Selector",
                "description": "Required for 'popularity' and 'rank': a co-registered raster path, or a constant number, giving the per-cell occurrence count (popularity) or 1-based rank to select."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "Skip no-data observations per cell (default true). When false, any no-data observation makes the cell no-data."
              },
              "process_as_multiband": {
                "label": "Process As Multiband",
                "description": "'single_band' (default): every band of every input is one layer of a single stack. 'multi_band': band i of every input forms its own stack, giving a multiband result."
              }
            }
          },
          "cell_records_to_sectors": {
            "name": "Cell Records To Sectors",
            "description": "Build antenna coverage geometry from cell-tower points: wedge polygons or bisector sector lines from per-tower azimuth, beamwidth, and radius — like ArcGIS Cell Site Records To Feature Class / Generate Sector Lines.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of antennas/towers."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "output_type": {
                "label": "Output Type",
                "description": "Geometry to emit: 'wedge' (coverage polygons, default) or 'line' (bisector sector lines)."
              },
              "azimuth_field": {
                "label": "Azimuth Field",
                "description": "Field holding each antenna's azimuth (compass degrees, 0 = north, clockwise). Falls back to 'azimuth' when missing."
              },
              "beamwidth_field": {
                "label": "Beamwidth Field",
                "description": "Field holding each antenna's beamwidth in degrees. Falls back to 'beamwidth' when missing."
              },
              "radius_field": {
                "label": "Radius Field",
                "description": "Field holding each antenna's coverage radius in CRS units. Falls back to 'radius' when missing."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Default azimuth in compass degrees when no field is given / a value is missing. Default 0."
              },
              "beamwidth": {
                "label": "Beamwidth",
                "description": "Default beamwidth in degrees (0 < bw ≤ 360; ≥ 360 = omnidirectional). Default 65."
              },
              "radius": {
                "label": "Radius",
                "description": "Default coverage radius in CRS units (must be positive). Default 1000."
              },
              "segments": {
                "label": "Segments",
                "description": "Number of straight segments used to approximate each sector arc (≥ 1). Default 16."
              }
            }
          },
          "cell_statistics": {
            "name": "Cell Statistics",
            "description": "Per-pixel statistic across a stack of aligned rasters (like ArcGIS Cell Statistics): mean, majority, maximum, median, minimum, minority, percentile, range, std, sum, or variety — the local multi-raster reducer the bundled sum_overlay/weighted_sum (sum only) and the neighbourhood/zonal tools don't provide.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "One multiband raster (each band is a layer) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Output single-band raster of the reduced value. If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "'mean' (default), 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'range', 'std', 'sum', or 'variety'."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "Skip no-data observations per cell (default true). When false, any no-data observation makes the cell no-data."
              },
              "percentile_value": {
                "label": "Percentile Value",
                "description": "Percentile in [0, 100] for statistic 'percentile' (default 50 = median)."
              }
            }
          },
          "central_feature": {
            "name": "Central Feature / Linear Directional Mean",
            "description": "The central feature (the input feature with the smallest total distance to all others) or the linear directional mean (mean bearing, circular variance, and mean length of line features) — the two Measuring Geographic Distributions members directional_distribution lacks (ArcGIS Central Feature / Linear Directional Mean).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points for central_feature; lines for linear_directional_mean)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "'central_feature' (default) or 'linear_directional_mean'."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field weighting each feature (central_feature only)."
              },
              "case_field": {
                "label": "Case Field",
                "description": "Optional field to group features by; one result per distinct value."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance metric for central_feature: 'euclidean' (default) or 'manhattan'."
              },
              "orientation_only": {
                "label": "Orientation Only",
                "description": "Treat lines as undirected (orientation mod 180°) for linear_directional_mean. Default false."
              }
            }
          },
          "change_point_detection": {
            "name": "Change Point Detection",
            "description": "Detect abrupt shifts in the time series at each location of an H3 space-time cube (like ArcGIS Change Point Detection): binary segmentation on a mean- or slope-shift cost with a sensitivity-scaled penalty (or a fixed number of change points), reporting per cell the change count, the largest change's year, and the segment means. The temporal segmentation the two-date change_vector_analysis and monotonic Mann-Kendall tests can't do.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer of timestamped events (lon/lat)."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: a number or an ISO-8601 timestamp."
              },
              "output": {
                "label": "Output",
                "description": "Output H3 polygon layer with change-point attributes. If omitted, stored in memory."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field to aggregate per bin (default: point count)."
              },
              "change_type": {
                "label": "Change Type",
                "description": "'mean' (level shifts; default) or 'slope' (trend shifts)."
              },
              "method": {
                "label": "Method",
                "description": "'auto' (penalty-based, default) or 'defined' (exactly num_change_points)."
              },
              "num_change_points": {
                "label": "Num Change Points",
                "description": "defined method: number of change points to find per location (default 1)."
              },
              "sensitivity": {
                "label": "Sensitivity",
                "description": "auto method: penalty scale; higher = fewer change points (default 1.0)."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Width of a time step in the time_field's units (default 1)."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0..15 (default 7)."
              }
            }
          },
          "classification_accuracy_assessment": {
            "name": "Classification Accuracy Assessment",
            "description": "Score a classified raster (or points that already carry a predicted class) against reference points labelled with ground truth, producing a confusion matrix, overall accuracy, per-class producer's/user's accuracy, and Cohen's kappa — like ArcGIS Compute Confusion Matrix.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Reference (accuracy assessment) point layer carrying the ground-truth class field."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Attribute on the points holding the ground-truth (reference) class label."
              },
              "input": {
                "label": "Input",
                "description": "Classified raster to sample at each reference point (nearest cell). Provide this OR 'classified_field'."
              },
              "classified_field": {
                "label": "Classified Field",
                "description": "Attribute on the points that already holds the predicted (map) class, used instead of sampling a raster. Provide this OR 'input'."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the classified raster to sample (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path for the reference points annotated with REF_CLASS, MAP_CLASS, CORRECT. If omitted, stored in memory."
              }
            }
          },
          "collapse_dual_lines_to_centerline": {
            "name": "Collapse Dual Lines To Centerline",
            "description": "Detect pairs of roughly parallel lines within a width tolerance (dual carriageways, road casings) and replace each pair with a single centerline, reconnecting junctions — like ArcGIS Collapse Dual Lines To Centerline.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector layer (projected CRS; widths in its units)."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path (driver from extension). If omitted, stored in memory."
              },
              "min_width": {
                "label": "Min Width",
                "description": "Minimum separation between paired lines, in CRS units (default 0)."
              },
              "max_width": {
                "label": "Max Width",
                "description": "Maximum separation between paired lines, in CRS units. Required (the collapse width)."
              },
              "attribute": {
                "label": "Attribute",
                "description": "Optional field that must match for two lines to pair (e.g. road name or class)."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Densification interval for parallelism testing, in CRS units. Default: max_width / 2."
              },
              "min_overlap": {
                "label": "Min Overlap",
                "description": "Minimum fraction of a line that must run parallel to its partner to pair (0-1, default 0.5)."
              }
            }
          },
          "collapse_hydro_polygon": {
            "name": "Collapse Hydro Polygon",
            "description": "Collapse narrow water polygons to centerlines while keeping wide reaches as polygons (like ArcGIS Collapse Hydro Polygon): trace each polygon's centerline along its principal axis via perpendicular cross-section midpoints, measure local width, and collapse where the median width is at or below a threshold. The width-thresholded polygon→line generalization the line-casing collapse_dual_lines_to_centerline and raster river_centerlines don't do.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input water polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Output centerline layer for collapsed (narrow) polygons. If omitted, stored in memory."
              },
              "collapse_width": {
                "label": "Collapse Width",
                "description": "Polygons whose median width is at or below this collapse to a centerline."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Spacing of cross-section stations along the axis (default: collapse_width / 2)."
              },
              "min_length": {
                "label": "Min Length",
                "description": "Drop collapsed centerlines shorter than this (default 0)."
              },
              "retained": {
                "label": "Retained",
                "description": "Optional output polygon layer for wide (non-collapsed) reaches."
              }
            }
          },
          "collapse_road_detail": {
            "name": "Collapse Road Detail",
            "description": "Collapse small road loops and jogs (roundabouts, dogbones, offset jogs) below a diameter threshold to single through-connections for small-scale display, preserving network connectivity — like ArcGIS Collapse Road Detail.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input road (line) vector layer, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "collapse_distance": {
                "label": "Collapse Distance",
                "description": "Maximum detail diameter to collapse. Loops/jogs whose bounding diameter is below this (metres for a geographic CRS, CRS units otherwise) are collapsed; larger ones are kept."
              },
              "road_class_field": {
                "label": "Road Class Field",
                "description": "Optional road-class field. When set, only loops whose boundary roads all share the same class value are collapsed (junctions between different classes are preserved)."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Distance within which road endpoints are treated as the same junction. Default 1e-6."
              }
            }
          },
          "collect_events": {
            "name": "Collect Events",
            "description": "Collapse coincident incident points into unique locations, each carrying an ICOUNT count of the events there, like ArcGIS Collect Events.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (Point or MultiPoint)."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Snapping tolerance in map units; points whose coordinates round to the same cell are treated as coincident (default 1e-8, i.e. effectively exact)."
              }
            }
          },
          "colocation_analysis": {
            "name": "Colocation Analysis",
            "description": "Local colocation quotient (Leslie & Kronenfeld) measuring whether category-A points are disproportionately found among category-B neighbours, with a seeded permutation-test p-value — like ArcGIS Colocation Analysis.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer with a category field."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (a copy of the input with colocation fields). If omitted, stored in memory."
              },
              "category_field": {
                "label": "Category Field",
                "description": "Field holding each point's category."
              },
              "category_a": {
                "label": "Category A",
                "description": "Focal category (A): the points whose colocation with B is measured."
              },
              "category_b": {
                "label": "Category B",
                "description": "Neighbour category (B): the points A is tested against."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Number of nearest neighbours k (default 8)."
              },
              "weight": {
                "label": "Weight",
                "description": "Neighbour weighting: 'gaussian' (distance-decay, default) or 'uniform'."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Number of label permutations for the significance test (default 99; 0 disables)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the permutation RNG (default 1), for reproducible results."
              }
            }
          },
          "color_polygons": {
            "name": "Color Polygons",
            "description": "Assign each polygon a small integer colour index so no two adjacent polygons share a value (like ArcGIS Calculate Color Theorem Field) — adjacency-safe choropleth styling via DSATUR graph colouring over shared-edge (or shared-corner) contiguity.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer with the colour field added. If omitted, stored in memory."
              },
              "field": {
                "label": "Field",
                "description": "Name of the colour index field to write (default 'color_id')."
              },
              "adjacency": {
                "label": "Adjacency",
                "description": "'edge' (rook, shared border; default) or 'edge_or_corner' (queen, shared border or vertex)."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Grid size to snap vertices to before matching borders (default 0 = exact)."
              }
            }
          },
          "combine": {
            "name": "Combine",
            "description": "Assign a unique zone id to each unique combination of values across two or more co-registered categorical rasters, plus a value-attribute table (id, count, one column per input).",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma-separated list of >=2 co-registered categorical/integer rasters to combine."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path for the unique-condition id grid. If omitted, stored in memory."
              },
              "csv_output": {
                "label": "Csv Output",
                "description": "Optional CSV path for the value-attribute table (value, count, one column per input raster)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from every input raster. Default 1."
              }
            }
          },
          "compare_spatial_weights": {
            "name": "Compare Spatial Weights",
            "description": "Rank candidate spatial-weights conceptualizations (KNN, fixed distance band, contiguity edges / edges+corners, Delaunay) by how strongly each captures spatial clustering of one or more analysis fields, using row-standardized Global Moran's I with its z-score and two-sided p-value — like ArcGIS Compare Neighborhood Conceptualizations. Emits a ranked comparison table and the single best method.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points/lines/polygons; contiguity requires polygons)."
              },
              "output": {
                "label": "Output",
                "description": "Output comparison table path — a CSV (extension .csv) or a geometry-less vector table. If omitted, stored in memory."
              },
              "input_fields": {
                "label": "Input Fields",
                "description": "Comma-separated list of numeric field names to analyse for spatial clustering."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Field holding each feature's unique id (accepted for compatibility; not required to compute Moran's I)."
              },
              "methods": {
                "label": "Methods",
                "description": "Comma-separated candidate conceptualizations from: knn, fixed_distance_band, contiguity_edges, contiguity_edges_corners, delaunay. Default 'knn,contiguity_edges,contiguity_edges_corners'. Methods that do not apply to the geometry (or error) are skipped."
              },
              "number_of_neighbors": {
                "label": "Number Of Neighbors",
                "description": "Number of nearest neighbours k for the knn method. Default 8."
              },
              "threshold_distance": {
                "label": "Threshold Distance",
                "description": "Distance band cutoff in map units. Required only when fixed_distance_band is among the methods."
              }
            }
          },
          "composite_bands": {
            "name": "Composite Bands",
            "description": "Stacks several single-band rasters into one multiband raster, in the order given (ArcGIS Composite Bands). The bundled create_colour_composite is fixed at three RGB bands, so there was no way to assemble the N-band input that band_collection_statistics, principal_component_analysis, spectral_index and the OBIA suite all require.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma- or semicolon-separated raster paths, in output band order. At least one."
              },
              "band": {
                "label": "Band",
                "description": "1-based band taken from each input when an input is itself multiband (default 1)."
              },
              "nodata_policy": {
                "label": "Nodata Policy",
                "description": "'any' (default): a cell is no-data if any band is no-data. 'all': only if every band is."
              },
              "nodata": {
                "label": "Nodata",
                "description": "No-data value for the output (default: the first input's no-data)."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband raster. If omitted, stored in memory."
              }
            }
          },
          "compute_accuracy_for_object_detection": {
            "name": "Compute Accuracy For Object Detection",
            "description": "Score detected features against ground truth using IoU matching, reporting per-class precision, recall, average precision and overall mAP, like ArcGIS Compute Accuracy For Object Detection.",
            "params": {
              "detected": {
                "label": "Detected",
                "description": "Detected features (polygons or bounding boxes)."
              },
              "ground_truth": {
                "label": "Ground Truth",
                "description": "Reference features to score against."
              },
              "output": {
                "label": "Output",
                "description": "Optional output accuracy table path. If omitted, stored in memory."
              },
              "detected_class_field": {
                "label": "Detected Class Field",
                "description": "Class label field on the detections. Omit to score everything as a single class."
              },
              "ground_truth_class_field": {
                "label": "Ground Truth Class Field",
                "description": "Class label field on the ground truth. Omit to score everything as a single class."
              },
              "confidence_field": {
                "label": "Confidence Field",
                "description": "Confidence score field on the detections, used to rank for average precision. Without it detections are scored in input order."
              },
              "min_iou": {
                "label": "Min Iou",
                "description": "Minimum intersection-over-union for a detection to count as a match (default 0.5)."
              }
            }
          },
          "compute_sar_indices": {
            "name": "Compute SAR Indices",
            "description": "Derives polarimetric SAR indices — RVI (Radar Vegetation Index), RFDI (Radar Forest Degradation Index), CSI (Canopy Structure Index) and DPSVI (Dual-Pol SAR Vegetation Index) — from multi-polarization backscatter (ArcGIS Compute SAR Indices). spectral_index covers optical band math only: its formulas and band conventions are reflectance-domain and it has no notion of polarization channels, so the catalog's SAR chain (multilook, sar_coherence, speckle filters) currently has no analysis endpoint.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Multi-polarization calibrated SAR raster (one band per polarization)."
              },
              "output": {
                "label": "Output",
                "description": "Output index raster. If omitted, stored in memory."
              },
              "index": {
                "label": "Index",
                "description": "'rvi' (default), 'rfdi', 'csi', or 'dpsvi'."
              },
              "polarization_bands": {
                "label": "Polarization Bands",
                "description": "1-based band mapping, e.g. 'vv=1,vh=2' or 'hh=1,hv=2,vv=3'. Default by band count: 2 bands = 'vv=1,vh=2', 3+ bands = 'hh=1,hv=2,vv=3'."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'linear' (default) or 'db'. dB input is converted to linear power before the ratio arithmetic, because ratios of decibels are not meaningful."
              }
            }
          },
          "construct_sight_lines": {
            "name": "Construct Sight Lines",
            "description": "Build sight-line features between observer points and target features, with observer/target height offsets, sampling along linear and areal targets, optional azimuth and vertical-angle fields, and 2D or 3D distance. Like ArcGIS Construct Sight Lines.",
            "params": {
              "observers": {
                "label": "Observers",
                "description": "Observer point features."
              },
              "targets": {
                "label": "Targets",
                "description": "Target point, line or polygon features."
              },
              "output": {
                "label": "Output",
                "description": "Output sight-line path. If omitted, stored in memory."
              },
              "observer_height_field": {
                "label": "Observer Height Field",
                "description": "Optional field giving each observer's height offset (added to its Z)."
              },
              "target_height_field": {
                "label": "Target Height Field",
                "description": "Optional field giving each target's height offset (added to its Z)."
              },
              "join_field": {
                "label": "Join Field",
                "description": "Optional field present on both inputs; only observers and targets sharing a value are paired. Without it, every observer pairs with every target."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Spacing in map units for target points generated along line/polygon boundaries (default: one point per vertex)."
              },
              "output_direction": {
                "label": "Output Direction",
                "description": "Add AZIMUTH and VERT_ANGLE fields (default false)."
              },
              "distance_method": {
                "label": "Distance Method",
                "description": "'2d' (default) or '3d' for the DISTANCE field."
              }
            }
          },
          "contiguous_cartogram": {
            "name": "Contiguous Cartogram",
            "description": "Density-equalizing (Gastner-Newman diffusion) cartogram: distorts polygon areas in proportion to an attribute while keeping the map a connected sheet with shared borders (ArcGIS Generate Contiguous Cartogram). The shipped cartogram tool implements only the non-contiguous and Dorling methods, both of which destroy adjacency, and its own module doc defers the contiguous form.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Contiguous polygon layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Positive numeric attribute whose total the areas should become proportional to."
              },
              "grid_size": {
                "label": "Grid Size",
                "description": "Density grid resolution; must be a power of two (default 256). The dominant accuracy/cost knob."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Diffusion steps (default 20). More steps equalize density further at the cost of more distortion."
              },
              "blur": {
                "label": "Blur",
                "description": "Gaussian pre-smoothing of the density field, in grid cells (default 0.5). Prevents the extreme distortion a hard density discontinuity produces."
              },
              "sea_density": {
                "label": "Sea Density",
                "description": "Density outside the study area: 'mean' (default) or 'min'. This materially changes the result at the map edge."
              },
              "densify_spacing": {
                "label": "Densify Spacing",
                "description": "Maximum edge segment length in grid cells before vertices are inserted (default 1.0). Long straight borders otherwise separate from their neighbours."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer with displaced vertices and the original attributes. If omitted, stored in memory."
              }
            }
          },
          "contour_list": {
            "name": "Contour List",
            "description": "Generates contours at an explicit list of values rather than a fixed interval, as chained polylines or filled polygons, each labelled with its level (ArcGIS Contour List). The bundled contours_from_raster accepts only 'interval' and 'base', so the irregular series that real charts use — IHO depth steps, flood recurrence stages, published class breaks — need one run per value and a merge, and still cannot come out as one layer labelled by level.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input surface raster."
              },
              "contour_values": {
                "label": "Contour Values",
                "description": "Comma-separated list of levels to contour, in the raster's own z units."
              },
              "output": {
                "label": "Output",
                "description": "Output contour layer. If omitted, stored in memory."
              },
              "geometry_type": {
                "label": "Geometry Type",
                "description": "'polyline' (default) for contour lines, or 'polygon' for the filled region at or above each level."
              },
              "min_length": {
                "label": "Min Length",
                "description": "Discard contour lines shorter than this, in map units, which removes the specks a noisy surface produces."
              },
              "close_rings": {
                "label": "Close Rings",
                "description": "Repeat the first vertex on contours that close on themselves (default true)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to contour (default 1)."
              }
            }
          },
          "contour_with_barriers": {
            "name": "Contour With Barriers",
            "description": "Trace iso-value contour lines of a surface that terminate at barrier features instead of crossing them.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input continuous surface raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output line vector path (driver from its extension). If omitted, stored in memory."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier vector layer (lines or polygons). Contours will not cross these features."
              },
              "interval": {
                "label": "Interval",
                "description": "Contour interval in surface units. Levels are base + k*interval within the data range. Ignored if 'levels' is given."
              },
              "base": {
                "label": "Base",
                "description": "Base value the interval is measured from (default 0)."
              },
              "levels": {
                "label": "Levels",
                "description": "Explicit comma-separated contour values (e.g. \"10,20,30\"). Overrides interval/base."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "convert_coordinate_notation": {
            "name": "Convert Coordinate Notation",
            "description": "Convert each feature's coordinate between notations — decimal degrees (DD), degrees-minutes-seconds (DMS), degrees-decimal-minutes (DDM), UTM, and MGRS/USNG — writing a new field in the target notation, like ArcGIS Convert Coordinate Notation. Pure grid math (Krüger transverse-Mercator + MGRS lettering on WGS84); no PROJ.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point (or table) vector layer."
              },
              "input_notation": {
                "label": "Input Notation",
                "description": "Notation of the input coordinate: DD, DMS, DDM, UTM, or MGRS."
              },
              "output_notation": {
                "label": "Output Notation",
                "description": "Target notation to write: DD, DMS, DDM, UTM, or MGRS."
              },
              "coord_field": {
                "label": "Coord Field",
                "description": "Field holding the input coordinate string. If omitted, the point geometry is used (valid only when input_notation=DD; geometry x=lon, y=lat)."
              },
              "output_field": {
                "label": "Output Field",
                "description": "Name of the field to write. Default: the lowercased output notation (e.g. 'utm')."
              },
              "precision": {
                "label": "Precision",
                "description": "MGRS digits per axis (1=10km … 5=1m, up to 9). Default 5. Ignored by other notations."
              },
              "update_geometry": {
                "label": "Update Geometry",
                "description": "If true, rebuild each feature's geometry as a lon/lat point in EPSG:4326 from the parsed coordinate. Default false (keep input geometry/CRS)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "convert_sar_units": {
            "name": "Convert SAR Units",
            "description": "Converts a SAR raster between amplitude, intensity, linear power, decibel, complex-to-intensity and unwrapped-phase-to-displacement representations (ArcGIS Convert SAR Units). raster_calculator can evaluate the arithmetic but carries none of the semantics or guards — it returns -inf for zero-valued cells on a log conversion, and nothing in the catalog records which unit a SAR raster is in, so speckle filters and ratio indices are routinely applied to the wrong representation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input SAR raster. For 'complex_to_intensity' this is a two-band I/Q raster (the multilook / sar_coherence convention)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path. If omitted, stored in memory."
              },
              "conversion": {
                "label": "Conversion",
                "description": "'linear_to_db', 'db_to_linear', 'amplitude_to_intensity', 'intensity_to_amplitude', 'complex_to_intensity', or 'phase_to_displacement'."
              },
              "wavelength": {
                "label": "Wavelength",
                "description": "Radar wavelength in metres for 'phase_to_displacement' (default 0.05546576, Sentinel-1 C-band)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1). Ignored for 'complex_to_intensity', which always reads bands 1 and 2 as I and Q."
              }
            }
          },
          "coregister_rasters": {
            "name": "Coregister Rasters",
            "description": "Automatically aligns a secondary raster to a reference by normalised cross-correlation of a tile grid, sub-pixel peak refinement, a least-squares transform fit with outlier trimming, and resampling (ArcGIS Apply Coregistration). This is the missing precondition for the catalog's whole InSAR chain: sar_coherence, flatten_interferogram and goldstein_phase_filter all require co-registered input and nothing produced it. georeference_raster_from_control_points needs hand-picked control points, image_correlation only scores similarity, and warp_raster needs a transform supplied to it.",
            "params": {
              "reference": {
                "label": "Reference",
                "description": "Reference raster. The output is written on this raster's grid."
              },
              "secondary": {
                "label": "Secondary",
                "description": "Raster to align to the reference. All of its bands are resampled."
              },
              "output": {
                "label": "Output",
                "description": "Output resampled secondary raster on the reference grid. If omitted, stored in memory."
              },
              "tie_points": {
                "label": "Tie Points",
                "description": "Output point layer of accepted tie points with their measured shift and correlation. Always produced; stored in memory when no path is given."
              },
              "band": {
                "label": "Band",
                "description": "1-based band used for matching (default 1). A two-band input is matched on its complex magnitude unless this is given."
              },
              "transform": {
                "label": "Transform",
                "description": "'translation', 'affine' (default), or 'polynomial2'."
              },
              "tile_size": {
                "label": "Tile Size",
                "description": "Side of each matching tile in cells (default 32)."
              },
              "grid_size": {
                "label": "Grid Size",
                "description": "Number of tiles per axis (default 8, so 64 tiles)."
              },
              "max_shift": {
                "label": "Max Shift",
                "description": "Half-width of the integer search window in cells (default 8)."
              },
              "min_correlation": {
                "label": "Min Correlation",
                "description": "Reject tie points whose peak normalised correlation is below this (default 0.3)."
              },
              "outlier_sigma": {
                "label": "Outlier Sigma",
                "description": "Trim tie points whose fit residual exceeds this many standard deviations (default 3.0). Set to 0 to disable trimming."
              },
              "resample": {
                "label": "Resample",
                "description": "'bilinear' (default) or 'nearest'."
              }
            }
          },
          "corridor": {
            "name": "Corridor",
            "description": "Least-cost corridor between two accumulated-cost surfaces (ArcGIS Corridor): sum two cost-distance rasters into a corridor surface whose minimum is the least-cost path, then optionally threshold to the near-optimal band. Direct (two cost rasters) or convenience mode (one friction raster + two source rasters).",
            "params": {
              "cost1": {
                "label": "Cost1",
                "description": "First accumulated-cost raster (from source A). Direct mode."
              },
              "cost2": {
                "label": "Cost2",
                "description": "Second accumulated-cost raster (from source B). Direct mode."
              },
              "cost": {
                "label": "Cost",
                "description": "Friction/cost-of-passage raster. Convenience mode (with source1/source2)."
              },
              "source1": {
                "label": "Source1",
                "description": "First source raster (positive cells are sources). Convenience mode."
              },
              "source2": {
                "label": "Source2",
                "description": "Second source raster (positive cells are sources). Convenience mode."
              },
              "output": {
                "label": "Output",
                "description": "Output corridor raster path. If omitted, stored in memory."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Keep only cells whose corridor cost is at or below this absolute value (masks the rest to no-data)."
              },
              "percent": {
                "label": "Percent",
                "description": "Keep only cells within this percent above the minimum corridor cost (e.g. 5 = within 5%). Ignored if 'threshold' is set."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from the input raster(s). Default 1."
              }
            }
          },
          "cost_back_link": {
            "name": "Cost Back Link",
            "description": "Emits the 0-8 neighbour-direction raster encoding, for every cell, the next step along the least-cost route back to the nearest source, plus the accumulated-cost surface (ArcGIS Cost Back Link and Path Back Link). cost_distance, cost_pathway and cost_allocation all compute this internally and discard it, so retracing N destinations currently costs N full cost solves instead of one accumulation pass plus N cheap walks.",
            "params": {
              "source": {
                "label": "Source",
                "description": "Source cells: a raster (any non-zero, non-no-data cell is a source) or a point/multipoint vector layer."
              },
              "cost": {
                "label": "Cost",
                "description": "Cost-per-unit-distance raster. Optional when 'surface' is given (then cost defaults to 1 everywhere, giving pure surface distance)."
              },
              "surface": {
                "label": "Surface",
                "description": "Optional elevation raster enabling the Path Back Link variant: horizontal spacing is replaced by true surface distance sqrt(dxy^2 + dz^2)."
              },
              "output": {
                "label": "Output",
                "description": "Output backlink raster (0 = source, 1-8 = direction toward the source, 1 = east counter-clockwise). If omitted, stored in memory."
              },
              "out_distance": {
                "label": "Out Distance",
                "description": "Accumulated-cost raster. Always produced; falls back to an in-memory handle when no path is given."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Optional accumulation cutoff: cells costing more than this are left unreachable."
              }
            }
          },
          "cost_connectivity": {
            "name": "Cost Connectivity",
            "description": "Least-cost network connecting multiple sites over a cost surface (like ArcGIS Cost Connectivity / Optimal Region Connections): multi-source Dijkstra allocation, pairwise least-cost paths between adjacent regions, and their minimum spanning tree — the least-cost network the bundled single-source cost_distance and path_distance can't build.",
            "params": {
              "sources": {
                "label": "Sources",
                "description": "Point layer of sites/regions to connect."
              },
              "cost": {
                "label": "Cost",
                "description": "Cost/friction raster (per-cell traversal cost; no-data cells are barriers)."
              },
              "output": {
                "label": "Output",
                "description": "Output polyline layer of least-cost paths. If omitted, stored in memory."
              },
              "connections": {
                "label": "Connections",
                "description": "'mst' (minimum spanning tree connecting all sites; default) or 'all_neighbors' (every adjacent-region path)."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Optional field to label sources (default: 1-based index)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the cost raster (default 1)."
              }
            }
          },
          "count_overlapping_features": {
            "name": "Count Overlapping Features",
            "description": "Flatten overlapping polygons into disjoint regions, each attributed with the number (and optionally the ids) of input features covering it, like ArcGIS Count Overlapping Features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer (features may overlap)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path (driver from extension) with a 'count' field. If omitted, stored in memory."
              },
              "min_count": {
                "label": "Min Count",
                "description": "Keep only regions covered by at least this many features (default 1; use 2 for overlaps only)."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Optional field identifying each input feature (used in the ids column / report). Default: the feature index."
              },
              "report_ids": {
                "label": "Report Ids",
                "description": "Optional CSV path for a region_id,feature_id join table (one row per covering feature)."
              }
            }
          },
          "create_accuracy_assessment_points": {
            "name": "Create Accuracy Assessment Points",
            "description": "Generates randomly distributed reference points stratified by the classes of a classified raster or polygon layer, prefilled with the map class and ready for ground-truth labelling (ArcGIS Create Accuracy Assessment Points). classification_accuracy_assessment consumes such points but nothing produced them, and create_spatial_sampling_locations stratifies by polygon feature or field rather than by raster class and has no equalized allocation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Classified raster, or a classified polygon layer with 'class_field'."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Class attribute, required when 'input' is a vector layer. Ignored for raster input, which uses the cell value."
              },
              "num_points": {
                "label": "Num Points",
                "description": "Total number of reference points (default 500)."
              },
              "sampling_strategy": {
                "label": "Sampling Strategy",
                "description": "One of 'stratified_random' (default, allocate proportional to class area), 'equalized_stratified' (equal count per class), 'random' (ignore class)."
              },
              "min_points_per_class": {
                "label": "Min Points Per Class",
                "description": "Floor applied under 'stratified_random' so rare classes are not dropped (default 1)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of a raster input (default 1)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic RNG (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Output point layer with CLASSVALUE (map class), GrndTruth (-1 until collected) and Stratum. If omitted, stored in memory."
              }
            }
          },
          "create_cartographic_partitions": {
            "name": "Create Cartographic Partitions",
            "description": "Produce adaptive, non-overlapping partition polygons that each hold roughly a target feature count (denser where data clusters) so large generalization / masking jobs can be tiled coverage-safely — a pure-Rust counterpart of ArcGIS Create Cartographic Partitions.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry). Each feature is reduced to a representative point and assigned to one partition."
              },
              "feature_count": {
                "label": "Feature Count",
                "description": "Target maximum number of features per partition. A cell is split while it still holds more than this many features. Default 1000."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector of partitions (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "create_overpass": {
            "name": "Create Overpass",
            "description": "Build knockout mask polygons (and optional wing-tick decoration lines) where an 'above' line crosses a 'below' line, so the lower line is masked at the crossing.",
            "params": {
              "above": {
                "label": "Above",
                "description": "Line vector of features that pass OVER the crossing (the mask is oriented along these). Format auto-detected, or in-memory handle."
              },
              "below": {
                "label": "Below",
                "description": "Line vector of features masked UNDER the crossing (the lines to be knocked out). Format auto-detected, or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the mask polygons (driver from its extension). If omitted, stored in memory."
              },
              "output_decoration": {
                "label": "Output Decoration",
                "description": "Optional output path for the wing-tick decoration lines. If omitted, stored in memory (still returned as 'output_decoration')."
              },
              "margin_along": {
                "label": "Margin Along",
                "description": "Half-length of each mask along the above line, in CRS units (mask length is 2x this). Default 1.0."
              },
              "margin_across": {
                "label": "Margin Across",
                "description": "Half-width of each mask across the above line, in CRS units (mask width is 2x this). Default 1.0."
              },
              "wing_type": {
                "label": "Wing Type",
                "description": "Decoration style: 'none', 'perpendicular' (default; a tick across each mask end) or 'parallel' (casing lines along each side)."
              }
            }
          },
          "create_routes": {
            "name": "Create Routes",
            "description": "Dissolve line features by a route-identifier field, order their segments into a single polyline per route, and assign linear measures (m-values) from geometric length or from/to measure fields.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector file path, format auto-detected (or in-memory handle)."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Attribute that identifies each route; input lines are grouped by it, one output route per distinct value."
              },
              "output": {
                "label": "Output",
                "description": "Optional output route vector path (driver from its extension). If omitted, stored in memory."
              },
              "measure_source": {
                "label": "Measure Source",
                "description": "How measures are assigned: LENGTH (0..geometric length), ONE_FIELD (start from a field, end = start + length), or TWO_FIELDS (start/end from fields, interpolated). Default LENGTH."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Numeric field giving each route's start measure (used by ONE_FIELD and TWO_FIELDS). Read from the route's first segment."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Numeric field giving each route's end measure (used by TWO_FIELDS). Read from the route's first segment."
              },
              "measure_factor": {
                "label": "Measure Factor",
                "description": "Multiplier applied to the natural (length-based) measure, e.g. 0.001 to turn metres into kilometres. Default 1.0."
              },
              "measure_offset": {
                "label": "Measure Offset",
                "description": "Value added to every measure along the route (shifts the whole route's m-values). Default 0.0."
              },
              "ignore_gaps": {
                "label": "Ignore Gaps",
                "description": "For LENGTH/ONE_FIELD, exclude the straight jumps between disjoint segments from the accumulated measure so gaps do not inflate distances. Default false."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Endpoints within this distance (CRS units) are treated as coincident when stitching segments. Default 1e-6."
              }
            }
          },
          "create_spatial_sampling_locations": {
            "name": "Create Spatial Sampling Locations",
            "description": "Generate sample points over a polygon study area by simple-random, stratified, systematic (square/hexagon/triangle), or cluster design, with seeded reproducible randomness.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Study-area polygon vector file path (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output point vector path (driver from its extension). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'simple_random' (default), 'stratified', 'systematic', or 'cluster'."
              },
              "num_samples": {
                "label": "Num Samples",
                "description": "Total number of sample points for simple_random, stratified, and cluster. Default 100."
              },
              "strata_field": {
                "label": "Strata Field",
                "description": "For stratified: group input features into strata by this attribute. If omitted, each input feature is its own stratum."
              },
              "allocation": {
                "label": "Allocation",
                "description": "For stratified: 'proportional' to stratum area (default), 'equal' per stratum, or 'population_field' proportional to a field total."
              },
              "population_field": {
                "label": "Population Field",
                "description": "For allocation=population_field: the numeric field whose per-stratum total drives allocation."
              },
              "bin_shape": {
                "label": "Bin Shape",
                "description": "For systematic: 'square' (default), 'hexagon', or 'triangle' lattice."
              },
              "bin_size": {
                "label": "Bin Size",
                "description": "Spacing (CRS units) for systematic lattices and cluster bins. Required for those methods."
              },
              "num_clusters": {
                "label": "Num Clusters",
                "description": "For cluster: how many bins to randomly select. Default 10."
              },
              "min_distance": {
                "label": "Min Distance",
                "description": "Minimum spacing between simple_random / stratified / cluster points (CRS units). Default 0 (no constraint)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic RNG (default 1)."
              }
            }
          },
          "create_spatially_balanced_points": {
            "name": "Create Spatially Balanced Points",
            "description": "Generate spatially well-spread (quasi-random Halton) sample points within a constraint polygon, optionally weighted by an inclusion-probability raster, each tagged with a balanced sample order, like ArcGIS Create Spatially Balanced Points.",
            "params": {
              "constraint": {
                "label": "Constraint",
                "description": "Constraint polygon layer; points are generated inside these polygons."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, stored in memory."
              },
              "num_points": {
                "label": "Num Points",
                "description": "Number of sample points to generate."
              },
              "probability": {
                "label": "Probability",
                "description": "Optional inclusion-probability raster; higher cell values are more likely to be sampled (normalized by its max)."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for reproducible sampling (default 1)."
              }
            }
          },
          "create_underpass": {
            "name": "Create Underpass",
            "description": "At line crossings, builds mask polygons oriented along the upper feature and cuts a matching gap out of the lower feature so it reads as passing beneath (ArcGIS Create Underpass). Sibling of the shipped create_overpass, which masks the lower line so the upper one reads continuous; an underpass instead needs the decorative break, which is what distinguishes a tunnel portal from a bridge. Emits both the masks and the trimmed lower lines.",
            "params": {
              "above": {
                "label": "Above",
                "description": "Line vector of features that pass OVER the crossing (masks are oriented along these). Format auto-detected, or in-memory handle."
              },
              "below": {
                "label": "Below",
                "description": "Line vector of features that pass UNDER the crossing (the lines that get the gap). Format auto-detected, or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the underpass mask polygons. If omitted, stored in memory."
              },
              "output_lines": {
                "label": "Output Lines",
                "description": "Optional output path for the below layer with underpass gaps cut out. If omitted, stored in memory (still returned as 'output_lines')."
              },
              "margin_along": {
                "label": "Margin Along",
                "description": "Half-length of each mask measured ALONG the above line, in CRS units; the mask spans 2x this in that direction. Default 1.0."
              },
              "margin_across": {
                "label": "Margin Across",
                "description": "Half-width of each mask ACROSS the above line, in CRS units. For a perpendicular crossing this is what bounds the gap cut into the below line, so the removed length is 2x this. Default 1.0."
              },
              "min_angle": {
                "label": "Min Angle",
                "description": "Skip crossings where the two lines meet at less than this angle in degrees, since a near-parallel mask is unstable. Default 15."
              }
            }
          },
          "cul_de_sac_masks": {
            "name": "Cul-De-Sac Masks",
            "description": "Generate scale-aware knockout mask polygons at cul-de-sac bulbs in a road network, like ArcGIS Cul-De-Sac Masks.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Road centerline layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output mask polygon path. If omitted, stored in memory."
              },
              "reference_scale": {
                "label": "Reference Scale",
                "description": "Map scale denominator the mask is sized for (e.g. 24000 for 1:24,000)."
              },
              "symbol_width": {
                "label": "Symbol Width",
                "description": "Road casing width in page units (see 'page_unit') at the reference scale."
              },
              "margin": {
                "label": "Margin",
                "description": "Extra margin around the symbol, in page units (default 0)."
              },
              "page_unit": {
                "label": "Page Unit",
                "description": "Unit of 'symbol_width' and 'margin': points (default, 1/72 inch), mm, or inches."
              },
              "map_units_per_meter": {
                "label": "Map Units Per Meter",
                "description": "CRS units per metre (default 1, correct for metre-based projected CRSs). For a layer in degrees use about 0.000008983."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Coordinate snapping tolerance for joining line endpoints into network nodes (default 0.001 map units)."
              },
              "attributes": {
                "label": "Attributes",
                "description": "ids_only (default) | all — whether to carry the source feature's attributes onto the mask."
              }
            }
          },
          "cut_fill": {
            "name": "Cut Fill",
            "description": "Volumetric change between two DEM surfaces (before/after) or a surface and a reference plane: signed elevation-change raster plus cut, fill, and net volumes, with optional per-region volume labelling.",
            "params": {
              "input": {
                "label": "Input",
                "description": "The 'before' (or the single surface for plane mode) raster file path."
              },
              "after": {
                "label": "After",
                "description": "The 'after' raster (two-surface mode). Must share the grid of 'input'. Provide this or 'plane'."
              },
              "plane": {
                "label": "Plane",
                "description": "Reference plane elevation (surface-volume mode): change is measured as input minus this value. Provide this or 'after'."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path for the signed elevation change (Δz). If omitted, stored in memory."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from the input raster(s). Default 1."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Cells with |Δz| at or below this value (CRS z-units) count as unchanged. Default 0."
              },
              "region_output": {
                "label": "Region Output",
                "description": "Optional raster path for contiguous cut/fill region labels (region ids >= 1; unchanged cells are nodata)."
              },
              "csv_output": {
                "label": "Csv Output",
                "description": "Optional CSV path for the per-region volume table (region_id, type, cell_count, volume)."
              }
            }
          },
          "darcy_flow": {
            "name": "Darcy Flow",
            "description": "Steady-state groundwater Darcy velocity field from head, transmissivity, and porosity rasters — a flow-magnitude (Darcy velocity) raster and a down-gradient flow-direction raster (v = -(T/n)·∇head), with optional advective particle tracking (RK2) from seed points into streamline polylines — like ArcGIS Darcy Flow / Particle Track.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Groundwater head (water-table elevation) raster. Cell size is taken from this raster."
              },
              "transmissivity": {
                "label": "Transmissivity",
                "description": "Transmissivity raster (co-registered to the head raster)."
              },
              "porosity": {
                "label": "Porosity",
                "description": "Effective-porosity raster (co-registered to the head raster; values must be > 0)."
              },
              "output": {
                "label": "Output",
                "description": "Output Darcy-velocity magnitude raster path. If omitted, stored in memory."
              },
              "direction": {
                "label": "Direction",
                "description": "Optional output flow-direction raster path (azimuth degrees, from north clockwise, down-gradient). If omitted, stored in memory."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from each input raster (default 1)."
              },
              "seeds": {
                "label": "Seeds",
                "description": "Optional point vector of particle seeds. When given, streamlines are traced from each seed."
              },
              "streamlines": {
                "label": "Streamlines",
                "description": "Optional output line vector path for traced particle streamlines (requires 'seeds')."
              },
              "step": {
                "label": "Step",
                "description": "Particle-tracking step length in CRS units (default: the head cell size)."
              },
              "max_steps": {
                "label": "Max Steps",
                "description": "Maximum integration steps per particle (default 1000)."
              }
            }
          },
          "delineate_built_up_areas": {
            "name": "Delineate Built-Up Areas",
            "description": "Generalize dense building footprints into smooth settlement / urban-extent polygons by grouping nearby buildings (morphological closing), with minimum building-count and area filters.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input building-footprint polygon layer, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "grouping_distance": {
                "label": "Grouping Distance",
                "description": "Buildings whose footprints lie within this distance (CRS units) are grouped into one built-up area. Sets the morphological-closing radius to half this value."
              },
              "min_building_count": {
                "label": "Min Building Count",
                "description": "Drop built-up areas that contain fewer than this many buildings (default 1 — keep every group)."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Drop built-up areas whose area (CRS units squared) is below this value, and fill interior holes smaller than it. Default: keep all."
              },
              "simplify_tolerance": {
                "label": "Simplify Tolerance",
                "description": "Douglas–Peucker tolerance (CRS units) applied to the built-up boundary to thin the vertex-dense rounded buffer. Default 0 (no simplification)."
              }
            }
          },
          "delineate_depressions": {
            "name": "Delineate Depressions",
            "description": "Delineate nested depressions from a sink raster using the level-set method (lidar slicing.py).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input sink raster (e.g. the output of extract_sinks)."
              },
              "output": {
                "label": "Output",
                "description": "Optional depression-id raster path. If omitted, stored in memory."
              },
              "level_output": {
                "label": "Level Output",
                "description": "Optional output path for the depression-level raster."
              },
              "csv_output": {
                "label": "Csv Output",
                "description": "Optional output path for the depression attribute CSV."
              },
              "vector_output": {
                "label": "Vector Output",
                "description": "Optional output path for depression polygons as GeoJSON (attributes joined)."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum number of pixels for a depression (default 10)."
              },
              "min_depth": {
                "label": "Min Depth",
                "description": "Minimum depression depth (accepted for compatibility; unused, matching lidar)."
              },
              "interval": {
                "label": "Interval",
                "description": "Slicing interval for the level-set method (default 0.3)."
              }
            }
          },
          "delineate_mounts": {
            "name": "Delineate Mounts",
            "description": "Delineate the nested hierarchy of elevated features (mounts) in a DEM (lidar mounts.py).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional mount-id raster path. If omitted, stored in memory."
              },
              "level_output": {
                "label": "Level Output",
                "description": "Optional output path for the mount-level raster."
              },
              "csv_output": {
                "label": "Csv Output",
                "description": "Optional output path for the mount attribute CSV."
              },
              "vector_output": {
                "label": "Vector Output",
                "description": "Optional output path for mount polygons as GeoJSON (attributes joined)."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum number of pixels for a mount (default 10)."
              },
              "min_height": {
                "label": "Min Height",
                "description": "Minimum mount height (accepted for compatibility; unused, matching lidar)."
              },
              "interval": {
                "label": "Interval",
                "description": "Slicing interval for the level-set method (default 0.3)."
              },
              "delta": {
                "label": "Delta",
                "description": "Base value added when flipping the DEM (default 100)."
              }
            }
          },
          "dem_filter": {
            "name": "DEM Filter",
            "description": "Smooth a DEM with a mean, median, or Gaussian filter (lidar filtering.py).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "filter": {
                "label": "Filter",
                "description": "Filter type: 'mean', 'median', or 'gaussian' (default 'mean')."
              },
              "kernel_size": {
                "label": "Kernel Size",
                "description": "Window size in pixels for mean/median filters (default 3)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Standard deviation for the Gaussian filter (default 1.0)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to filter (default 1)."
              }
            }
          },
          "dendrogram": {
            "name": "Dendrogram",
            "description": "Build a hierarchical merge tree over class signatures to show how separable the classes are, like ArcGIS Dendrogram.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Clustered feature layer carrying a class field and the numeric fields defining the feature space."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Field holding the class / cluster identifier."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated numeric fields defining the feature space."
              },
              "output": {
                "label": "Output",
                "description": "Optional output merge table path. If omitted, stored in memory."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance between signatures: 'variance' (default; normalized by within-class spread) or 'mean_only'."
              },
              "standardize": {
                "label": "Standardize",
                "description": "Z-standardize each field before computing distances so large-range fields do not dominate (default true)."
              },
              "output_text": {
                "label": "Output Text",
                "description": "Optional path for a plain-text indented rendering of the tree."
              }
            }
          },
          "densify_sampling_network": {
            "name": "Densify Sampling Network",
            "description": "Propose new sample locations at the cells of highest kriging prediction (standard-error) surface, honoring a minimum-spacing inhibition distance, like ArcGIS Densify Sampling Network.",
            "params": {
              "prediction_error": {
                "label": "Prediction Error",
                "description": "Input prediction standard-error raster (e.g. a kriging variance/error surface). New samples target its highest-error cells."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, stored in memory."
              },
              "count": {
                "label": "Count",
                "description": "Number of new sample locations to propose."
              },
              "inhibition_distance": {
                "label": "Inhibition Distance",
                "description": "Minimum spacing between proposed samples in map units (default 0 = no inhibition; just the highest-error cells)."
              },
              "mask": {
                "label": "Mask",
                "description": "Optional polygon layer; only cells whose center falls inside are eligible candidates."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the prediction-error raster to read (default 1)."
              }
            }
          },
          "detect_bright_ocean_objects": {
            "name": "Detect Bright Ocean Objects",
            "description": "Finds vessels and other bright point targets on water in SAR imagery with a two-parameter CFAR detector, and emits them as oriented bounding boxes with length, width, heading and peak backscatter (ArcGIS Detect Bright Ocean Objects). Neither registry has a local-clutter detector: a global threshold cannot work because sea clutter brightens with wind and incidence angle, matched_filter_target_detection is a spectral optical detector, and detect_image_anomalies uses a global rather than a sliding-window model.",
            "params": {
              "input": {
                "label": "Input",
                "description": "SAR backscatter raster."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer of detected objects. If omitted, stored in memory."
              },
              "geometry_type": {
                "label": "Geometry Type",
                "description": "'bounding_box' (default) for the oriented minimum rectangle, or 'perimeter' for the traced detection outline."
              },
              "threshold": {
                "label": "Threshold",
                "description": "CFAR detection threshold in background standard deviations (default 5.0)."
              },
              "guard_size": {
                "label": "Guard Size",
                "description": "Half-width in cells of the guard band excluded from the background estimate (default 3). Must be smaller than background_size."
              },
              "background_size": {
                "label": "Background Size",
                "description": "Half-width in cells of the background ring (default 12)."
              },
              "mask_features": {
                "label": "Mask Features",
                "description": "Polygon layer masking land or water. Cells excluded by the mask are neither tested nor used as background."
              },
              "mask_type": {
                "label": "Mask Type",
                "description": "'land_polygon' (default; analyse outside the polygons) or 'water_polygon' (analyse inside them)."
              },
              "min_object_length": {
                "label": "Min Object Length",
                "description": "Discard objects shorter than this, in map units."
              },
              "max_object_length": {
                "label": "Max Object Length",
                "description": "Discard objects longer than this, in map units."
              },
              "min_object_width": {
                "label": "Min Object Width",
                "description": "Discard objects narrower than this, in map units."
              },
              "max_object_width": {
                "label": "Max Object Width",
                "description": "Discard objects wider than this, in map units."
              },
              "min_cells": {
                "label": "Min Cells",
                "description": "Discard detections smaller than this many cells (default 2), which suppresses isolated speckle spikes."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'intensity' (default), 'dn', 'amplitude', or 'db'. Detection runs on linear power, where the clutter statistics are meaningful."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to search (default 1)."
              }
            }
          },
          "detect_dark_ocean_areas": {
            "name": "Detect Dark Ocean Areas",
            "description": "Finds anomalously dark patches on water in SAR imagery — oil slicks, natural seeps, algal films, low-wind zones — as regions sitting a set number of standard deviations below the local sea background, reported with their dB contrast (ArcGIS Detect Dark Ocean Areas). The complement of detect_bright_ocean_objects, and distinct from extract_water_sar: an all-water scene is unimodal, so an Otsu split would simply bisect the sea clutter and report half the ocean as a slick.",
            "params": {
              "input": {
                "label": "Input",
                "description": "SAR backscatter raster over water."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer of dark areas. If omitted, stored in memory."
              },
              "output_raster": {
                "label": "Output Raster",
                "description": "Output binary mask (1 dark, 0 background). Always produced; stored in memory when no path is given."
              },
              "method": {
                "label": "Method",
                "description": "'statistical' (default; a set number of standard deviations below the background mean), 'otsu', or 'fixed'."
              },
              "threshold": {
                "label": "Threshold",
                "description": "For 'statistical', how many standard deviations below the mean counts as dark (default 2.0). For 'fixed', the dB level at or below which a cell is dark."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Discard dark areas smaller than this area in map units squared. Slicks are large and contiguous; speckle is not."
              },
              "min_contrast_db": {
                "label": "Min Contrast Db",
                "description": "Discard regions sitting less than this many dB below the background. A mineral-oil slick is typically more than 5 dB down."
              },
              "mask_features": {
                "label": "Mask Features",
                "description": "Polygon layer restricting the analysis to water. Land is bright and would inflate the background estimate."
              },
              "mask_type": {
                "label": "Mask Type",
                "description": "'land_polygon' (default; analyse outside the polygons) or 'water_polygon' (analyse inside them)."
              },
              "histogram_bins": {
                "label": "Histogram Bins",
                "description": "Bins used for the Otsu histogram (default 256)."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'intensity' (default), 'dn', 'amplitude', or 'db'."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to search (default 1)."
              }
            }
          },
          "detect_feature_changes": {
            "name": "Detect Feature Changes",
            "description": "Match two line datasets by Hausdorff distance and classify each as unchanged / spatial / attribute / spatial_attribute / new, plus deleted base features — the vector change-detection and conflation entry point, like ArcGIS Detect Feature Changes.",
            "params": {
              "update": {
                "label": "Update",
                "description": "Updated line vector layer (the new state)."
              },
              "base": {
                "label": "Base",
                "description": "Base line vector layer (the previous state) to compare against."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector (update features classified, plus deleted base features). If omitted, stored in memory."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Maximum distance (CRS units) to match an update line to a base line. Required."
              },
              "spatial_tolerance": {
                "label": "Spatial Tolerance",
                "description": "Hausdorff distance below which a matched geometry counts as unchanged (CRS units). Default: search_distance / 5."
              },
              "compare_fields": {
                "label": "Compare Fields",
                "description": "Comma-separated field(s) present on both layers to compare for attribute changes."
              }
            }
          },
          "detect_graphic_conflict": {
            "name": "Detect Graphic Conflict",
            "description": "Find where the symbolized (drawn-width) extents of two feature layers — or one layer against itself — overlap or crowd within a minimum separation, emitting a conflict polygon per conflicting pair tagged with both source feature ids and the overlap area, like ArcGIS Detect Graphic Conflict.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points, lines, or polygons)."
              },
              "conflict": {
                "label": "Conflict",
                "description": "Second vector layer to check 'input' against. Omit to check 'input' against itself."
              },
              "symbol_width": {
                "label": "Symbol Width",
                "description": "Symbolized width/diameter of 'input' features, in map units."
              },
              "conflict_symbol_width": {
                "label": "Conflict Symbol Width",
                "description": "Symbolized width/diameter of 'conflict' features, in map units. Default: same as 'symbol_width'. Ignored when 'conflict' is omitted."
              },
              "conflict_distance": {
                "label": "Conflict Distance",
                "description": "Extra required separation beyond touching, in map units. Default 0."
              },
              "line_connection_allowance": {
                "label": "Line Connection Allowance",
                "description": "Radius around a shared endpoint of two same-layer line features within which their overlap is treated as normal end-to-end connectivity, not a conflict. Default 0 (no allowance)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path with 'input_fid', 'conflict_fid', and 'overlap_area' fields. If omitted, stored in memory."
              }
            }
          },
          "detect_image_anomalies": {
            "name": "Detect Image Anomalies",
            "description": "Score every pixel of a multiband image by its Mahalanobis distance to the scene (or a moving-window) band statistics — the Reed–Xiaoli (RX) anomaly detector — with an optional percentile threshold mask, like ArcGIS Detect Image Anomalies.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input multiband raster (2+ bands)."
              },
              "output": {
                "label": "Output",
                "description": "Output anomaly-score raster (F32). If omitted, stored in memory."
              },
              "mode": {
                "label": "Mode",
                "description": "'global' (whole-scene statistics, default) or 'local' (moving-window statistics)."
              },
              "window": {
                "label": "Window",
                "description": "Odd window size (pixels) for local mode (default 15)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Optional percentile (0-100) of the score distribution above which a binary anomaly mask is written."
              },
              "mask_output": {
                "label": "Mask Output",
                "description": "Output path for the binary anomaly mask (requires 'threshold'). If omitted with a threshold, stored in memory."
              }
            }
          },
          "detect_incidents": {
            "name": "Detect Incidents",
            "description": "Flag where a condition starts and ends along each track: group timestamped points by track, sort by time, evaluate a start (and optional end) comparison over a numeric attribute, and emit incident episodes as flagged points or per-episode line segments with ids and durations — like ArcGIS Detect Incidents.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of timestamped observations."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying each track/mover (e.g. vehicle or animal id)."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: numeric seconds or an ISO-8601 timestamp."
              },
              "start_condition": {
                "label": "Start Condition",
                "description": "Condition that opens an incident, e.g. 'speed > 30'. Grammar: '<field> <op> <number>' with op one of > >= < <= == != , optionally two clauses joined by AND."
              },
              "end_condition": {
                "label": "End Condition",
                "description": "Optional condition that closes an incident (same grammar). If omitted, an incident ends when the start condition stops holding."
              },
              "mode": {
                "label": "Mode",
                "description": "Output mode: 'points' (default, every point copied through with incident fields) or 'segments' (one polyline per incident)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "dice": {
            "name": "Dice",
            "description": "Split polygons or polylines with more than a vertex limit into a grid of smaller pieces (like ArcGIS Dice), so downstream overlay and tiling stay fast — an adaptive quadtree intersects the geometry with each quadrant until every piece is under the limit.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon or polyline layer."
              },
              "output": {
                "label": "Output",
                "description": "Output layer of diced pieces. If omitted, stored in memory."
              },
              "vertex_limit": {
                "label": "Vertex Limit",
                "description": "Maximum vertices per output feature (default 10000). Features at or under this pass through unchanged."
              }
            }
          },
          "difference_3d": {
            "name": "Difference 3D",
            "description": "Subtracts a set of 3D solids from another set, reporting the volume removed from and remaining in each minuend feature (ArcGIS Difference 3D). union_3d was the only 3D overlay in either registry and erase is polygon-only 2D, so there was no way to compute excavated volume remaining after a cut body or plume volume outside an exclusion envelope. Minuend volumes are exact; the removed volume is estimated by voxel occupancy at a reported resolution.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Minuend closed 3D solids (triangle-mesh MultiPolygons with Z)."
              },
              "subtract": {
                "label": "Subtract",
                "description": "Subtrahend closed 3D solids to remove from each minuend."
              },
              "output": {
                "label": "Output",
                "description": "Output table, one row per minuend. If omitted, stored in memory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Voxel cells along the longest axis of each minuend's bounding box (default 64). Higher is more accurate and slower."
              },
              "keep_geometry": {
                "label": "Keep Geometry",
                "description": "Carry each minuend's original geometry onto its output row (default false: an attribute-only table). The geometry is the UNCUT minuend — no exact merged mesh is produced."
              }
            }
          },
          "diffusion_interpolation_with_barriers": {
            "name": "Diffusion Interpolation With Barriers",
            "description": "Interpolate scattered point measurements to a raster by simulating heat diffusion that flows AROUND absolute (no-flux) barriers rather than through them (like ArcGIS Diffusion Interpolation With Barriers). Samples are pinned as fixed cells; every other cell relaxes toward the mean of its non-barrier neighbours over `number_iterations` Jacobi sweeps of the Laplace/heat equation, so influence decays with diffusion distance. Distinct from the shortest-non-barrier-path kernel of interpolate_with_barriers and from the raster smoother anisotropic_diffusion_filter.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of sample measurements (Point / MultiPoint)."
              },
              "z_field": {
                "label": "Z Field",
                "description": "Numeric field on the points holding the value to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Output interpolated raster (GeoTIFF). If omitted, stored in memory."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size / resolution in map units (metres for a geographic CRS, CRS units otherwise). Required."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier vector layer (polylines or polygons) that blocks diffusion. Polylines block the cells their segments cross; polygons block the cells whose centre falls inside. Omit for a barrier-free control."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Per-iteration relaxation weight lambda in (0, 0.25] (default 0.2): each free cell moves this fraction of the way toward its neighbour average per sweep."
              },
              "number_iterations": {
                "label": "Number Iterations",
                "description": "Number of Jacobi relaxation sweeps of the heat equation (default 100). More iterations spread influence farther."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field giving a per-point weight (default 1), used only to average coincident samples that fall in the same output cell."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Override the input CRS EPSG code (e.g. when the layer is unlabeled). 4326 triggers the local metre projection."
              }
            }
          },
          "dimension_reduction": {
            "name": "Dimension Reduction",
            "description": "Principal-component analysis over numeric feature attributes (like ArcGIS Dimension Reduction): standardize selected fields, eigen-decompose the correlation/covariance matrix with a hand-rolled Jacobi rotation, and write PC1..PCk component scores back to the features plus an eigenvalue/variance/loadings report — the vector-attribute counterpart of the bundled band-only principal_component_analysis.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (or table) with numeric attribute fields."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated list of at least two numeric fields to reduce."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer with PC score fields appended. If omitted, stored in memory."
              },
              "table": {
                "label": "Table",
                "description": "Optional CSV path for the components report (eigenvalue, variance explained, cumulative, per-variable loadings). Always returned in the result."
              },
              "num_components": {
                "label": "Num Components",
                "description": "Number of leading components to keep. Default: enough to reach 'min_variance', else all fields."
              },
              "min_variance": {
                "label": "Min Variance",
                "description": "Keep the fewest components whose cumulative variance explained reaches this fraction (0-1). Ignored if 'num_components' is set."
              },
              "standardize": {
                "label": "Standardize",
                "description": "Standardize each field (z-score) before PCA so scales are comparable — analyse the correlation matrix. Default true; false analyses the covariance matrix."
              }
            }
          },
          "dimensional_moving_statistics": {
            "name": "Dimensional Moving Statistics",
            "description": "Runs a moving window along a raster cube's dimension, writing one smoothed slice per input slice — the in-place rolling mean or median that turns a noisy satellite time series into a usable one (ArcGIS Dimensional Moving Statistics). Round 17's time_series_smoothing is vector-only, the bundled focal filters move a window spatially within a single slice, and aggregate_multidimensional_raster shortens the cube into bins. Includes a circular mean, without which averaging aspect or phase across the wrap point is meaningless.",
            "params": {
              "input": {
                "label": "Input",
                "description": "One multiband raster (each band is a slice) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband raster with one band per input slice. If omitted, stored in memory."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Name of the dimension, used only in the report (default 'slice')."
              },
              "backward_window": {
                "label": "Backward Window",
                "description": "Slices before the current one to include (default 1)."
              },
              "forward_window": {
                "label": "Forward Window",
                "description": "Slices after the current one to include (default 1)."
              },
              "statistic": {
                "label": "Statistic",
                "description": "'mean' (default), 'circular_mean', 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'std', or 'sum'."
              },
              "percentile_value": {
                "label": "Percentile Value",
                "description": "Percentile in [0, 100] for statistic 'percentile' (default 50)."
              },
              "period": {
                "label": "Period",
                "description": "Wrap period for 'circular_mean' (default 360, i.e. degrees; use 6.283185307179586 for radians)."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum non-no-data observations in the window before a value is written (default 1)."
              },
              "nodata_handling": {
                "label": "Nodata Handling",
                "description": "'data' (default; skip no-data and compute from the rest), 'nodata' (any no-data in the window makes the output no-data), or 'fill_nodata' (also write a value where the centre slice itself is no-data)."
              }
            }
          },
          "directional_distribution": {
            "name": "Directional Distribution",
            "description": "Descriptive geographic distribution statistics: mean center, median center, central feature, standard distance (circle), and the standard deviational ellipse — with optional weighting and grouping.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points preferred; other geometries use their vertex-mean representative point)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "Which measure to compute: 'mean_center', 'median_center', 'central_feature', 'standard_distance', or 'standard_deviational_ellipse'."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field to weight each feature (e.g. population). Default: every feature weighted 1."
              },
              "case_field": {
                "label": "Case Field",
                "description": "Optional field to group features by; one output feature is produced per distinct value."
              },
              "n_std": {
                "label": "N Std",
                "description": "Standard-deviation multiplier (1, 2, or 3) for the standard-distance circle and the deviational ellipse. Default 1."
              }
            }
          },
          "directional_trend": {
            "name": "Directional Trend",
            "description": "Project sample points onto a chosen azimuth and fit a 1st-3rd-order polynomial of value-vs-distance to detect a global/anisotropic trend before variography (like ArcGIS's Directional Trend). 'determine' sweeps azimuths for the direction of maximum explained variance.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points preferred; other geometries use their vertex-mean representative point)."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to analyze the trend of."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "Compass bearing in degrees (0 = north, clockwise) to project onto, or 'determine' (default) to sweep 0-179° for the bearing of maximum explained variance."
              },
              "order": {
                "label": "Order",
                "description": "Polynomial order 1, 2, or 3 (default 2)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory. Points carry proj_dist, value, fitted, and residual."
              }
            }
          },
          "directional_variogram": {
            "name": "Directional Variogram Analysis",
            "description": "Computes variograms in multiple directions to detect spatial anisotropy. Reveals directional continuity patterns essential for realistic kriging.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point layer with measurement values"
              },
              "field": {
                "label": "Field",
                "description": "Field containing measurement values"
              },
              "directions": {
                "label": "Directions",
                "description": "Comma-separated list of azimuths (0-180°) to analyze"
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Direction tolerance in degrees (default 22.5)"
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Maximum lag distance to compute (default 1000)"
              },
              "bin_size": {
                "label": "Bin Size",
                "description": "Size of lag bins (default 50)"
              },
              "output_json": {
                "label": "Output Json",
                "description": "Output file path for directional variogram results"
              },
              "output_html": {
                "label": "Output Html",
                "description": "Optional output path for HTML rose diagram visualization"
              }
            }
          },
          "disperse_markers": {
            "name": "Disperse Markers",
            "description": "Spread coincident or overlapping point symbols apart to a minimum center-to-center spacing (expanded/ring/cross/square patterns) so stacked points stay individually visible, like ArcGIS Disperse Markers.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, stored in memory."
              },
              "min_spacing": {
                "label": "Min Spacing",
                "description": "Minimum center-to-center spacing to enforce between clustered points, in map units."
              },
              "pattern": {
                "label": "Pattern",
                "description": "'expanded' (default, concentric rings + local repulsion), 'ring' (single circle), 'cross' (four arms), or 'square' (grid)."
              },
              "seed": {
                "label": "Seed",
                "description": "Integer seed for deterministic tie-breaking when members start out exactly coincident (default 0)."
              }
            }
          },
          "dissolve_route_events": {
            "name": "Dissolve Route Events",
            "description": "Merge route events that touch or overlap along the same route into single measure spans, either only when the dissolve fields match ('dissolve') or by concatenating differing values ('concatenate'). Like ArcGIS Dissolve Route Events.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input event table (line events with from/to measures)."
              },
              "output": {
                "label": "Output",
                "description": "Output event table path. If omitted, stored in memory."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Field holding the route identifier."
              },
              "from_measure_field": {
                "label": "From Measure Field",
                "description": "Field holding each event's from-measure."
              },
              "to_measure_field": {
                "label": "To Measure Field",
                "description": "Field holding each event's to-measure. For point events, use the same field as 'from_measure_field'."
              },
              "dissolve_fields": {
                "label": "Dissolve Fields",
                "description": "Comma/semicolon-separated field name(s) that must agree for two spans to merge (or whose values are concatenated)."
              },
              "mode": {
                "label": "Mode",
                "description": "'dissolve' (default) or 'concatenate'."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Measure gap below which two spans count as adjacent (default 0)."
              },
              "separator": {
                "label": "Separator",
                "description": "Separator used to join values in 'concatenate' mode (default ', ')."
              }
            }
          },
          "edgematch_features": {
            "name": "Edgematch Features",
            "description": "Connect line datasets across a tile/sheet boundary (like ArcGIS Generate Edgematch Links + Edgematch Features): match dangling endpoints one-to-one within a tolerance and reconcile them (midpoint or snap), with an optional match-links layer. The cross-feature one-to-one matching the blind snap_endnodes lacks.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line layer (e.g. two adjacent tiles merged) to edgematch."
              },
              "output": {
                "label": "Output",
                "description": "Output adjusted line layer. If omitted, stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum distance between dangling endpoints to match them."
              },
              "method": {
                "label": "Method",
                "description": "'midpoint' (move both ends to their midpoint; default) or 'move_endpoint' (snap the second onto the first)."
              },
              "match_fields": {
                "label": "Match Fields",
                "description": "Optional comma-separated fields; a matched pair must agree on these (disambiguates candidates)."
              },
              "links": {
                "label": "Links",
                "description": "Optional output line layer of match links (for QA)."
              }
            }
          },
          "eighty_twenty_analysis": {
            "name": "Eighty Twenty Analysis",
            "description": "Snap incident points into weighted locations and compute Pareto concentration ('X% of incidents occur at Y% of locations'), tagging each location with its rank, cumulative-incident percent, and head/tail band, like ArcGIS Eighty Twenty Analysis.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input incident point vector layer (Point or MultiPoint)."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, stored in memory."
              },
              "cluster_tolerance": {
                "label": "Cluster Tolerance",
                "description": "Distance within which incidents snap into one location (map units, default 0 = only exactly coincident points)."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field giving each incident's weight (default: each incident counts as 1)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Concentration threshold percent that defines the Pareto 'head' (default 80)."
              }
            }
          },
          "eliminate_polygon_part": {
            "name": "Eliminate Polygon Part",
            "description": "Remove interior holes (and optionally small outer parts) of polygons whose area is below an absolute-area or percentage threshold, preserving attributes.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "condition": {
                "label": "Condition",
                "description": "Size test: 'AREA' (default) compares against 'min_area'; 'PERCENT' compares the part/hole area as a percentage of the feature's total outer area against 'percentage'."
              },
              "min_area": {
                "label": "Min Area",
                "description": "AREA condition: remove parts/holes whose area (in CRS units squared) is below this value. Required when condition = AREA."
              },
              "percentage": {
                "label": "Percentage",
                "description": "PERCENT condition: remove parts/holes whose area, as a percentage (0-100) of the feature's total outer area, is below this value. Required when condition = PERCENT."
              },
              "part_option": {
                "label": "Part Option",
                "description": "What is eligible for removal: 'CONTAINED_ONLY' (default) removes only interior rings (holes); 'ANY' also removes small exterior parts except the single largest part."
              }
            }
          },
          "eliminate_polygons": {
            "name": "Eliminate Polygons",
            "description": "Merge sliver polygons (by max area and/or an attribute query) into a neighboring polygon, chosen by longest shared border or largest area.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "max_area": {
                "label": "Max Area",
                "description": "Select polygons whose area (in CRS units squared) is at or below this value. May be combined with 'where' (both must match)."
              },
              "where": {
                "label": "Where",
                "description": "Select polygons matching a simple attribute condition 'FIELD OP VALUE', where OP is one of = != < <= > >= (e.g. \"class = 0\"). May be combined with 'max_area'."
              },
              "exclude": {
                "label": "Exclude",
                "description": "Protect features matching this condition (same 'FIELD OP VALUE' syntax) from elimination; they are retained and can receive merges."
              },
              "strategy": {
                "label": "Strategy",
                "description": "Which neighbor a sliver merges into: 'longest_border' (default) or 'largest_area'."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum perpendicular distance (in CRS units) for two boundary segments to count as a shared edge. Default 1e-6."
              }
            }
          },
          "emerging_hot_spot_analysis": {
            "name": "Emerging Hot Spot Analysis",
            "description": "Space-time hot spot trends on an H3 space-time cube: bin timestamped points into H3 cells x time steps, compute Getis-Ord Gi* per bin, and classify each cell (new/intensifying/persistent/diminishing/... hot or cold spot) via a Mann-Kendall trend test, like ArcGIS Emerging Hot Spot Analysis.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (geographic lon/lat, EPSG:4326). Other geometries use their vertex-mean representative point."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). One H3 polygon per cell. If omitted, stored in memory."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: a numeric field (its own units) or an ISO-8601 date/datetime string."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Width of a time step: a plain number (numeric time_field) or a duration like '1w', '7d', '12h', '1M' for a date field. Default '1w'."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Optional numeric field summed into each bin. Default: count of points per bin."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0 (coarsest) to 15 (finest); default 7 (~5 km² cells)."
              },
              "neighborhood": {
                "label": "Neighborhood",
                "description": "Spatial neighborhood radius in H3 k-rings (default 1)."
              },
              "time_window": {
                "label": "Time Window",
                "description": "Temporal neighborhood radius in time steps (default 1)."
              }
            }
          },
          "empirical_bayesian_kriging": {
            "name": "Empirical Bayesian Kriging",
            "description": "Interpolate a point field via many overlapping local subsets, each fitting its own semivariogram whose uncertainty is captured by simulating perturbed semivariograms from a seeded RNG, then blending subset kriging predictions/variances by distance (like ArcGIS's Empirical Bayesian Kriging) — distinct from the bundled ordinary/universal/simple/co-kriging, which all fit one manually-accepted global (or single moving-window) semivariogram.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field on the input layer to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Output prediction raster. If omitted, stored in memory."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units. Default: sized so the longer grid axis is ~150 cells."
              },
              "subset_size": {
                "label": "Subset Size",
                "description": "Target number of points per local subset (default 40, minimum 4)."
              },
              "overlap": {
                "label": "Overlap",
                "description": "Fraction of a subset tile's width/height that neighbouring tiles overlap by (default 0.25)."
              },
              "simulations": {
                "label": "Simulations",
                "description": "Number of simulated semivariograms drawn per subset to represent model uncertainty (default 5, max 50)."
              },
              "semivariogram": {
                "label": "Semivariogram",
                "description": "Semivariogram model family: 'power' (default), 'linear', or 'exponential'."
              },
              "transform": {
                "label": "Transform",
                "description": "Data transform before kriging: 'none' (default) or 'log_empirical' (natural log; requires field > 0 everywhere)."
              },
              "error_output": {
                "label": "Error Output",
                "description": "Optional output prediction standard-error raster."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic semivariogram simulation RNG (default 42)."
              }
            }
          },
          "enclose_multipatch": {
            "name": "Enclose Multipatch",
            "description": "Converts open 3D triangle-mesh surfaces into closed, watertight solids by capping their boundary loops, so they become valid input for volumetric analysis (ArcGIS Enclose Multipatch). is_closed_3d can diagnose an open mesh but nothing could repair one, and union_3d / intersect_3d / difference_3d / inside_3d all reject or misreport open meshes — which is the normal state of extruded footprints, terrain shells and imported building surfaces.",
            "params": {
              "input": {
                "label": "Input",
                "description": "3D surface features (triangle-mesh MultiPolygons with Z)."
              },
              "output": {
                "label": "Output",
                "description": "Output closed solid features. If omitted, stored in memory."
              },
              "drop_failed": {
                "label": "Drop Failed",
                "description": "Omit features that could not be made watertight (default false: they are emitted with CAP_FAILED = true so the failure is visible rather than silent)."
              }
            }
          },
          "enforce_river_monotonicity": {
            "name": "Enforce River Monotonicity",
            "description": "Carve a DEM so elevations decrease monotonically downstream along mapped river polylines — a hydro-enforcement step for hydraulic and flood modeling, like ArcGIS Enforce River Monotonicity. Unlike fill_depressions/fill_burn (which remove closed pits), this enforces a monotone profile along a known river vector.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input river polyline layer (LineString / MultiLineString) sharing the DEM's CRS."
              },
              "surface": {
                "label": "Surface",
                "description": "Elevation raster (DEM) to correct."
              },
              "output": {
                "label": "Output",
                "description": "Output corrected DEM path (format from extension). If omitted, stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Minimum elevation drop enforced per densified step, in Z units (default 0 = non-increasing). Positive values force a strictly decreasing profile."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Densification interval in CRS units along each river line. Default: the raster cell size (≈ one sample per cell)."
              },
              "band": {
                "label": "Band",
                "description": "1-based DEM band to correct (default 1)."
              }
            }
          },
          "estimate_time_to_event": {
            "name": "Estimate Time To Event",
            "description": "Estimate the time until an event via a Kaplan-Meier survival curve (like ArcGIS Estimate Time To Event): from a duration field and an event/censoring field, compute each feature's survival probability and its stratum's median time-to-event, optionally stratified by a categorical field.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point or polygon layer with a duration field and an event/censoring field."
              },
              "age_field": {
                "label": "Age Field",
                "description": "Field holding each feature's observed duration (time-to-event or time-to-censoring), a non-negative number."
              },
              "event_field": {
                "label": "Event Field",
                "description": "Field indicating whether the event occurred (truthy: 1/true) or the observation was censored (falsy: 0/false)."
              },
              "stratify_field": {
                "label": "Stratify Field",
                "description": "Optional categorical field to fit a separate survival curve per group."
              },
              "output": {
                "label": "Output",
                "description": "Output layer with km_survival, km_median and km_stratum fields added. If omitted, stored in memory."
              }
            }
          },
          "estimate_variogram": {
            "name": "Estimate Variogram",
            "description": "Computes an empirical semivariogram from point observations to characterize spatial correlation structure. Essential first step in geostatistical workflow.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector points layer with values"
              },
              "field": {
                "label": "Field",
                "description": "Field containing measurement values"
              },
              "lag_distance": {
                "label": "Lag Distance",
                "description": "Lag bin size in map units (default: 100.0)"
              },
              "lag_tolerance": {
                "label": "Lag Tolerance",
                "description": "Tolerance for lag binning (default: 50.0)"
              },
              "max_lag_count": {
                "label": "Max Lag Count",
                "description": "Maximum number of lags to retain (default: 20)"
              }
            }
          },
          "euclidean_direction": {
            "name": "Euclidean Direction",
            "description": "Computes the compass azimuth from each cell toward its nearest source cell, plus optional distance and back-direction rasters (ArcGIS Euclidean Direction). Completes the bundled Euclidean family, which ships euclidean_distance (how far) and euclidean_allocation (which source) but not the bearing. Uses an exact distance transform that carries nearest-source coordinates; with a barrier raster it routes around obstacles instead.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Source raster: cells that are neither no-data nor zero are sources."
              },
              "output": {
                "label": "Output",
                "description": "Optional output direction raster path (degrees clockwise from north). If omitted, stored in memory."
              },
              "output_distance": {
                "label": "Output Distance",
                "description": "Optional path for the companion distance raster."
              },
              "output_back_direction": {
                "label": "Output Back Direction",
                "description": "Optional path for the back-direction raster: the bearing to travel from this cell back toward the closest source. Equals the direction raster when no barriers are supplied; with barriers it is the first step of the return path."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier raster; non-zero, non-no-data cells block straight-line paths, forcing routing around them."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Cells farther than this from any source are written as no-data."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the source raster to read (default 1)."
              }
            }
          },
          "evaluate_bin_sizes": {
            "name": "Evaluate Bin Sizes",
            "description": "Sweep candidate aggregation bin sizes and report diagnostics identifying which size best reveals structure, like ArcGIS Evaluate Bin Sizes.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point features to be aggregated."
              },
              "output": {
                "label": "Output",
                "description": "Optional output diagnostics table path. If omitted, stored in memory."
              },
              "bin_shape": {
                "label": "Bin Shape",
                "description": "hexagon (default; row-offset approximation, see docs) | square."
              },
              "sizes": {
                "label": "Sizes",
                "description": "Comma-separated candidate bin sizes (map units). When omitted, a geometric sweep is generated from the mean nearest-neighbour distance."
              },
              "steps": {
                "label": "Steps",
                "description": "Number of candidates in the generated sweep (default 8, max 64)."
              },
              "analysis_field": {
                "label": "Analysis Field",
                "description": "Optional numeric field to sum per bin instead of counting points."
              }
            }
          },
          "evaluate_variable_influence": {
            "name": "Evaluate Variable Influence",
            "description": "Reports permutation importance and partial-dependence curves for a forest model fitted from a table, answering which explanatory variables a model actually uses and what shape each effect has (ArcGIS Evaluate Variable Influence). The catalog can fit models — generalized_linear_regression, exploratory_regression, geographically_weighted_regression, forest_based_forecast, whitebox's random forests — but none reports either measure. ArcGIS reads a trained .ssm model file; this stack has no portable model format, so the tool fits its own forest and then explains it. Fully deterministic: strided bagging and a fixed permutation, no RNG.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Layer or table holding the training observations."
              },
              "dependent_field": {
                "label": "Dependent Field",
                "description": "Field being predicted."
              },
              "explanatory_fields": {
                "label": "Explanatory Fields",
                "description": "Comma-separated numeric fields to evaluate."
              },
              "output": {
                "label": "Output",
                "description": "Output table of per-variable importance. If omitted, stored in memory."
              },
              "output_partial_dependence": {
                "label": "Output Partial Dependence",
                "description": "Output table of partial-dependence curves, one row per variable and grid point. Always produced; stored in memory when no path is given."
              },
              "model_type": {
                "label": "Model Type",
                "description": "'regression' (default) for a continuous target, or 'classification' for a categorical one."
              },
              "number_of_trees": {
                "label": "Number Of Trees",
                "description": "Trees in the ensemble (default 50)."
              },
              "max_depth": {
                "label": "Max Depth",
                "description": "Maximum tree depth (default 8)."
              },
              "min_samples_leaf": {
                "label": "Min Samples Leaf",
                "description": "Fewest observations a leaf may hold (default 3)."
              },
              "grid_points": {
                "label": "Grid Points",
                "description": "Points per partial-dependence curve (default 12)."
              },
              "permutation_repeats": {
                "label": "Permutation Repeats",
                "description": "Distinct permutations averaged per variable (default 3). More is steadier and slower."
              }
            }
          },
          "excel_to_table": {
            "name": "Excel To Table",
            "description": "Read a worksheet from an .xlsx/.xls/.xlsb/.ods workbook into an attribute table, inferring numeric vs text columns.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input Excel/OpenDocument workbook path (.xlsx, .xls, .xlsb, or .ods)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output table path (driver from its extension; GeoParquet .parquet recommended). If omitted, stored in memory."
              },
              "sheet": {
                "label": "Sheet",
                "description": "Worksheet to read, by name or 0-based index. Default: the first sheet."
              },
              "cell_range": {
                "label": "Cell Range",
                "description": "Optional A1-notation range to import, e.g. 'B2:E40'. Default: the sheet's whole used range."
              },
              "field_names_row": {
                "label": "Field Names Row",
                "description": "1-based row within the selected range holding the column names (default 1). Rows above it are skipped; 0 means no header row (auto-generate Field1, Field2, ...)."
              }
            }
          },
          "expand_shrink": {
            "name": "Expand / Shrink",
            "description": "Grow (expand) or shrink selected classes of a categorical raster by a number of cells, leaving other classes intact — the standard cleanup for classified land cover before polygonization, like ArcGIS Expand / Shrink.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical (integer-valued) raster."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path. If omitted, stored in memory."
              },
              "classes": {
                "label": "Classes",
                "description": "Comma-separated class value(s) to expand or shrink."
              },
              "cells": {
                "label": "Cells",
                "description": "Number of cells to expand or shrink by (>= 1)."
              },
              "mode": {
                "label": "Mode",
                "description": "'expand' (grow the selected classes; default) or 'shrink' (erode them)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "exploratory_interpolation": {
            "name": "Exploratory Interpolation",
            "description": "Run several interpolation methods (IDW, nearest-neighbour, first/second-order trend surfaces), leave-one-out cross-validate each, and rank them by prediction accuracy (RMSE/MAE) or bias (ME) — like ArcGIS Exploratory Interpolation. Reports a ranked per-method comparison table and can emit the best method's prediction raster. Subsumes a standalone cross-validation request.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of measurements."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field on the points holding the value to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Output ranked comparison table — a CSV (extension .csv) or a geometry-less vector table. If omitted, stored in memory."
              },
              "methods": {
                "label": "Methods",
                "description": "Comma/pipe-separated subset of methods to compare: 'idw', 'nearest', 'trend1', 'trend2'. Default: all four."
              },
              "criterion": {
                "label": "Criterion",
                "description": "Ranking criterion: 'rmse' (default, lowest error), 'mae' (lowest absolute error), or 'me' (least bias, smallest |mean error|)."
              },
              "power": {
                "label": "Power",
                "description": "IDW distance-decay exponent (default 2)."
              },
              "output_raster": {
                "label": "Output Raster",
                "description": "Optional output GeoTIFF: the best-ranked method fit on all samples, evaluated over a grid spanning the sample extent."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Winner-raster cell size in CRS units (degrees for a geographic CRS). Default: sized so the longer axis spans ~256 cells."
              }
            }
          },
          "exploratory_regression": {
            "name": "Exploratory Regression",
            "description": "Enumerate OLS models over every combination of candidate explanatory fields and screen each on adjusted R2, coefficient significance, VIF multicollinearity, Jarque-Bera residual normality and residual Moran's I spatial autocorrelation, reporting every model plus the ranked passing set and a per-variable significance summary — like ArcGIS Exploratory Regression.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer with geometry (used for the residual Moran's I neighbourhood)."
              },
              "dependent_field": {
                "label": "Dependent Field",
                "description": "Dependent (response) numeric field."
              },
              "explanatory_fields": {
                "label": "Explanatory Fields",
                "description": "Comma-separated candidate explanatory numeric fields to search over."
              },
              "min_vars": {
                "label": "Min Vars",
                "description": "Minimum explanatory variables per candidate model (default 1)."
              },
              "max_vars": {
                "label": "Max Vars",
                "description": "Maximum explanatory variables per candidate model (default: min(candidate count, 6))."
              },
              "max_coef_p": {
                "label": "Max Coef P",
                "description": "Maximum allowed p-value for every explanatory coefficient (default 0.05)."
              },
              "min_adj_r2": {
                "label": "Min Adj R2",
                "description": "Minimum adjusted R-squared (default 0.5)."
              },
              "max_vif": {
                "label": "Max Vif",
                "description": "Maximum allowed variance inflation factor per term (default 7.5)."
              },
              "min_jb_p": {
                "label": "Min Jb P",
                "description": "Minimum Jarque-Bera p-value for residual normality (default 0.1)."
              },
              "min_moran_p": {
                "label": "Min Moran P",
                "description": "Minimum p-value for residual spatial autocorrelation (Moran's I); above this the residuals are not significantly clustered (default 0.1)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Number of nearest neighbours defining the spatial weights for the residual Moran's I test (default 8)."
              },
              "output": {
                "label": "Output",
                "description": "Output report table path — a CSV (extension .csv) or a geometry-less vector table."
              }
            }
          },
          "extract_locations_from_text": {
            "name": "Extract Locations From Text",
            "description": "Scan free-form text for embedded coordinates — decimal degrees (DD), degrees-decimal-minutes (DDM), degrees-minutes-seconds (DMS), and MGRS/USNG grid references — and emit one WGS84 point per hit, like ArcGIS Extract Locations From Text (coordinate branch). Pure pattern scanning; no geocoding service.",
            "params": {
              "input_text": {
                "label": "Input Text",
                "description": "The free-form text to scan. Either the literal text, or a path to a UTF-8 text file (read when the value resolves to an existing file)."
              },
              "notations": {
                "label": "Notations",
                "description": "Comma/space separated subset of notations to scan for: DD, DDM, DMS, MGRS (USNG is an alias of MGRS). Default: all four."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "extract_ocean_winds": {
            "name": "Extract Ocean Winds",
            "description": "Retrieves 10 m equivalent-neutral ocean wind speed from calibrated SAR backscatter by inverting the CMOD5.N geophysical model function (ArcGIS Extract Ocean Winds). The whole shipped SAR chain stays in the radiometric domain and nothing converted backscatter into a geophysical quantity, which is also what separates a low-wind patch from an oil slick.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Calibrated backscatter (sigma0) raster."
              },
              "units": {
                "label": "Units",
                "description": "Units of 'input': 'dn', 'amplitude', 'intensity', or 'db' (default 'db')."
              },
              "incidence_angle": {
                "label": "Incidence Angle",
                "description": "Per-cell incidence angle in degrees: a raster path, or a constant number."
              },
              "wind_direction": {
                "label": "Wind Direction",
                "description": "Meteorological wind direction in degrees (the direction the wind blows FROM), as a raster path or a constant. A required prior: CMOD has two unknowns and one observation."
              },
              "look_direction": {
                "label": "Look Direction",
                "description": "Radar look azimuth in degrees, as a raster path or a constant. Used to convert wind direction into the relative angle CMOD takes."
              },
              "polarization": {
                "label": "Polarization",
                "description": "'vv' (default, native CMOD5.N) or 'hh' (applies an approximate polarization ratio)."
              },
              "polarization_ratio_alpha": {
                "label": "Polarization Ratio Alpha",
                "description": "Alpha in the HH-to-VV polarization ratio (default 0.6). Only used when polarization is 'hh'."
              },
              "water_mask": {
                "label": "Water Mask",
                "description": "Optional polygon layer or raster restricting output to water; land returns are meaningless here."
              },
              "max_wind": {
                "label": "Max Wind",
                "description": "Upper end of the inversion bracket, m/s (default 50)."
              },
              "output": {
                "label": "Output",
                "description": "Output wind-speed raster in m/s. If omitted, stored in memory."
              }
            }
          },
          "extract_scanned_features": {
            "name": "Extract Scanned Features",
            "description": "Vectorize a binary (scanned/thresholded) raster into clean lines (skeleton tracing) or polygons, with noise removal, hole filling, gap closure, and simplification.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input binary/classified raster to vectorize."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "feature_type": {
                "label": "Feature Type",
                "description": "'lines' (default): skeletonize and trace centrelines. 'polygons': vectorize filled regions."
              },
              "foreground_value": {
                "label": "Foreground Value",
                "description": "Cell value that marks foreground. If omitted, cells >= 'threshold' (or, absent that, any non-zero valid cell) are foreground."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Foreground is cells with value >= this (used when 'foreground_value' is not given)."
              },
              "noise_size": {
                "label": "Noise Size",
                "description": "Remove foreground components smaller than this many cells (default 4)."
              },
              "hole_size": {
                "label": "Hole Size",
                "description": "Fill background holes smaller than this many cells (default 4)."
              },
              "gap_distance": {
                "label": "Gap Distance",
                "description": "For lines: bridge gaps up to this distance (CRS units) between nearly-collinear line endpoints. Default 0 (off)."
              },
              "simplify_tolerance": {
                "label": "Simplify Tolerance",
                "description": "Douglas-Peucker tolerance (CRS units) for the output geometry. Default ~1 cell."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "extract_sinks": {
            "name": "Extract Sinks",
            "description": "Extract sinks (maximum depression extent) from a DEM (lidar filling.py).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input DEM raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional sink raster path. If omitted, stored in memory."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum number of pixels for a sink (kept if strictly greater; default 10)."
              },
              "region_output": {
                "label": "Region Output",
                "description": "Optional output path for the labeled-region raster."
              },
              "depth_output": {
                "label": "Depth Output",
                "description": "Optional output path for the fill-depth raster."
              },
              "filled_output": {
                "label": "Filled Output",
                "description": "Optional output path for the depression-filled DEM."
              },
              "csv_output": {
                "label": "Csv Output",
                "description": "Optional output path for the per-region attribute CSV."
              },
              "vector_output": {
                "label": "Vector Output",
                "description": "Optional output path for region polygons as GeoJSON (attributes joined)."
              },
              "flat_increment": {
                "label": "Flat Increment",
                "description": "Flat increment added during filling to enforce drainage (default 0)."
              }
            }
          },
          "extract_spectra_from_image": {
            "name": "Extract Spectra From Image",
            "description": "Derives a spectral library from a multiband image and training regions, one spectrum per class, in the CSV layout spectral_library_matching reads (ArcGIS Extract Spectra From Image). spectral_library_matching, spectral_angle_mapper and matched_filter_target_detection all consume a library and nothing created one, so the spectral suite could only be used against pre-existing published libraries.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Multiband image."
              },
              "training_features": {
                "label": "Training Features",
                "description": "Polygon or point layer delineating each class or target."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Attribute holding the class label. Features sharing a label are pooled into one spectrum."
              },
              "output": {
                "label": "Output",
                "description": "Output spectral library CSV path ('name,b1,b2,...' per class), ready for spectral_library_matching's 'library_csv'."
              },
              "statistic": {
                "label": "Statistic",
                "description": "Reduction across the covered cells: 'mean' (default), 'median', 'max', 'min'."
              },
              "trim_percent": {
                "label": "Trim Percent",
                "description": "Percentage discarded from each tail per band before reducing, to suppress mixed edge pixels (default 0, max 49)."
              },
              "min_cells": {
                "label": "Min Cells",
                "description": "Classes covering fewer cells than this are reported and skipped rather than emitting a one-pixel 'spectrum' (default 1)."
              },
              "wavelengths": {
                "label": "Wavelengths",
                "description": "Optional comma-separated per-band wavelengths, recorded as a comment header in the library and in output_stats."
              },
              "output_stats": {
                "label": "Output Stats",
                "description": "Optional CSV receiving per-class, per-band standard deviation and cell count. Kept separate so the library stays parseable."
              }
            }
          },
          "extract_water_sar": {
            "name": "Extract Water (SAR)",
            "description": "Delineates open water and flood extent from SAR backscatter with a per-scene Otsu threshold on decibels, plus optional DEM slope and height-above-minimum filters that reject radar shadow and dry dark surfaces (ArcGIS Extract Water). Neither registry can do this from radar: spectral_index's NDWI/MNDWI need green/NIR/SWIR reflectance bands a SAR does not have, depth_to_water models where water should be from terrain rather than observing it, and a hand-set raster_calculator threshold does not transfer between scenes because the water/land split moves with wind and incidence angle.",
            "params": {
              "input": {
                "label": "Input",
                "description": "SAR backscatter raster."
              },
              "output": {
                "label": "Output",
                "description": "Output water polygon layer. If omitted, stored in memory."
              },
              "output_raster": {
                "label": "Output Raster",
                "description": "Output binary water mask (1 water, 0 land). Always produced; stored in memory when no path is given."
              },
              "dem": {
                "label": "Dem",
                "description": "Optional DEM, co-registered with the input, enabling the slope and height filters."
              },
              "threshold_db": {
                "label": "Threshold Db",
                "description": "Fixed threshold in dB; cells at or below it are water. Overrides the automatic Otsu threshold."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Discard water bodies smaller than this area in map units squared."
              },
              "max_slope": {
                "label": "Max Slope",
                "description": "With a DEM, reject water on terrain steeper than this many degrees (default 5). Standing water cannot occupy a steep slope, but radar shadow there is just as dark."
              },
              "max_height_above_min": {
                "label": "Max Height Above Min",
                "description": "With a DEM, reject candidate cells more than this many z units above the lowest DEM cell in their own connected region."
              },
              "mask_features": {
                "label": "Mask Features",
                "description": "Polygon layer restricting the analysis area."
              },
              "mask_type": {
                "label": "Mask Type",
                "description": "'land_polygon' (default; analyse outside the polygons) or 'water_polygon' (analyse inside them)."
              },
              "histogram_bins": {
                "label": "Histogram Bins",
                "description": "Bins used for the Otsu histogram (default 256)."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'intensity' (default), 'dn', 'amplitude', or 'db'."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to threshold (default 1)."
              }
            }
          },
          "extrude_between": {
            "name": "Extrude Between",
            "description": "Builds watertight closed solids spanning the space between two surfaces inside each input polygon, with exact per-feature volumes (ArcGIS Extrude Between). cut_fill gives per-cell volume change between two rasters but emits a raster, cannot be restricted to footprints and carries no attributes; buffer_3d and minimum_bounding_volume build solids from features rather than from a surface pair. The output feeds directly into union_3d, intersect_3d, difference_3d and inside_3d.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Polygon footprints defining each solid's lateral extent. Only the FIRST ring of the first part is used: interior holes and additional parts of a MultiPolygon are ignored, so pre-split multipart footprints and fill holes before extruding."
              },
              "surface_upper": {
                "label": "Surface Upper",
                "description": "Upper bounding surface raster."
              },
              "surface_lower": {
                "label": "Surface Lower",
                "description": "Lower bounding surface raster, co-registered with the upper one."
              },
              "output": {
                "label": "Output",
                "description": "Closed solid features (triangle-mesh MultiPolygons with Z). If omitted, stored in memory."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Footprint sampling and boundary densification spacing in CRS units. Default: the finer surface cell size."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from each surface raster (default 1)."
              }
            }
          },
          "feature_outline_masks": {
            "name": "Feature Outline Masks",
            "description": "Generate cartographic mask polygons at a margin around features (exact outline, convex hull, or bounding box), optionally clipped to a second layer (Intersecting Layers Masks).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry), format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "margin": {
                "label": "Margin",
                "description": "Mask margin distance. Metres for a geographic CRS (EPSG:4326 or unknown, converted to degrees), otherwise in the layer's CRS units. Must be positive."
              },
              "mask_kind": {
                "label": "Mask Kind",
                "description": "Mask shape: 'exact' (default, buffered feature outline), 'convex_hull' (dilated convex hull), or 'box' (bounding envelope + margin)."
              },
              "masked_layer": {
                "label": "Masked Layer",
                "description": "Optional second polygon layer. When given, masks are clipped to their intersection with it (Intersecting Layers Masks); non-overlapping masks are dropped."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Optional source field whose value is copied onto each mask as 'source_id'. Defaults to the source feature index."
              }
            }
          },
          "feature_to_line": {
            "name": "Feature To Line",
            "description": "Planarize line/polygon-boundary features into noded, non-overlapping line segments split at every mutual and self intersection, like ArcGIS Feature To Line — the topology-building precursor the bundled polygons_to_lines and split_vector_lines don't provide.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line or polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path (driver from extension). If omitted, stored in memory."
              },
              "cluster_tolerance": {
                "label": "Cluster Tolerance",
                "description": "Snap split points to this map-unit grid to merge near-coincident nodes (default 1e-9)."
              },
              "attributes": {
                "label": "Attributes",
                "description": "When true (default), tag each output segment with 'src_fid', the source feature id."
              }
            }
          },
          "feature_vertices_to_points": {
            "name": "Feature Vertices To Points",
            "description": "Create a point layer from selected feature vertices — ALL, START, END, BOTH_ENDS, MID (arc-length midpoint), or DANGLE (unshared line endpoints) — with a parent-FID field, like ArcGIS Feature Vertices To Points.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line, polygon, or point vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, stored in memory."
              },
              "point_location": {
                "label": "Point Location",
                "description": "Which vertices to extract: ALL | START | END | BOTH_ENDS | MID | DANGLE. Default ALL."
              }
            }
          },
          "features_to_gpx": {
            "name": "Features To GPX",
            "description": "Write point features as GPX waypoints and line features as GPX tracks, mapping attribute fields to name/description/elevation/time.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point or line vector layer to export (assumed WGS84 / EPSG:4326)."
              },
              "output": {
                "label": "Output",
                "description": "Output .gpx file path."
              },
              "name_field": {
                "label": "Name Field",
                "description": "Attribute field mapped to the GPX <name> element (optional)."
              },
              "description_field": {
                "label": "Description Field",
                "description": "Attribute field mapped to the GPX <desc> element (optional)."
              },
              "z_field": {
                "label": "Z Field",
                "description": "Attribute field mapped to the GPX <ele> elevation (optional; falls back to a geometry Z when present)."
              },
              "date_field": {
                "label": "Date Field",
                "description": "Attribute field mapped to the GPX <time> timestamp, an ISO-8601 string (optional)."
              }
            }
          },
          "features_to_gtfs": {
            "name": "Features To GTFS",
            "description": "Export point features to GTFS stops.txt and line features to GTFS shapes.txt, closing the GTFS round-trip.",
            "params": {
              "stops_input": {
                "label": "Stops Input",
                "description": "Point vector layer to write as stops.txt (uses stop_id/stop_name attribute fields when present)."
              },
              "shapes_input": {
                "label": "Shapes Input",
                "description": "Line vector layer to write as shapes.txt (uses a shape_id attribute field when present)."
              },
              "output_dir": {
                "label": "Output Dir",
                "description": "Directory the GTFS text files (stops.txt / shapes.txt) are written to. Created if missing."
              }
            }
          },
          "features_to_kml": {
            "name": "Features To KML",
            "description": "Writes a vector layer to a KML 2.2 document (or a zipped KMZ), with attributes as ExtendedData and an optional shared style (ArcGIS Layer To KML / Map To KML). kml_to_features could already read KML but nothing wrote it, unlike the symmetric GPX, GTFS and GeoParquet pairs.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer. Must be in EPSG:4326 lon/lat, which is the only CRS KML defines."
              },
              "output": {
                "label": "Output",
                "description": "Output .kml or .kmz file path."
              },
              "name_field": {
                "label": "Name Field",
                "description": "Attribute used for each Placemark's <name>."
              },
              "description_field": {
                "label": "Description Field",
                "description": "Attribute used for <description>. When omitted, all attributes are written as <ExtendedData>."
              },
              "z_field": {
                "label": "Z Field",
                "description": "Attribute supplying an elevation, written as the third coordinate."
              },
              "altitude_mode": {
                "label": "Altitude Mode",
                "description": "'clampToGround' (default), 'relativeToGround', or 'absolute'."
              },
              "color": {
                "label": "Color",
                "description": "Line/outline colour as KML aabbggrr hex (e.g. 'ff0000ff' for opaque red)."
              },
              "line_width": {
                "label": "Line Width",
                "description": "Line width in pixels (default 1.0)."
              },
              "fill_color": {
                "label": "Fill Color",
                "description": "Polygon fill colour as KML aabbggrr hex. Omit for no fill."
              }
            }
          },
          "fence_diagram": {
            "name": "Fence Diagram",
            "description": "Generates 3D vertical section panels where a line trace crosses a stack of surfaces — the standard way to visualise subsurface stratigraphy or atmospheric layering (ArcGIS Fence Diagram). profile, long_profile and stack_profile sample surfaces along a line but return 2D profile lines or tables, with no geometry for the space BETWEEN consecutive surfaces, and voxel_isosurface extracts a level surface from a volume rather than a section.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Line features defining the section trace."
              },
              "surfaces": {
                "label": "Surfaces",
                "description": "Comma-separated list of co-registered surface rasters, ordered TOP to BOTTOM."
              },
              "output": {
                "label": "Output",
                "description": "3D section panels, one per trace per surface pair. If omitted, stored in memory."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Along-trace sampling spacing in CRS units. Default: the finest surface cell size."
              },
              "floor_height": {
                "label": "Floor Height",
                "description": "Optional constant lower bound: a synthetic bottom surface at this elevation, closing the deepest panel."
              },
              "ceiling_height": {
                "label": "Ceiling Height",
                "description": "Optional constant upper bound: a synthetic top surface at this elevation."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from each surface raster (default 1)."
              }
            }
          },
          "fill_missing_values": {
            "name": "Fill Missing Values",
            "description": "Estimate and fill null values in a numeric attribute field using spatial neighbours (k-nearest or a distance band), optionally restricted to a temporal window, with a selectable estimator (mean/median/min/max/temporal_trend). Imputed rows are marked with a flag field (ArcGIS Fill Missing Values).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer with the field to fill."
              },
              "fill_field": {
                "label": "Fill Field",
                "description": "Numeric field whose null values are to be estimated and filled."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "estimator": {
                "label": "Estimator",
                "description": "How to combine neighbour values: 'mean' (default), 'median', 'min', 'max', or 'temporal_trend' (least-squares over time; needs time_field)."
              },
              "neighbourhood": {
                "label": "Neighbourhood",
                "description": "Spatial selection: 'knn' (default, k nearest) or 'distance_band' (all within search_radius)."
              },
              "k": {
                "label": "K",
                "description": "Number of nearest neighbours for 'knn' (default 8)."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Radius (CRS units) for 'distance_band' selection."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Optional numeric field giving each feature's time/order (required for 'temporal_trend')."
              },
              "time_window": {
                "label": "Time Window",
                "description": "Optional: restrict neighbours to those within this time distance of the target (needs time_field)."
              },
              "flag_field": {
                "label": "Flag Field",
                "description": "Name of the boolean field flagging imputed rows (default 'imputed')."
              }
            }
          },
          "fill_spill_merge": {
            "name": "Fill-Spill-Merge",
            "description": "Route a finite volume of surface water across a DEM to produce realistic lake/inundation extents (partial depression filling with spill and merge), reimplementing RichDEM's Fill-Spill-Merge.",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster (elevations)."
              },
              "water_level": {
                "label": "Water Level",
                "description": "Uniform surface water depth applied to every cell. Provide this or 'surface_water'."
              },
              "surface_water": {
                "label": "Surface Water",
                "description": "Per-cell surface water depth raster (aligned to the DEM). Overrides 'water_level' where both are given."
              },
              "ocean_level": {
                "label": "Ocean Level",
                "description": "Optional sea level: cells at or below this elevation that connect to the grid edge become ocean (coastal inundation baseline)."
              },
              "edge_outlet": {
                "label": "Edge Outlet",
                "description": "Treat every grid-border cell as a free outlet (default true). Water reaching the border leaves the DEM."
              },
              "output": {
                "label": "Output",
                "description": "Optional standing-water-depth raster path. If omitted, stored in memory."
              },
              "water_surface": {
                "label": "Water Surface",
                "description": "Optional output path for the hydraulic surface (DEM + water depth)."
              },
              "flood_extent": {
                "label": "Flood Extent",
                "description": "Optional output path for a flood-extent mask (1 where standing water is present, else 0)."
              }
            }
          },
          "find_argument_statistics": {
            "name": "Find Argument Statistics",
            "description": "Per-pixel argument statistics over a raster stack (like ArcGIS Find Argument Statistics): the slice index (or date) of the max/min, the median position, the count of slices past a threshold (duration), or the longest consecutive run — the argument-position answers the bundled cell-statistics and image_stack_profile value aggregates can't give.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "One multiband raster (each band is a slice) or a comma-separated list of co-registered rasters, in time order."
              },
              "output": {
                "label": "Output",
                "description": "Output single-band raster of slice indices / dates / counts. If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "'argmax' (default), 'argmin', 'median_position', 'duration', or 'longest_run'."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Numeric threshold for 'duration'/'longest_run' (required for those)."
              },
              "comparison": {
                "label": "Comparison",
                "description": "Comparison for 'duration'/'longest_run': '>' (default), '>=', '<', or '<='."
              },
              "dates": {
                "label": "Dates",
                "description": "Optional comma-separated numeric dates (e.g. day-of-year) per slice; argmax/argmin/median output the matching date instead of the slice index."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum non-no-data observations per pixel (default 1)."
              }
            }
          },
          "find_dwell_locations": {
            "name": "Find Dwell Locations",
            "description": "Detect where a moving entity stayed put: runs of track fixes within a distance tolerance for at least a time tolerance, emitted as fixes, mean centers or convex hulls, like ArcGIS Find Dwell Locations.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Timestamped point features (track fixes)."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying the track each fix belongs to."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Timestamp field (numeric seconds or ISO-8601 text)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "distance_tolerance": {
                "label": "Distance Tolerance",
                "description": "Maximum distance (map units) a fix may sit from the dwell's running centroid."
              },
              "time_tolerance": {
                "label": "Time Tolerance",
                "description": "Minimum duration (same units as time_field) for a stationary run to count as a dwell."
              },
              "output_type": {
                "label": "Output Type",
                "description": "dwell_features (default) | mean_centers | convex_hulls | all_features."
              }
            }
          },
          "find_identical": {
            "name": "Find Identical",
            "description": "Find features that are identical on geometry and/or chosen fields, grouping duplicates; 'report' adds dup_group/dup_seq columns, 'delete' keeps only the first of each group, like ArcGIS Find Identical / Delete Identical.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer to deduplicate."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated fields to compare. Omit to compare geometry only; combine with 'compare_geometry'."
              },
              "compare_geometry": {
                "label": "Compare Geometry",
                "description": "Whether geometry is part of the identity test (default true; set false to compare fields only)."
              },
              "xy_tolerance": {
                "label": "Xy Tolerance",
                "description": "Snap tolerance for geometry comparison (vertices are rounded to this grid before hashing). Default 0 (exact)."
              },
              "mode": {
                "label": "Mode",
                "description": "'report' (default; adds dup_group/dup_seq) or 'delete' (keeps the first of each group)."
              }
            }
          },
          "find_meeting_locations": {
            "name": "Find Meeting Locations",
            "description": "Detect gatherings where multiple distinct tracks are together within a distance for at least a minimum duration (like ArcGIS Find Meeting Locations) — the N-track co-occurrence the authored trace_proximity_events (pairwise) and reconstruct_tracks (single-track dwell) don't cover. Emits area hulls and representative points with participant count, start/end time, and duration.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Timestamped track point layer (projected CRS; distances in map units)."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying each track/entity."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: numeric seconds or an ISO-8601 timestamp."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Maximum distance (map units) for tracks to count as together."
              },
              "min_meeting_duration": {
                "label": "Min Meeting Duration",
                "description": "Minimum duration (time units) a gathering must persist to be reported."
              },
              "max_meeting_duration": {
                "label": "Max Meeting Duration",
                "description": "Optional maximum duration; longer gatherings are dropped."
              },
              "min_participants": {
                "label": "Min Participants",
                "description": "Minimum number of distinct tracks in a gathering (default 2)."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Width of a time slice (time units). Default: min_meeting_duration."
              },
              "output": {
                "label": "Output",
                "description": "Output representative-point layer (one point per meeting). If omitted, stored in memory."
              },
              "output_area": {
                "label": "Output Area",
                "description": "Optional output area layer (convex-hull polygon per meeting). If omitted, stored in memory."
              }
            }
          },
          "find_space_time_matches": {
            "name": "Find Space Time Matches",
            "description": "Match features between two timestamped point layers that fall within a spatial search distance AND a time window of each other (before/after/either), emitting matched pairs with distance and time offset, like ArcGIS Find Space Time Matches.",
            "params": {
              "primary": {
                "label": "Primary",
                "description": "Primary point layer (each feature is matched against the secondary layer)."
              },
              "secondary": {
                "label": "Secondary",
                "description": "Secondary point layer to match against."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Timestamp field present in BOTH layers (numeric or ISO-8601)."
              },
              "output": {
                "label": "Output",
                "description": "Output match layer (one link line per matched pair). If omitted, stored in memory."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Maximum spatial distance between a primary and secondary feature (map units)."
              },
              "time_window": {
                "label": "Time Window",
                "description": "Maximum time separation: a number of seconds or a duration like '2h', '30m', '7d'."
              },
              "temporal_relationship": {
                "label": "Temporal Relationship",
                "description": "'either' (default), 'before' (secondary before primary), or 'after' (secondary after primary)."
              },
              "primary_id_field": {
                "label": "Primary Id Field",
                "description": "Field naming each primary feature in the output (default: feature index)."
              },
              "secondary_id_field": {
                "label": "Secondary Id Field",
                "description": "Field naming each secondary feature in the output (default: feature index)."
              }
            }
          },
          "fit_variogram": {
            "name": "Fit Variogram Model",
            "description": "Fits theoretical variogram model (Spherical, Exponential, Gaussian) to empirical semivariogram data for use in kriging.",
            "params": {
              "lags_json": {
                "label": "Lags Json",
                "description": "JSON array of lag bins from estimate_variogram"
              },
              "model_family": {
                "label": "Model Family",
                "description": "Model: spherical, exponential, or gaussian"
              }
            }
          },
          "flatten_interferogram": {
            "name": "Flatten Interferogram",
            "description": "Removes the topographic phase component from a wrapped interferogram using a DEM and the interferometric baseline, leaving the deformation and atmosphere signal (the TOPO flattening mode of ArcGIS Generate Interferogram). sar_coherence already emits the interferogram itself via output_phase, but nothing in either registry can simulate and subtract the topographic phase — and over any relief that component dominates, so an unflattened interferogram is unusable for deformation work.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Wrapped interferometric phase raster in radians (as sar_coherence's output_phase emits), or a two-band I/Q interferogram."
              },
              "dem": {
                "label": "Dem",
                "description": "Co-registered elevation raster."
              },
              "output": {
                "label": "Output",
                "description": "Flattened wrapped-phase raster, re-wrapped to (-pi, pi]. If omitted, stored in memory."
              },
              "perpendicular_baseline": {
                "label": "Perpendicular Baseline",
                "description": "Perpendicular baseline B_perp in metres. Required: it sets the height-to-phase sensitivity, and there is no defensible default."
              },
              "wavelength": {
                "label": "Wavelength",
                "description": "Radar wavelength in metres (default 0.05546576, Sentinel-1 C-band)."
              },
              "incidence_angle": {
                "label": "Incidence Angle",
                "description": "Incidence angle in degrees: a constant (default 39.0, typical Sentinel-1 IW mid-swath) or a co-registered raster path."
              },
              "slant_range": {
                "label": "Slant Range",
                "description": "Sensor-to-ground slant range R in metres (default 800000)."
              },
              "reference_elevation": {
                "label": "Reference Elevation",
                "description": "Elevation treated as zero topographic phase. Default: the DEM mean, so the output carries no arbitrary global offset."
              },
              "out_topographic_phase": {
                "label": "Out Topographic Phase",
                "description": "Simulated topographic phase raster, WRAPPED to (-pi, pi] like the flattened output — not the absolute simulated phase. Always produced; falls back to an in-memory handle when no path is given."
              },
              "band": {
                "label": "Band",
                "description": "1-based band holding the phase. Omit it for a single-band phase raster or a two-band I/Q interferogram (which is then auto-detected); supply it to read real phase from a specific band of a multiband stack. A raster with more than two bands REQUIRES this parameter, because three or more bands are not an I/Q pair and guessing would return plausible but wrong phase."
              }
            }
          },
          "flip_line": {
            "name": "Flip Line",
            "description": "Reverse the vertex order (start↔end) of polyline features to flip their digitized direction.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              }
            }
          },
          "focal_flow": {
            "name": "Focal Flow",
            "description": "Encodes which of a cell's eight neighbours flow into it as an 8-bit mask (ArcGIS Focal Flow). Unlike the bundled D8/D-infinity accumulation tools, which route each cell downslope along one direction, this records every inflowing neighbour — capturing convergence into pits, sinks and saddles. Bit weights run counter-clockwise from east (1, 2, 4, 8, 16, 32, 64, 128); 0 is a local high, 255 a pit.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input surface raster (elevation or any continuous surface)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "threshold": {
                "label": "Threshold",
                "description": "A neighbour counts as flowing in only if it exceeds the centre cell by more than this (default 0)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "focal_statistics": {
            "name": "Focal Statistics",
            "description": "Moving-window neighborhood statistics (rectangle/circle/annulus/wedge; numeric and categorical).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "statistics": {
                "label": "Statistics",
                "description": "Statistic: mean, majority, maximum, median, minimum, minority, percentile, range, std, sum, or variety (default mean)."
              },
              "neighborhood": {
                "label": "Neighborhood",
                "description": "Neighborhood shape: rectangle, circle, annulus, or wedge (default rectangle)."
              },
              "width": {
                "label": "Width",
                "description": "Rectangle width in cells (default 3)."
              },
              "height": {
                "label": "Height",
                "description": "Rectangle height in cells (default 3)."
              },
              "radius": {
                "label": "Radius",
                "description": "Radius in cells for circle / wedge, and the outer radius for annulus (default 1)."
              },
              "inner_radius": {
                "label": "Inner Radius",
                "description": "Inner radius in cells for the annulus neighborhood (default 0)."
              },
              "start_angle": {
                "label": "Start Angle",
                "description": "Wedge start angle in degrees (0 = east, counterclockwise; default 0)."
              },
              "end_angle": {
                "label": "End Angle",
                "description": "Wedge end angle in degrees (0 = east, counterclockwise; default 90)."
              },
              "percentile_value": {
                "label": "Percentile Value",
                "description": "Percentile in [0, 100] for the percentile statistic (default 90)."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "If true (default), reduce over valid cells only; if false, any no-data cell in the window yields no-data."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to process (default 1)."
              }
            }
          },
          "forest_based_forecast": {
            "name": "Forest-based Forecast",
            "description": "Forecast a value forward at each location with a random forest trained on sliding lag windows of that location's own history, like ArcGIS Forest-based Forecast.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Timestamped features carrying a location id, a time field and a value field."
              },
              "location_field": {
                "label": "Location Field",
                "description": "Field identifying the location each observation belongs to."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Numeric time field used to order each location's series."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field to forecast."
              },
              "output": {
                "label": "Output",
                "description": "Optional output forecast table path. If omitted, stored in memory."
              },
              "forecast_steps": {
                "label": "Forecast Steps",
                "description": "Number of steps to forecast forward (default 3)."
              },
              "time_window": {
                "label": "Time Window",
                "description": "Number of prior values used as predictors (default: a quarter of the series length, at least 2)."
              },
              "validation_steps": {
                "label": "Validation Steps",
                "description": "Trailing steps held out to score RMSE (default 0, no validation)."
              },
              "n_trees": {
                "label": "N Trees",
                "description": "Number of trees in the forest (default 50, max 500)."
              },
              "min_leaf_size": {
                "label": "Min Leaf Size",
                "description": "Minimum training rows in a leaf (default 2)."
              },
              "max_depth": {
                "label": "Max Depth",
                "description": "Maximum tree depth (default 8)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic RNG driving bootstrapping and feature subsetting (default 42)."
              }
            }
          },
          "frequency_comparison": {
            "name": "Frequency Comparison",
            "description": "Counts, per cell, how many rasters in a stack are equal to / greater than / less than the corresponding cell of a reference value raster (ArcGIS Equal To Frequency, Greater Than Frequency and Less Than Frequency, plus the inclusive and negated operators). Neither registry can aggregate a comparison across a stack: cell_statistics has no reference input, raster_calculator expresses one comparison but cannot count across an arbitrary-length stack, and conditional_evaluation is a single-condition selector.",
            "params": {
              "value_raster": {
                "label": "Value Raster",
                "description": "Reference raster each stack layer is compared against, co-registered with the inputs. A single-band reference is broadcast to every band group; a multiband reference must have one band per group and advances with it."
              },
              "inputs": {
                "label": "Inputs",
                "description": "One multiband raster (each band is a layer) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Output count raster (0..n). If omitted, stored in memory."
              },
              "comparison": {
                "label": "Comparison",
                "description": "'equal' (default), 'greater', 'less', 'greater_equal', 'less_equal', or 'not_equal'."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Absolute tolerance for 'equal'/'not_equal' on floating-point data (default 0 = exact)."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "Skip no-data observations per cell (default true). When false, any no-data observation makes the cell no-data."
              },
              "process_as_multiband": {
                "label": "Process As Multiband",
                "description": "'single_band' (default): every band of every input is one layer of a single stack. 'multi_band': band i of every input forms its own stack, giving a multiband result."
              }
            }
          },
          "fuzzy_overlay": {
            "name": "Fuzzy Overlay",
            "description": "Rescale a raster to a 0..1 fuzzy membership surface (linear/gaussian/small/large/ms_small/ms_large), or combine several membership rasters with fuzzy AND/OR/PRODUCT/SUM/GAMMA, like ArcGIS Fuzzy Membership + Fuzzy Overlay.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Membership mode: input raster to transform into a 0..1 surface."
              },
              "inputs": {
                "label": "Inputs",
                "description": "Overlay mode: comma-separated list of ≥2 membership rasters to combine. Takes precedence over 'input'."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path. If omitted, the result is stored in memory."
              },
              "function": {
                "label": "Function",
                "description": "Membership function: 'linear' (default), 'gaussian', 'small', 'large', 'ms_small', 'ms_large'."
              },
              "overlay": {
                "label": "Overlay",
                "description": "Overlay operator: 'and' (min, default), 'or' (max), 'product', 'sum', 'gamma'."
              },
              "midpoint": {
                "label": "Midpoint",
                "description": "linear: value mapping to 0.5 is ignored (use min/max); gaussian/small/large: the function midpoint; ms_small/ms_large: the mean multiplier (default from band stats)."
              },
              "spread": {
                "label": "Spread",
                "description": "gaussian/small/large: spread (default gaussian 0.1, small/large 5); ms_small/ms_large: the standard-deviation multiplier (default 1)."
              },
              "min": {
                "label": "Min",
                "description": "linear: value mapping to membership 0 (default band minimum). If min>max the ramp is decreasing."
              },
              "max": {
                "label": "Max",
                "description": "linear: value mapping to membership 1 (default band maximum)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "gamma overlay exponent in [0,1] (default 0.9)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to transform in membership mode (default 1)."
              }
            }
          },
          "gaussian_geostatistical_simulations": {
            "name": "Gaussian Geostatistical Simulations",
            "description": "Sequential Gaussian simulation: N equiprobable conditional realizations of a field that honour the sample data (like ArcGIS Gaussian Geostatistical Simulations) — the conditional multi-realization output the single-surface empirical_bayesian_kriging / ordinary kriging and the unconditional turning_bands_simulation don't provide. Seeded and deterministic.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer with the conditioning values (projected CRS)."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field holding the value to simulate."
              },
              "output": {
                "label": "Output",
                "description": "Output multi-band raster (one band per realization). If omitted, stored in memory."
              },
              "num_realizations": {
                "label": "Num Realizations",
                "description": "Number of realizations / output bands (default 10)."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units. Default: extent's longer side / 100."
              },
              "variogram_model": {
                "label": "Variogram Model",
                "description": "'exponential' (default), 'spherical', or 'gaussian'."
              },
              "nugget": {
                "label": "Nugget",
                "description": "Manual nugget; omit to fit from the data."
              },
              "sill": {
                "label": "Sill",
                "description": "Manual partial sill; omit to fit from the data."
              },
              "range": {
                "label": "Range",
                "description": "Manual range; omit to fit from the data."
              },
              "max_neighbors": {
                "label": "Max Neighbors",
                "description": "Max known points used per cell's kriging (default 16)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic RNG (default 1)."
              },
              "output_mean": {
                "label": "Output Mean",
                "description": "Optional raster path for the ensemble mean."
              },
              "output_std": {
                "label": "Output Std",
                "description": "Optional raster path for the ensemble standard deviation."
              }
            }
          },
          "generalized_linear_regression": {
            "name": "Generalized Linear Regression",
            "description": "Global regression (gaussian/OLS, poisson, or logistic) of a dependent field on explanatory fields via IRLS, with fitted + residual output fields and full diagnostics: per-term coefficient, standard error, t/z, probability and VIF, plus AICc, R²/deviance and the studentized Koenker (Breusch–Pagan) heteroskedasticity test — like ArcGIS Generalized Linear Regression.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer (points, or other geometries — geometry is passed through unchanged)."
              },
              "dependent_field": {
                "label": "Dependent Field",
                "description": "Dependent (response) numeric field. For 'logistic' it must be 0/1."
              },
              "explanatory_fields": {
                "label": "Explanatory Fields",
                "description": "Comma-separated explanatory numeric field(s)."
              },
              "family": {
                "label": "Family",
                "description": "Model family: 'gaussian' (OLS, default), 'poisson' (log link, counts) or 'logistic' (logit link, 0/1)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "report": {
                "label": "Report",
                "description": "Optional CSV path for the coefficient + model diagnostics report."
              }
            }
          },
          "generate_breach_lines": {
            "name": "Generate Breach Lines",
            "description": "Given depression polygons and a DEM, emit the polyline along which each depression would be breached to drain, using a minimum-breaching-cost, shortest-path or minimum-elevation-change criterion, with cut depth and excavated volume per breach. Like ArcGIS Generate Breach Lines.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Depression polygons (e.g. the output of delineate_depressions)."
              },
              "dem": {
                "label": "Dem",
                "description": "Surface raster the breach is carved through."
              },
              "output": {
                "label": "Output",
                "description": "Output breach-line path. If omitted, stored in memory."
              },
              "connection_points": {
                "label": "Connection Points",
                "description": "Optional point features constraining where a breach may terminate."
              },
              "method": {
                "label": "Method",
                "description": "'minimum_breaching_cost' (default), 'shortest_path' or 'minimum_elevation_change'."
              },
              "max_length": {
                "label": "Max Length",
                "description": "Drop breaches longer than this (map units); such depressions are left unbreached."
              }
            }
          },
          "generate_near_table": {
            "name": "Generate Near Table",
            "description": "For each input feature, list the k nearest (or all within a search radius) near-layer features with distance, rank, optional bearing angle and near-XY — a multi-neighbour proximity table, like ArcGIS Generate Near Table.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points, lines, or polygons) whose proximity is measured."
              },
              "near_features": {
                "label": "Near Features",
                "description": "Near vector layer to search against (points, lines, or polygons)."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (one Point per near match). If omitted, stored in memory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Only keep near features within this distance (map units). Required when closest_count = 0 (all within radius)."
              },
              "closest_count": {
                "label": "Closest Count",
                "description": "Number of nearest near features per input feature (k, default 1). Use 0 to return every near feature within search_radius."
              },
              "angle": {
                "label": "Angle",
                "description": "Add NEAR_ANGLE (arithmetic bearing in degrees, east = 0, CCW). Default false."
              },
              "location": {
                "label": "Location",
                "description": "Add NEAR_X / NEAR_Y columns for the near location. Default false."
              }
            }
          },
          "generate_network_swm": {
            "name": "Generate Network SWM",
            "description": "Builds a spatial weights matrix in which neighbours and weights come from travel distance along a line network rather than straight-line geometry (ArcGIS Generate Network Spatial Weights). generate_spatial_weights_matrix offers only Euclidean and topological conceptualizations (knn, fixed distance band, inverse distance, contiguity, Delaunay), so for network-constrained phenomena it links features that cannot reach each other and biases every downstream statistic. Output uses the same table schema, so global_morans_i, local_morans_i_lisa, getis_ord_gi_star and compare_spatial_weights consume it unchanged.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point features to weight."
              },
              "network": {
                "label": "Network",
                "description": "Line network the travel distances are measured along."
              },
              "output": {
                "label": "Output",
                "description": "Weights table (CSV by extension, or a geometry-less vector table), in the same origin/neighbor/weight schema generate_spatial_weights_matrix emits. If omitted, stored in memory."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Field holding each feature's unique id. Default: the 0-based feature index, matching generate_spatial_weights_matrix."
              },
              "impedance_field": {
                "label": "Impedance Field",
                "description": "Network cost field. Default: each segment's geometric length."
              },
              "distance_cutoff": {
                "label": "Distance Cutoff",
                "description": "Maximum network impedance a neighbour may lie at. Default: unlimited."
              },
              "max_neighbors": {
                "label": "Max Neighbors",
                "description": "Cap on neighbours per origin, keeping the nearest. Default: unlimited."
              },
              "conceptualization": {
                "label": "Conceptualization",
                "description": "'fixed' (default, binary weight 1 within the cutoff) or 'inverse' (weight = 1 / impedance^exponent)."
              },
              "exponent": {
                "label": "Exponent",
                "description": "Decay exponent for 'inverse' (default 1)."
              },
              "row_standardization": {
                "label": "Row Standardization",
                "description": "Divide each origin's weights by their row sum so every origin totals 1. Default false, matching generate_spatial_weights_matrix."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Distance within which two network vertices are welded into one node, in CRS units (default 1e-6). A network whose segments almost meet would otherwise disconnect silently, and every affected origin would emit zero rows."
              },
              "search_tolerance": {
                "label": "Search Tolerance",
                "description": "Maximum snapping distance from a point to the network. Points further away are reported as unsnapped rather than silently attached to a distant node."
              }
            }
          },
          "generate_od_links": {
            "name": "Generate Origin-Destination Links",
            "description": "Draw straight desire lines from origin points to destination points — matched by a shared id, within a distance, and/or to the k nearest — each carrying origin/destination ids and length, like ArcGIS Generate Origin-Destination Links.",
            "params": {
              "origins": {
                "label": "Origins",
                "description": "Origin point layer (Point or MultiPoint)."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Destination point layer (Point or MultiPoint)."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path (driver from extension). If omitted, stored in memory."
              },
              "num_nearest": {
                "label": "Num Nearest",
                "description": "Keep only the k nearest destinations per origin (after any id/distance filter)."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Keep only destinations within this distance of the origin (map units)."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Field present in BOTH layers; link only pairs whose values match. Also written as 'link_id'."
              },
              "origin_id_field": {
                "label": "Origin Id Field",
                "description": "Field in origins to write as 'origin_id' (default: the feature index)."
              },
              "dest_id_field": {
                "label": "Dest Id Field",
                "description": "Field in destinations to write as 'dest_id' (default: the feature index)."
              }
            }
          },
          "generate_points_along_3d_lines": {
            "name": "Generate Points Along 3D Lines",
            "description": "Generate evenly spaced points along 3D lines measured in true 3D distance (not the 2D plan length the bundled points_along_lines uses), with interpolated Z, optional end points and a cumulative 3D chainage field. Like ArcGIS Generate Points Along 3D Lines.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input 3D polyline features."
              },
              "output": {
                "label": "Output",
                "description": "Output point path. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'distance' (default), 'percentage', or 'distance_field'."
              },
              "distance": {
                "label": "Distance",
                "description": "Spacing in map units for method 'distance'."
              },
              "percentage": {
                "label": "Percentage",
                "description": "Spacing as a percentage (0-100) of each line's 3D length for method 'percentage'."
              },
              "distance_field": {
                "label": "Distance Field",
                "description": "Field giving a per-feature spacing for method 'distance_field'."
              },
              "include_end_points": {
                "label": "Include End Points",
                "description": "Also emit each line's start and end vertices (default false)."
              },
              "add_chainage": {
                "label": "Add Chainage",
                "description": "Write a CHAINAGE field holding cumulative 3D distance from the line start (default false)."
              }
            }
          },
          "generate_spatial_weights_matrix": {
            "name": "Generate Spatial Weights Matrix",
            "description": "Emit a reusable long-format neighbour/weights table (origin_id, neighbor_id, weight) from a chosen conceptualization — KNN, fixed distance band, inverse distance, contiguity (edges / edges+corners), or Delaunay — with optional row standardization, like ArcGIS Generate Spatial Weights Matrix.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points/lines/polygons; contiguity requires polygons)."
              },
              "output": {
                "label": "Output",
                "description": "Output table path — a CSV (extension .csv) or a geometry-less vector table. If omitted, stored in memory."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Field holding each feature's unique id. Default: the 0-based feature index."
              },
              "method": {
                "label": "Method",
                "description": "Conceptualization of spatial relationships: 'knn', 'fixed_distance_band', 'inverse_distance', 'contiguity_edges', 'contiguity_edges_corners', or 'delaunay'. Default 'knn'."
              },
              "number_of_neighbors": {
                "label": "Number Of Neighbors",
                "description": "Number of nearest neighbours k (method = knn). Default 8."
              },
              "threshold_distance": {
                "label": "Threshold Distance",
                "description": "Distance band cutoff in map units. Required for fixed_distance_band; optional cutoff for inverse_distance (unset = all other features)."
              },
              "exponent": {
                "label": "Exponent",
                "description": "Distance decay exponent p for inverse_distance (weight = 1/d^p). Default 1."
              },
              "row_standardization": {
                "label": "Row Standardization",
                "description": "Divide each origin's weights by their row sum so every origin's weights total 1. Default false."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Quantize vertices onto a grid of this size (CRS units) before matching borders for contiguity. Default 0 (exact coordinates)."
              }
            }
          },
          "generate_subset_polygons": {
            "name": "Generate Subset Polygons",
            "description": "Partitions a dense point layer into compact, non-overlapping polygons that tile the point extent, each holding between a minimum and maximum number of points (ArcGIS Generate Subset Polygons). The standard preprocessing step for interpolating very large point sets. Unlike the bundled fixed grids it adapts to density (median k-d split), unlike voronoi_diagram it groups points rather than making one cell each, and unlike group_by_proximity it emits polygons and honours size bounds.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output polygon path. If omitted, the result is stored in memory."
              },
              "output_points": {
                "label": "Output Points",
                "description": "Optional path for the input points tagged with their subset id. If omitted, stored in memory (still returned)."
              },
              "min_points_per_subset": {
                "label": "Min Points Per Subset",
                "description": "Lower bound on points per subset (default 50)."
              },
              "max_points_per_subset": {
                "label": "Max Points Per Subset",
                "description": "Upper bound on points per subset (default 200)."
              },
              "coincident_points": {
                "label": "Coincident Points",
                "description": "'single' (default; exactly coincident points count once when sizing) or 'all' (each counts individually)."
              },
              "clip_to_hull": {
                "label": "Clip To Hull",
                "description": "Clip subset polygons to the convex hull of the points so the result hugs the data rather than its bounding box (default true)."
              }
            }
          },
          "generate_transects_along_lines": {
            "name": "Generate Transects Along Lines",
            "description": "Walk each line at a fixed interval and emit perpendicular transect lines of a given length (centred or offset), for shoreline-change, riparian, and cross-section sampling — like ArcGIS Generate Transects Along Lines.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path (driver from extension). If omitted, stored in memory."
              },
              "interval": {
                "label": "Interval",
                "description": "Spacing between transects along each line, in CRS units. Required."
              },
              "length": {
                "label": "Length",
                "description": "Total transect length, in CRS units. Required."
              },
              "offset": {
                "label": "Offset",
                "description": "Signed offset of the transect centre from the line, in CRS units (0 = centred; +/- pushes to the left/right). Default 0."
              },
              "include_ends": {
                "label": "Include Ends",
                "description": "Also place a transect exactly at the start and end of each line. Default false."
              }
            }
          },
          "generate_trend_raster": {
            "name": "Generate Trend Raster",
            "description": "Fit a per-pixel temporal trend across a time series of co-registered rasters (like ArcGIS Generate Trend Raster): OLS slope/intercept/R² or non-parametric Mann-Kendall + Sen's slope with a p-value — the per-pixel temporal trend the bundled trend_surface (spatial) and change_vector_analysis (two-date) can't produce.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma-separated list of co-registered single-band raster paths, in time order (>= 3)."
              },
              "output": {
                "label": "Output",
                "description": "Output slope raster (Sen's slope for mann_kendall). If omitted, stored in memory."
              },
              "times": {
                "label": "Times",
                "description": "Comma-separated numeric times (e.g. years) matching 'inputs'. Default 0,1,2,..."
              },
              "method": {
                "label": "Method",
                "description": "'linear' (OLS; default) or 'mann_kendall' (non-parametric + Sen's slope)."
              },
              "intercept_output": {
                "label": "Intercept Output",
                "description": "linear only: optional output raster of the OLS intercept."
              },
              "significance_output": {
                "label": "Significance Output",
                "description": "Optional output raster: R² (linear) or the Mann-Kendall two-sided p-value (mann_kendall)."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum non-no-data observations per pixel (default 3)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from each input (default 1)."
              }
            }
          },
          "geodetic_densify": {
            "name": "Geodetic Densify",
            "description": "Insert vertices along the true geodesic or rhumb (constant-bearing) path between existing vertices of a geographic (lon/lat) line or polygon layer, like ArcGIS's Geodetic Densify — so long segments follow the earth's curvature instead of a planar chord.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line or polygon vector layer, assumed geographic (lon/lat, EPSG:4326-style)."
              },
              "geodetic_type": {
                "label": "Geodetic Type",
                "description": "Path type between vertices: 'geodesic' (default; shortest path over the WGS84 ellipsoid) or 'rhumb'/'loxodrome' (constant true bearing)."
              },
              "max_segment_length": {
                "label": "Max Segment Length",
                "description": "Target maximum spacing, in meters, between consecutive vertices after densifying. Exactly one of max_segment_length / vertices_per_segment must be given."
              },
              "vertices_per_segment": {
                "label": "Vertices Per Segment",
                "description": "Alternative to max_segment_length: insert exactly this many evenly-spaced vertices into every original segment, regardless of its length. Exactly one of max_segment_length / vertices_per_segment must be given."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path; if omitted, stored in memory."
              }
            }
          },
          "geotagged_photos_to_points": {
            "name": "GeoTagged Photos To Points",
            "description": "Read a folder of geotagged photos and build a WGS-84 point layer with each photo's path, capture datetime, altitude, camera bearing (GPS image direction), and make/model — parsed from EXIF metadata only (no pixels decoded), like ArcGIS GeoTagged Photos To Points.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Folder path containing photos (JPEG/TIFF) to read EXIF GPS metadata from."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector (driver from extension). If omitted, stored in memory."
              },
              "recursive": {
                "label": "Recursive",
                "description": "Descend into subfolders when scanning for photos. Default false."
              },
              "only_geotagged": {
                "label": "Only Geotagged",
                "description": "Skip images that carry no GPS position (default true). When false, non-geotagged images are emitted with a null geometry."
              }
            }
          },
          "getis_ord_general_g": {
            "name": "High/Low Clustering (Getis-Ord General G)",
            "description": "Compute the global Getis-Ord General G statistic — a single z-score and p-value telling you whether HIGH or LOW values are globally clustered, like ArcGIS High/Low Clustering (Getis-Ord General G).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer. Points use their coordinates; other geometries use their vertex-mean representative point (contiguity weights need polygons)."
              },
              "field": {
                "label": "Field",
                "description": "Numeric, non-negative field to test for high/low clustering."
              },
              "weights": {
                "label": "Weights",
                "description": "Spatial-weights scheme: 'distance_band' (default), 'k_nearest', 'queen', or 'rook'."
              },
              "distance_band": {
                "label": "Distance Band",
                "description": "Threshold distance (CRS units) for the 'distance_band' scheme. Default: the maximum nearest-neighbour distance (every feature has >=1 neighbour)."
              },
              "k": {
                "label": "K",
                "description": "Number of neighbours for the 'k_nearest' scheme (default 8)."
              },
              "row_standardize": {
                "label": "Row Standardize",
                "description": "Row-standardize the weight matrix so each row sums to 1 (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Optional CSV path for the one-row report. Always returned in the result."
              }
            }
          },
          "goldstein_phase_filter": {
            "name": "Goldstein Phase Filter",
            "description": "Adaptive spectral (Goldstein) filtering of interferometric SAR phase, the step that makes phase unwrapping viable (ArcGIS Apply Complex Data Filter). Round 17's unwrap_phase fails on a raw interferogram because noise residues force branch cuts; the entire bundled lee/frost/kuan/wiener/gaussian filter family works on real-valued intensity and cannot be used here, since averaging wrapped phase across the +/-pi discontinuity destroys it. Filters the complex signal patch-by-patch in the frequency domain and reports the residue count before and after.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Interferogram: a two-band I/Q raster, or a single-band wrapped-phase raster in radians (unit amplitude is assumed)."
              },
              "output": {
                "label": "Output",
                "description": "Output two-band (I, Q) filtered complex raster. If omitted, stored in memory."
              },
              "output_phase": {
                "label": "Output Phase",
                "description": "Output single-band filtered wrapped phase in radians, in (-pi, pi]. Always produced; stored in memory when no path is given."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Filter strength in [0, 1] (default 0.5). 0 leaves the phase untouched; 1 is maximally aggressive."
              },
              "outer_window_size": {
                "label": "Outer Window Size",
                "description": "FFT patch size in cells (default 32). Rounded up to a power of two."
              },
              "inner_window_size": {
                "label": "Inner Window Size",
                "description": "Step between patches in cells (default = outer/4). Smaller means more overlap and smoother blending; must not exceed the outer window."
              },
              "spectrum_smoothing": {
                "label": "Spectrum Smoothing",
                "description": "Width in bins of the moving-average applied to the patch spectrum before exponentiation (default 3, must be odd)."
              }
            }
          },
          "gpx_to_features": {
            "name": "GPX To Features",
            "description": "Parse a GPX file into waypoint points and/or track/route polylines, carrying ele/time/name.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Path to a .gpx file (GPS Exchange Format XML)."
              },
              "points_output": {
                "label": "Points Output",
                "description": "Optional output point vector path for waypoints (driver from its extension). If neither output is given, waypoints are stored in memory."
              },
              "lines_output": {
                "label": "Lines Output",
                "description": "Optional output line vector path for tracks and routes (driver from its extension)."
              }
            }
          },
          "graphic_buffer": {
            "name": "Graphic Buffer",
            "description": "Buffer features with a choice of end-cap (round/square/butt) and corner-join (round/miter/bevel) styles, with a miter limit — the squared/mitered buffer geometry that round-only buffers cannot produce.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "distance": {
                "label": "Distance",
                "description": "Buffer distance in the layer's CRS units. Must be positive."
              },
              "cap": {
                "label": "Cap",
                "description": "End-cap style for line/point ends: 'round' (default), 'square', or 'butt' (alias 'flat')."
              },
              "join": {
                "label": "Join",
                "description": "Corner-join style: 'round' (default), 'miter', or 'bevel'."
              },
              "miter_limit": {
                "label": "Miter Limit",
                "description": "Ratio of miter length to buffer distance beyond which a mitered corner is beveled (ArcGIS/JTS default 10). Must be >= 1. Only used when join='miter'."
              },
              "dissolve": {
                "label": "Dissolve",
                "description": "When true, union all buffers into one dissolved (multi)polygon feature. Default false (one buffer per input feature, attributes preserved)."
              }
            }
          },
          "greater_than_or_equal_to": {
            "name": "GreaterThanOrEqualTo",
            "description": "Tests whether the first raster is greater than or equal to the second on a cell-by-cell basis.",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "grid_index_features": {
            "name": "Grid Index Features",
            "description": "Build a map-series index grid of page-sized rectangles with page names (A1, B3, ... or sequential), scale-derived sizing, and an optional data-intersection filter — like ArcGIS Grid Index Features, plus a strip mode that follows a route with rotated pages like ArcGIS Strip Map Index Features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer. Supplies the extent when no explicit extent is given, the route for strip mode, and the features tested by intersect_only."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector of index pages (driver from extension). If omitted, stored in memory."
              },
              "mode": {
                "label": "Mode",
                "description": "grid (default): tile a rectangular extent. strip: follow a route line with rotated overlapping pages."
              },
              "x_min": {
                "label": "X Min",
                "description": "Explicit extent minimum X (CRS units). Give all four of x_min/y_min/x_max/y_max to override the input extent."
              },
              "y_min": {
                "label": "Y Min",
                "description": "Explicit extent minimum Y (CRS units)."
              },
              "x_max": {
                "label": "X Max",
                "description": "Explicit extent maximum X (CRS units)."
              },
              "y_max": {
                "label": "Y Max",
                "description": "Explicit extent maximum Y (CRS units)."
              },
              "tile_width": {
                "label": "Tile Width",
                "description": "Page width in CRS units. Give both tile_width and tile_height, or use page_size + map_scale."
              },
              "tile_height": {
                "label": "Tile Height",
                "description": "Page height in CRS units (page length along the route in strip mode)."
              },
              "page_size": {
                "label": "Page Size",
                "description": "Paper page preset (a0..a4, letter, legal, tabloid) whose metric dimensions are multiplied by map_scale to size each page. Requires map_scale."
              },
              "map_scale": {
                "label": "Map Scale",
                "description": "Map-scale denominator (e.g. 24000 for 1:24,000). With page_size, tile size = paper metres × map_scale (metric CRS assumed)."
              },
              "origin_x": {
                "label": "Origin X",
                "description": "X of the grid origin the tile boundaries align to. Default: extent minimum X."
              },
              "origin_y": {
                "label": "Origin Y",
                "description": "Y of the grid origin the tile boundaries align to. Default: extent minimum Y."
              },
              "naming": {
                "label": "Naming",
                "description": "Page naming scheme: alphanumeric (default; column letter + row number, e.g. A1) or sequential (reading-order number)."
              },
              "intersect_only": {
                "label": "Intersect Only",
                "description": "When true, drop pages that do not intersect any input feature. Requires input. Default false."
              },
              "route": {
                "label": "Route",
                "description": "Strip mode: line vector layer to follow. Defaults to the first line feature in input."
              },
              "overlap": {
                "label": "Overlap",
                "description": "Strip mode: fraction [0,1) by which consecutive pages overlap along the route. Default 0.05."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Output EPSG code when the extent is given explicitly and there is no input layer to inherit a CRS from."
              }
            }
          },
          "group_by_proximity": {
            "name": "Group By Proximity",
            "description": "Tag features with a GROUP_ID for single-linkage spatial connected components — features within a distance ('near') or touching ('intersects'), optionally sharing an attribute value — like ArcGIS Group By Proximity.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry type)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "relationship": {
                "label": "Relationship",
                "description": "'near' (within 'spatial_near_distance', default) or 'intersects' (touching, distance 0)."
              },
              "spatial_near_distance": {
                "label": "Spatial Near Distance",
                "description": "Search distance in map units for 'near' (default 0)."
              },
              "attribute_field": {
                "label": "Attribute Field",
                "description": "Optional field; features only group when they share this attribute value."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Name of the output group-id field (default 'GROUP_ID')."
              }
            }
          },
          "gtfs_to_features": {
            "name": "GTFS To Features",
            "description": "Parse a GTFS transit feed into stop points and route lines, optionally with per-stop service-frequency counts.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Path to an extracted GTFS feed directory (folder of *.txt files: stops.txt, shapes.txt, trips.txt, ...)."
              },
              "stops_output": {
                "label": "Stops Output",
                "description": "Optional output point vector path for stops (driver from its extension). If neither output is given, stops are stored in memory."
              },
              "shapes_output": {
                "label": "Shapes Output",
                "description": "Optional output line vector path for route shapes (driver from its extension)."
              },
              "frequency": {
                "label": "Frequency",
                "description": "When true, count each stop's scheduled departures from stop_times.txt into an n_departures field. Default false."
              },
              "start_time": {
                "label": "Start Time",
                "description": "Optional HH:MM:SS lower bound for the frequency window (GTFS times may exceed 24:00:00)."
              },
              "end_time": {
                "label": "End Time",
                "description": "Optional HH:MM:SS upper bound for the frequency window."
              }
            }
          },
          "h3_polyfill": {
            "name": "H3 Polyfill",
            "description": "Cover input polygons with H3 discrete-global-grid cells at a chosen resolution.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path (must be geographic lon/lat, EPSG:4326) or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path; the driver is taken from its extension (.geojson, .fgb, .parquet, ...). If omitted, the layer is stored in memory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0 (coarsest) to 15 (finest); default 8 (~0.7 km² cells)."
              }
            }
          },
          "h3_to_vector": {
            "name": "H3 Cells to Polygons",
            "description": "Turn a column of H3 cell ids into cell-boundary polygons, copying other attributes through.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path (or in-memory handle) with a field of H3 cell ids."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path; the driver is taken from its extension (.geojson, .fgb, .parquet, ...). If omitted, the layer is stored in memory."
              },
              "field": {
                "label": "Field",
                "description": "Name of the text field holding the H3 cell id; default 'h3'."
              }
            }
          },
          "hdbscan": {
            "name": "HDBSCAN Clustering",
            "description": "Hierarchical density-based clustering (HDBSCAN*): mutual-reachability MST, condensed cluster tree, and excess-of-mass selection, with per-point membership probability and outlier score — handles variable density with no epsilon, like the HDBSCAN option of ArcGIS Density-based Clustering.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (projected CRS; distances in its units)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (a copy of the input with cluster fields). If omitted, stored in memory."
              },
              "min_cluster_size": {
                "label": "Min Cluster Size",
                "description": "Smallest grouping considered a cluster (>= 2). Default 5."
              },
              "min_samples": {
                "label": "Min Samples",
                "description": "Neighbourhood size for the core-distance density estimate (higher = more points called noise). Default: min_cluster_size."
              }
            }
          },
          "hot_spot_analysis_comparison": {
            "name": "Hot Spot Analysis Comparison",
            "description": "Compare two Getis-Ord hot-spot result layers: match their locations, classify each transition (hot_to_hot, hot_to_cold, none_to_hot, ...), and run a seeded permutation test of overall agreement — like ArcGIS Hot Spot Analysis Comparison.",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First hot-spot result layer (points or polygons)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second hot-spot result layer."
              },
              "bin_field": {
                "label": "Bin Field",
                "description": "Significance field present on both inputs (positive = hot, negative = cold)."
              },
              "significance": {
                "label": "Significance",
                "description": "Absolute-value threshold below which a location is 'none' (default 0)."
              },
              "match_field": {
                "label": "Match Field",
                "description": "Optional id field present on both inputs used to join locations; otherwise nearest centroid."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum centroid distance for nearest-location matching (map units). Unlimited if omitted."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Number of permutations for the global agreement test (default 499)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the deterministic permutation RNG (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "identify_narrow_polygons": {
            "name": "Identify Narrow Polygons",
            "description": "Flag polygons that are narrower than a width tolerance somewhere (slivers and thin necks), annotating each with an is_narrow flag and an estimated minimum width.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "width_tolerance": {
                "label": "Width Tolerance",
                "description": "Width threshold in CRS units. A polygon is narrow where it is thinner than this. Required."
              },
              "min_narrow_area": {
                "label": "Min Narrow Area",
                "description": "Minimum narrow-portion area (CRS units squared) required to flag a polygon; smaller narrow areas are ignored as noise. Default width_tolerance squared, which also absorbs the opening's minor corner rounding."
              },
              "narrow_only": {
                "label": "Narrow Only",
                "description": "When true, drop non-narrow features and output only the flagged narrow polygons. Default false (annotate and keep all features)."
              }
            }
          },
          "idw_3d": {
            "name": "IDW 3D",
            "description": "Volumetric inverse-distance interpolation of 3D point observations into a stack of elevation levels (one raster band per level), with an elevation inflation factor handling vertical-vs-horizontal anisotropy and optional leave-one-out cross-validation points. Like ArcGIS IDW3D.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input 3D point features."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field holding the value to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband raster path (one band per elevation level). If omitted, stored in memory."
              },
              "z_field": {
                "label": "Z Field",
                "description": "Field supplying elevation; defaults to the geometry Z."
              },
              "power": {
                "label": "Power",
                "description": "Inverse-distance exponent (default 2)."
              },
              "elev_inflation_factor": {
                "label": "Elev Inflation Factor",
                "description": "Multiplier applied to vertical separation before 3D distance is computed (default 1). Values > 1 make vertical distance count for more, matching the shorter vertical correlation scale of most volumetric data."
              },
              "x_spacing": {
                "label": "X Spacing",
                "description": "Output cell size in X (default: extent / 100)."
              },
              "y_spacing": {
                "label": "Y Spacing",
                "description": "Output cell size in Y (default: same as x_spacing)."
              },
              "z_spacing": {
                "label": "Z Spacing",
                "description": "Vertical spacing between output levels (default: z range / 10)."
              },
              "z_min": {
                "label": "Z Min",
                "description": "Lowest output level (default: the data minimum)."
              },
              "z_max": {
                "label": "Z Max",
                "description": "Highest output level (default: the data maximum)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Maximum samples per prediction (default 12)."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Optional maximum (inflated) 3D search distance; samples beyond it are ignored."
              },
              "output_cv_features": {
                "label": "Output Cv Features",
                "description": "Optional path for leave-one-out cross-validation points carrying observed, predicted and residual values."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG code stamped on the output raster (default: the input layer's CRS)."
              }
            }
          },
          "incremental_spatial_autocorrelation": {
            "name": "Incremental Spatial Autocorrelation",
            "description": "Compute global Moran's I across a series of increasing distance bands and report the z-score curve with its first and maximum peaks — the defensible way to pick a clustering distance, like ArcGIS Incremental Spatial Autocorrelation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (other geometries use their vertex-mean representative point). Use a projected CRS."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field to test for spatial autocorrelation."
              },
              "output": {
                "label": "Output",
                "description": "Optional CSV path for the per-band table. Always returned in the result."
              },
              "begin_distance": {
                "label": "Begin Distance",
                "description": "First band distance, in CRS units. Default: the maximum nearest-neighbour distance (every feature has >=1 neighbour)."
              },
              "increment": {
                "label": "Increment",
                "description": "Distance added at each band, in CRS units. Default: the begin distance."
              },
              "num_bands": {
                "label": "Num Bands",
                "description": "Number of distance bands to evaluate (default 10)."
              }
            }
          },
          "inside_3d": {
            "name": "Inside 3D",
            "description": "Determines which 3D features (points, polylines or solids) fall inside closed volumetric containers, optionally reporting the contained length or vertex fraction (ArcGIS Inside 3D). Every containment predicate in either registry projects to the XY plane, so a sensor above a footprint or a pipe beneath a parcel currently tests as inside it. Containers follow the triangle-mesh convention of the shipped buffer_3d and minimum_bounding_volume.",
            "params": {
              "target": {
                "label": "Target",
                "description": "3D features to test: points, polylines, or triangle-mesh solids."
              },
              "container": {
                "label": "Container",
                "description": "Closed 3D features (triangle-mesh solids) acting as containers."
              },
              "output": {
                "label": "Output",
                "description": "Optional output table path of target/container pairs. If omitted, stored in memory."
              },
              "mode": {
                "label": "Mode",
                "description": "'simple' (default) reports whether the target is inside; 'complex' adds the contained length and inside fraction."
              },
              "output_features": {
                "label": "Output Features",
                "description": "Optional path for the clipped inside portions of line targets (complex mode). If omitted, stored in memory (still returned)."
              }
            }
          },
          "integrate": {
            "name": "Integrate",
            "description": "Snap all vertices across all features within a cluster tolerance to a shared location so nearly-coincident shared boundaries become exactly coincident, optionally inserting T-junction vertices onto nearby edges — like ArcGIS Integrate.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry type)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from extension). If omitted, stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Cluster distance in CRS units: vertices within this distance snap to a shared location. Required."
              },
              "snap_to_edges": {
                "label": "Snap To Edges",
                "description": "Also insert a vertex where one feature's vertex lands within tolerance of another feature's segment (T-junctions). Default true."
              }
            }
          },
          "interpolate_from_spatiotemporal_points": {
            "name": "Interpolate From Spatiotemporal Points",
            "description": "Bin timestamped point observations into regular time slices and interpolate each onto one shared grid, producing a co-registered multidimensional raster, like ArcGIS Interpolate From Spatiotemporal Points.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Timestamped point features."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field to interpolate."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Timestamp field: numeric seconds since epoch, or ISO-8601 text."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path for the first slice. Later slices are written alongside with a _t<index> suffix. If omitted, all slices are stored in memory."
              },
              "time_step": {
                "label": "Time Step",
                "description": "daily | weekly | monthly (default) | quarterly | yearly."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units. Defaults to 1/50th of the larger extent dimension."
              },
              "method": {
                "label": "Method",
                "description": "idw (default) | nearest | mean | median."
              },
              "power": {
                "label": "Power",
                "description": "IDW distance exponent (default 2)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Number of nearest observations used per cell (default 8)."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Minimum observations required for a slice to be interpolated; sparser slices emit all-nodata rather than a misleading surface (default 3)."
              }
            }
          },
          "interpolate_shape": {
            "name": "Interpolate Shape",
            "description": "Drape points/lines/polygons on a surface raster: densify, sample Z per vertex (bilinear or nearest), write 3D geometry, and add surface metrics (z_min/z_max/z_mean, 3D surface length, average slope), like ArcGIS Interpolate Shape / Add Surface Information.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points, lines, or polygons) sharing the surface's CRS."
              },
              "surface": {
                "label": "Surface",
                "description": "Elevation/surface raster to sample."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Densification interval in CRS units; long segments are split so they follow the surface. Default: the raster cell size."
              },
              "method": {
                "label": "Method",
                "description": "Surface sampling: 'bilinear' (default) or 'nearest'."
              },
              "attributes": {
                "label": "Attributes",
                "description": "Comma list of metric columns to add: z_min,z_max,z_mean,surf_len,avg_slope. Default: all."
              },
              "band": {
                "label": "Band",
                "description": "1-based surface band to sample (default 1)."
              }
            }
          },
          "interpolate_with_barriers": {
            "name": "Interpolate With Barriers",
            "description": "Interpolate point measurements to a raster while respecting absolute barriers (shorelines, ridges, faults, walls): influence travels around barriers via cost/geodesic distance, not across them — IDW or a first-order local-polynomial kernel, like ArcGIS Kernel Interpolation With Barriers / Spline With Barriers. The bundled idw/kriging/natural-neighbour/spline tools are all barrier-blind.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of measurements."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field on the points holding the value to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Output interpolated raster (GeoTIFF). If omitted, stored in memory."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional barrier vector layer (polylines or polygons). Rasterized as impassable cells so influence must route around them. Omit for a barrier-free control."
              },
              "method": {
                "label": "Method",
                "description": "'idw' (default) or 'local_polynomial' (first-order weighted planar fit with a Gaussian geodesic-distance kernel)."
              },
              "power": {
                "label": "Power",
                "description": "IDW distance-decay exponent (default 2)."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Gaussian kernel bandwidth for local_polynomial (distance units). Default: the search radius, or the grid extent otherwise."
              },
              "radius": {
                "label": "Radius",
                "description": "Search radius as a geodesic (cost) distance: samples beyond it do not influence a cell, and cells unreachable within it become no-data. Metres for a geographic CRS, CRS units otherwise. Default: unbounded."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units (degrees for a geographic CRS). Default: sized so the longer axis spans ~256 cells."
              }
            }
          },
          "intersect_3d": {
            "name": "Intersect 3D",
            "description": "Computes the volume shared by overlapping closed 3D solids, pair by pair, with an optional bounding solid for each intersection (ArcGIS Intersect 3D). union_3d is the only 3D overlay in either registry and answers only the combined-volume question; inside_3d is a containment predicate for points and lines, and polygon_volume / surface_volume measure against a reference plane. Per-solid volumes are exact; the intersection is estimated by voxel occupancy at a reported resolution.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Closed 3D solid features (triangle-mesh MultiPolygons with Z, as buffer_3d and minimum_bounding_volume emit)."
              },
              "input2": {
                "label": "Input2",
                "description": "Optional second solid layer. When omitted, every pair within 'input' is intersected (ArcGIS's single-input mode)."
              },
              "output": {
                "label": "Output",
                "description": "Output table of intersecting pairs, one row per non-empty intersection. If omitted, stored in memory."
              },
              "mode": {
                "label": "Mode",
                "description": "'table' (default): attributes only. 'solid': also emit each intersection's bounding solid as geometry. The measured volume is always an attribute — no exact merged mesh is claimed."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Voxel cells along the longest axis of each pair's shared bounding box (default 64). Higher is more accurate and slower."
              }
            }
          },
          "intersect_3d_line_with_surface": {
            "name": "Intersect 3D Line With Surface",
            "description": "Splits 3D lines at every point where they cross an elevation surface or a multipatch, tagging each piece above or below and emitting the crossing points (ArcGIS Intersect 3D Line With Surface / Intersect 3D Line With Multi Patch). Round 17's intersect_3d takes closed solids rather than lines, inside_3d is a containment predicate that neither cuts the geometry nor locates the crossings, and interpolate_shape drapes a line onto a surface, discarding the line z the comparison depends on.",
            "params": {
              "input": {
                "label": "Input",
                "description": "3D line layer, with z-bearing vertices."
              },
              "surface": {
                "label": "Surface",
                "description": "Elevation raster to cut against. Required unless 'multipatch' is given."
              },
              "multipatch": {
                "label": "Multipatch",
                "description": "Multipatch layer (triangle multipolygons) to cut against, instead of a raster surface."
              },
              "output": {
                "label": "Output",
                "description": "Output line layer split at every crossing. If omitted, stored in memory."
              },
              "output_points": {
                "label": "Output Points",
                "description": "Output point layer of the crossings themselves. Always produced; stored in memory when no path is given."
              },
              "spacing": {
                "label": "Spacing",
                "description": "Plan-view densification step in map units (default: one surface cell). Smaller resolves crossings more finely at more cost."
              },
              "keep_above": {
                "label": "Keep Above",
                "description": "Keep the pieces above the surface (default true)."
              },
              "keep_below": {
                "label": "Keep Below",
                "description": "Keep the pieces below the surface (default true)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the surface raster (default 1)."
              }
            }
          },
          "intersecting_layers_masks": {
            "name": "Intersecting Layers Masks",
            "description": "Generate cartographic mask polygons at a margin around features of a masked layer, but only where they intersect a second masking layer (exact outline, convex hull, or bounding box).",
            "params": {
              "masked_layer": {
                "label": "Masked Layer",
                "description": "Masked vector layer (any geometry): each feature that intersects the masking layer gets a mask. Format auto-detected (or an in-memory handle)."
              },
              "masking_layer": {
                "label": "Masking Layer",
                "description": "Masking vector layer (any geometry): a masked feature is masked only where it intersects a feature of this layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "margin": {
                "label": "Margin",
                "description": "Mask margin distance. Metres for a geographic CRS (EPSG:4326 or unknown, converted to degrees), otherwise in the layer's CRS units. Must be positive."
              },
              "mask_kind": {
                "label": "Mask Kind",
                "description": "Mask shape: 'exact' (default, buffered feature outline), 'convex_hull' (dilated convex hull), or 'box' (bounding envelope + margin)."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Optional field on the masked layer whose value is copied onto each mask as 'source_id'. Defaults to the source feature index."
              }
            }
          },
          "intervisibility": {
            "name": "Intervisibility",
            "description": "Tests each sight line against 3D vector obstructions and flags it visible or blocked, reporting which obstruction blocked it and where (ArcGIS Intervisibility). line_of_sight, visibility_index, viewshed and skyline_analysis all work against a surface raster; none can test against 3D multipatch obstructions such as buildings, whose overhangs and arcades are lost when burnt into a DEM.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Sight lines: 3D polylines whose first vertex is the observer and last vertex the target."
              },
              "obstructions": {
                "label": "Obstructions",
                "description": "One or more comma-separated 3D obstruction layers (triangle-mesh MultiPolygons with Z)."
              },
              "output": {
                "label": "Output",
                "description": "Output sight lines with the visibility fields appended. If omitted, stored in memory."
              },
              "visible_field": {
                "label": "Visible Field",
                "description": "Name of the boolean visibility field (default 'VISIBLE'), matching the ArcGIS parameter."
              },
              "observer_offset": {
                "label": "Observer Offset",
                "description": "Height added to the observer endpoint before testing, in CRS units (default 0). Models eye or instrument height."
              },
              "target_offset": {
                "label": "Target Offset",
                "description": "Height added to the target endpoint before testing, in CRS units (default 0)."
              },
              "visible_only": {
                "label": "Visible Only",
                "description": "Emit only the sight lines that are unobstructed (default false)."
              }
            }
          },
          "is_closed_3d": {
            "name": "Is Closed 3D",
            "description": "Flags which 3D multipatch features are watertight closed solids and which are open surfaces, with diagnostic counts of unpaired boundary edges, non-manifold edges and winding consistency (ArcGIS Is Closed 3D). Every volumetric tool in the catalog — union_3d, inside_3d, minimum_bounding_volume, buffer_3d — assumes closed input and returns a meaningless number for an open mesh, and nothing lets you check that precondition first.",
            "params": {
              "input": {
                "label": "Input",
                "description": "3D features (triangle-mesh MultiPolygons with Z, as buffer_3d, minimum_bounding_volume and voxel_isosurface emit)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path: the input features with the diagnostic fields appended. If omitted, stored in memory."
              },
              "closed_only": {
                "label": "Closed Only",
                "description": "Emit only the features that are closed solids (default false: every feature is emitted with its verdict)."
              }
            }
          },
          "kernel_density_ratio": {
            "name": "Kernel Density Ratio",
            "description": "Relative-risk ratio of two kernel density surfaces: evaluate a numerator point layer (cases) and a denominator point layer (population at risk) with the same quartic kernel and shared bandwidth, then divide cell-by-cell — like ArcGIS Calculate Kernel Density Ratio. A denominator floor writes no-data where the population is too thin (no inf/NaN leaks), and an optional natural-log transform makes over/under-representation symmetric. The density-ratio the single-layer heat_map cannot express.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Numerator point layer (e.g. cases / incidents)."
              },
              "denominator": {
                "label": "Denominator",
                "description": "Denominator point layer (e.g. population / exposure at risk)."
              },
              "output": {
                "label": "Output",
                "description": "Output ratio raster path. If omitted, stored in memory."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Numeric field weighting numerator points (default: each point counts 1)."
              },
              "denominator_weight_field": {
                "label": "Denominator Weight Field",
                "description": "Numeric field weighting denominator points (default: each point counts 1)."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Shared kernel bandwidth / search radius (metres for a geographic CRS, CRS units otherwise). Default: Silverman rule from the combined point spread."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units (default: larger extent side / 200)."
              },
              "log_ratio": {
                "label": "Log Ratio",
                "description": "If true, output the natural log of the ratio (symmetric around 0). Default false."
              },
              "denominator_floor": {
                "label": "Denominator Floor",
                "description": "Cells whose denominator density is below this value (or zero) become no-data, avoiding division blow-ups. Default 0 (only exactly-zero denominator is masked)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG to tag the output (default: from the numerator layer)."
              }
            }
          },
          "kernel_interpolation_with_barriers": {
            "name": "Kernel Interpolation With Barriers",
            "description": "Interpolates point observations with a moving-window kernel-weighted polynomial fit in which distance is measured as the shortest path AROUND absolute barriers rather than straight through them (ArcGIS Kernel Interpolation With Barriers). Complements the shipped diffusion_interpolation_with_barriers, which solves a heat equation instead of applying an explicit kernel. Every other interpolator in either registry uses Euclidean distance, so all of them interpolate straight across headlands and faults.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer carrying the observations."
              },
              "z_field": {
                "label": "Z Field",
                "description": "Numeric field to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path for predicted values. If omitted, stored in memory."
              },
              "output_error": {
                "label": "Output Error",
                "description": "Optional path for the local weighted residual RMS raster — the weighted spread of neighbour residuals about the local fit. This is a goodness-of-fit measure, NOT an ArcGIS-style prediction standard error (it accounts for neither effective degrees of freedom nor leverage). If omitted, stored in memory (still returned)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional polyline layer of absolute barriers. With none supplied the tool degenerates to plain kernel interpolation."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units. Defaults to roughly 1/100 of the extent's larger side."
              },
              "kernel": {
                "label": "Kernel",
                "description": "exponential, gaussian, quartic, epanechnikov, polynomial5 (default) or constant."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Kernel bandwidth in CRS units. Defaults to a data-driven value from mean nearest-neighbour spacing."
              },
              "power": {
                "label": "Power",
                "description": "Local polynomial order: 0 (weighted mean) or 1 (default, planar fit)."
              },
              "ridge": {
                "label": "Ridge",
                "description": "Ridge parameter stabilising the local least-squares fit where a neighbourhood is degenerate (default 1e-6)."
              },
              "max_neighbors": {
                "label": "Max Neighbors",
                "description": "Cap on the number of observations contributing to each local fit (default 32)."
              }
            }
          },
          "kml_to_features": {
            "name": "KML To Features",
            "description": "Read .kml/.kmz Placemarks into point, line, and polygon layers with name/description attributes.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Path to a .kml file or a .kmz archive (a zipped KML)."
              },
              "points_output": {
                "label": "Points Output",
                "description": "Optional output point vector path (driver from its extension). Written only if the KML has point placemarks."
              },
              "lines_output": {
                "label": "Lines Output",
                "description": "Optional output line vector path (driver from its extension). Written only if the KML has line placemarks."
              },
              "polygons_output": {
                "label": "Polygons Output",
                "description": "Optional output polygon vector path (driver from its extension). Written only if the KML has polygon placemarks."
              }
            }
          },
          "landtrendr": {
            "name": "LandTrendr",
            "description": "LandTrendr temporal segmentation of a yearly image series (like ArcGIS Analyze Changes Using LandTrendr): despike, greedy vertex-based piecewise-linear fitting, and extraction of the greatest disturbance (year, magnitude, duration) per pixel. The per-pixel change-history segmentation the two-date change_vector_analysis and single-trend generate_trend_raster can't do.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma-separated yearly raster paths in time order (e.g. spectral_index NBR outputs; >= 4)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster: year of the greatest disturbance per pixel. If omitted, stored in memory."
              },
              "years": {
                "label": "Years",
                "description": "Comma-separated years matching 'inputs' (default 0,1,2,...)."
              },
              "magnitude_output": {
                "label": "Magnitude Output",
                "description": "Optional raster of the disturbance magnitude (index change)."
              },
              "duration_output": {
                "label": "Duration Output",
                "description": "Optional raster of the disturbance duration (years)."
              },
              "direction": {
                "label": "Direction",
                "description": "Disturbance direction in the index: 'loss' (a drop; default) or 'gain' (a rise)."
              },
              "max_segments": {
                "label": "Max Segments",
                "description": "Maximum number of segments (default 6)."
              },
              "spike_threshold": {
                "label": "Spike Threshold",
                "description": "Despike strength 0..1 (fraction of the series range; default 0.75; 1 disables)."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum valid observations per pixel (default 4)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from each input (default 1)."
              }
            }
          },
          "las_height_metrics": {
            "name": "LAS Height Metrics",
            "description": "Rasterize per-cell canopy height metrics from lidar heights (like ArcGIS LAS Height Metrics): mean, std, skewness, kurtosis, MAD, and height percentiles as a multi-band grid — the forestry moment/percentile suite the bundled height_above_ground and lidar_point_stats don't emit in one pass.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input LAS/LAZ point cloud of above-ground heights (normalize first with height_above_ground)."
              },
              "output": {
                "label": "Output",
                "description": "Output multi-band raster path. If omitted, stored in memory."
              },
              "metrics": {
                "label": "Metrics",
                "description": "Comma-separated subset of mean,std,skewness,kurtosis,mad (default 'mean,std,skewness,kurtosis,mad')."
              },
              "height_percentiles": {
                "label": "Height Percentiles",
                "description": "Comma-separated percentiles in [0,100], e.g. '50,95,99' (default '50,95,99'; empty for none)."
              },
              "min_height": {
                "label": "Min Height",
                "description": "Exclude points with height below this (ground/noise cutoff). Default 0."
              },
              "min_points": {
                "label": "Min Points",
                "description": "Cells with fewer valid points become no-data. Default 4."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units. Default 10."
              }
            }
          },
          "less_than_or_equal_to": {
            "name": "LessThanOrEqualTo",
            "description": "Tests whether the first raster is less than or equal to the second on a cell-by-cell basis.",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First input raster (path string or typed raster object)."
              },
              "input2": {
                "label": "Input2",
                "description": "Second input raster (path string or typed raster object)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster file path. If omitted, output remains in memory and is returned as a memory:// raster handle."
              }
            }
          },
          "line_density": {
            "name": "Line Density",
            "description": "Density of linear features (length per unit area) in a circular neighborhood around each raster cell — road, stream, or fault density — by clipping each line segment to the search-radius circle (closed-form) and dividing the summed weighted length by pi*r^2. Like ArcGIS Line Density; the vector-line counterpart the bundled point-only heat_map and categorical edge_density lack.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output density raster path (driver from extension). If omitted, stored in memory."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Numeric field weighting each line (e.g. lanes, traffic, population). Default: every line weight 1."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighborhood radius (metres for a geographic CRS, CRS units otherwise). Default: shorter extent side / 25."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size (same units as search_radius). Default: search_radius / 10."
              },
              "area_units": {
                "label": "Area Units",
                "description": "Area unit of the density values: 'square_map_units' (default), 'square_meters', 'square_kilometers', 'square_miles', or 'square_feet'."
              }
            }
          },
          "line_of_sight": {
            "name": "Line Of Sight",
            "description": "Point-to-point visibility over a DEM: for each observer-target pair emit the sight line split into visible and obstructed segments plus a target-visible flag, like ArcGIS Line Of Sight.",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input elevation raster (projected CRS; distances/heights in its units)."
              },
              "observers": {
                "label": "Observers",
                "description": "Observer point vector layer."
              },
              "targets": {
                "label": "Targets",
                "description": "Target point vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path (driver from extension). If omitted, stored in memory."
              },
              "observer_offset": {
                "label": "Observer Offset",
                "description": "Observer height above ground, in DEM units (default 1.75)."
              },
              "target_offset": {
                "label": "Target Offset",
                "description": "Target height above ground, in DEM units (default 0)."
              },
              "pair_field": {
                "label": "Pair Field",
                "description": "Optional field present on both layers; observers and targets are paired where this field matches (instead of all-to-all)."
              },
              "band": {
                "label": "Band",
                "description": "DEM band to sample (default 1)."
              }
            }
          },
          "line_statistics": {
            "name": "Line Statistics",
            "description": "Rasterize a neighborhood statistic of a line attribute (mean, majority, median, min/max, range, variety, or total length) by clipping each segment to the search-radius circle and length-weighting the values — like ArcGIS Line Statistics; the attribute-surface complement to line_density that the bundled suite lacks.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline vector layer."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field to summarize. Required for every statistic except 'length'."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path (driver from extension). If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "'mean' (default), 'majority', 'maximum', 'median', 'minimum', 'minority', 'range', 'variety', or 'length'."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Neighborhood radius in CRS units. Default: shorter extent side / 25."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units. Default: search_radius / 10."
              }
            }
          },
          "local_bivariate_relationships": {
            "name": "Local Bivariate Relationships",
            "description": "For each feature, classify how two variables relate in its local neighbourhood (not significant, positive/negative linear, concave, convex, undefined) from local linear and quadratic fits, an entropy-reduction dependence statistic, and a seeded permutation-test p-value — like ArcGIS Local Bivariate Relationships.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer holding the two variable fields."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (a copy of the input with relationship fields). If omitted, stored in memory."
              },
              "field1": {
                "label": "Field1",
                "description": "First (explanatory) variable field name."
              },
              "field2": {
                "label": "Field2",
                "description": "Second (dependent) variable field name."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Number of nearest neighbours k defining each local sample (default 12; must be >= 5)."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Number of permutations for the significance test (default 199; 0 disables)."
              },
              "significance": {
                "label": "Significance",
                "description": "Pseudo p-value threshold for calling a relationship significant (default 0.05)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the permutation RNG (default 1), for reproducible results."
              }
            }
          },
          "local_outlier_analysis": {
            "name": "Local Outlier Analysis",
            "description": "Space-time Local Outlier Analysis (Anselin Local Moran's I on an H3 space-time cube): classify each cell x time bin as a High-High/Low-Low cluster or High-Low/Low-High outlier with a seeded permutation p-value, then summarise per cell over time — like ArcGIS Local Outlier Analysis. The space-time extension of the bundled spatial-only local_morans_i_lisa.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer of timestamped events (lon/lat)."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: a number or an ISO-8601 timestamp."
              },
              "output": {
                "label": "Output",
                "description": "Output H3 polygon summary layer. If omitted, stored in memory."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field to aggregate per bin (default: point count)."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Width of a time step in the time_field's units (default 1)."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0..15 (default 7)."
              },
              "kring": {
                "label": "Kring",
                "description": "Spatial neighbourhood k-ring radius (default 1)."
              },
              "time_window": {
                "label": "Time Window",
                "description": "Temporal neighbourhood half-width in steps (default 1)."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Permutations for the significance test (default 99; 0 disables)."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the permutation RNG (default 1)."
              }
            }
          },
          "local_polynomial_interpolation": {
            "name": "Local Polynomial Interpolation",
            "description": "Fit an order-1/2/3 polynomial within a kernel-weighted moving neighbourhood at every cell, producing a prediction surface, a prediction standard error surface, or a condition-number surface. Unlike the bundled global trend_surface, the polynomial is refitted locally. Like ArcGIS Local Polynomial Interpolation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point features carrying the value to interpolate."
              },
              "z_field": {
                "label": "Z Field",
                "description": "Numeric field holding the value to interpolate."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path. If omitted, stored in memory."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in map units (default: input extent / 200)."
              },
              "order": {
                "label": "Order",
                "description": "Polynomial order: 1 (default), 2 or 3."
              },
              "kernel": {
                "label": "Kernel",
                "description": "'exponential' (default), 'gaussian', 'quartic', 'epanechnikov', 'fifth_order' or 'constant'."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "Fixed kernel bandwidth in map units. If omitted, an adaptive bandwidth is used: the distance to the 'neighbors'-th nearest sample."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Samples per local fit for the adaptive bandwidth (default: 3x the number of polynomial terms)."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional per-observation measurement weight field."
              },
              "condition_number": {
                "label": "Condition Number",
                "description": "Refuse to predict where the local design's condition number exceeds this threshold (default: no limit)."
              },
              "output_type": {
                "label": "Output Type",
                "description": "'prediction' (default), 'standard_error' or 'condition_number'."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG code stamped on the output raster (default: the input layer's CRS)."
              }
            }
          },
          "locate_lines_along_routes": {
            "name": "Locate Lines Along Routes",
            "description": "Overlay line or polygon features on measured routes to produce from/to-measure line events (RID, FMEAS, TMEAS), like ArcGIS Locate Features Along Routes (line/polygon events).",
            "params": {
              "input_features": {
                "label": "Input Features",
                "description": "Input line or polygon vector layer to locate along the routes."
              },
              "routes": {
                "label": "Routes",
                "description": "Route (line) vector layer providing the linear-referencing measures."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Field on the routes layer holding each route's identifier (RID). If omitted, the route's 0-based feature index is used."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Search radius in CRS units. A feature vertex within this distance of a route is treated as coincident. Required (> 0)."
              },
              "output": {
                "label": "Output",
                "description": "Output line-event vector path (driver from extension). If omitted, the result is stored in memory."
              }
            }
          },
          "locate_regions": {
            "name": "Locate Regions",
            "description": "Find the best contiguous region(s) of a target area from a suitability raster (like ArcGIS Locate Regions): best-first region growing from suitability peaks with a shape/compactness control and inter-region spacing — the siting step that turns a fuzzy_overlay/weighted_overlay surface into actual regions, which clump and thresholding can't.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Suitability raster (higher = more suitable)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster of 1-based region ids (no-data elsewhere). If omitted, stored in memory."
              },
              "total_area": {
                "label": "Total Area",
                "description": "Total target area across all regions, in CRS area units (default: 5% of the valid area)."
              },
              "num_regions": {
                "label": "Num Regions",
                "description": "Number of regions to locate (default 1). Each targets total_area / num_regions."
              },
              "shape": {
                "label": "Shape",
                "description": "Compactness weight 0..1: 0 = pure suitability, 1 = strongly favour round regions (default 0.3)."
              },
              "min_distance": {
                "label": "Min Distance",
                "description": "Minimum distance between regions, in CRS units (default 0)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "matched_filter_target_detection": {
            "name": "Matched Filter Target Detection (CEM/ACE)",
            "description": "Score every pixel of a multiband image against a known target spectrum using the scene statistics to suppress the background — Constrained Energy Minimization (CEM) or the Adaptive Coherence Estimator (ACE) — with an optional percentile threshold mask, like ArcGIS Detect Target Using Spectra.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input multiband raster (2+ bands)."
              },
              "target_spectrum": {
                "label": "Target Spectrum",
                "description": "Target spectrum: one value per band, as a JSON array or a comma/space-separated list (length must equal the band count)."
              },
              "output": {
                "label": "Output",
                "description": "Output detection-score raster (F32). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'cem' (Constrained Energy Minimization, default) or 'ace' (Adaptive Coherence Estimator, scores in 0..1)."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Optional percentile (0-100) of the score distribution above which a binary detection mask is written."
              },
              "mask_output": {
                "label": "Mask Output",
                "description": "Output path for the binary detection mask (requires 'threshold'). If omitted with a threshold, stored in memory."
              }
            }
          },
          "maximum_likelihood_classification": {
            "name": "Maximum Likelihood Classification",
            "description": "Gaussian maximum-likelihood supervised classifier: models each training class as a multivariate normal (per-class mean + covariance), classifies every pixel of a multiband image by the largest Gaussian log-likelihood with optional equal/sample a-priori weights, and can emit a per-pixel probability/confidence raster and reject the least-confident cells, like ArcGIS Maximum Likelihood Classification.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input multiband raster to classify (1+ bands; every band is a feature)."
              },
              "training": {
                "label": "Training",
                "description": "Integer-labelled training raster on the same grid as 'input': each distinct positive integer is a class; no-data / non-positive / non-finite cells are unlabelled."
              },
              "output": {
                "label": "Output",
                "description": "Output classified raster carrying the training class ids. If omitted, stored in memory."
              },
              "prob_output": {
                "label": "Prob Output",
                "description": "Optional output F32 raster of the winning class's posterior probability (confidence) in [0,1]."
              },
              "a_priori": {
                "label": "A Priori",
                "description": "A-priori class weights: 'equal' (default, 1/K) or 'sample' (proportional to each class's training-pixel count)."
              },
              "reject_fraction": {
                "label": "Reject Fraction",
                "description": "Fraction in [0,1) of the least-confident classified cells to leave unclassified (no-data). Default 0."
              }
            }
          },
          "median_center": {
            "name": "Median Center",
            "description": "The geometric median (Weiszfeld point that minimizes summed, optionally weighted, Euclidean distance to all input points) — one robust center point per case group, with optional per-field median attributes (ArcGIS Median Center).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (driver from extension). If omitted, stored in memory."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field weighting each point's pull on the median."
              },
              "case_field": {
                "label": "Case Field",
                "description": "Optional field to group points by; one median per distinct value."
              },
              "attribute_fields": {
                "label": "Attribute Fields",
                "description": "Optional comma-separated numeric fields; the per-group median of each is appended as '<field>_med'."
              }
            }
          },
          "merge_divided_roads": {
            "name": "Merge Divided Roads",
            "description": "Replace matched pairs of divided road lanes with single centerlines while preserving intersection connectivity, pairing only lanes that share a merge field and run anti-parallel within a separation distance, and emitting displacement polygons for propagate_displacement. Like ArcGIS Merge Divided Roads.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Road centerline features."
              },
              "merge_field": {
                "label": "Merge Field",
                "description": "Field whose matching values make two lines candidate carriageway pairs (e.g. road name or class)."
              },
              "merge_distance": {
                "label": "Merge Distance",
                "description": "Maximum separation between paired carriageways, in map units."
              },
              "output": {
                "label": "Output",
                "description": "Output merged centerline path. If omitted, stored in memory."
              },
              "output_displacement_features": {
                "label": "Output Displacement Features",
                "description": "Optional polygons showing where geometry moved, for propagate_displacement."
              },
              "character_field": {
                "label": "Character Field",
                "description": "Optional field; features with a non-zero / non-empty value are excluded from merging."
              },
              "output_table": {
                "label": "Output Table",
                "description": "Optional lineage table mapping output features back to their source features."
              }
            }
          },
          "merge_lines_by_pseudo_node": {
            "name": "Merge Lines By Pseudo Node",
            "description": "Dissolve chains of line segments that meet at degree-2 pseudo-nodes into single polylines, preserving true intersections and (optionally) attribute breaks.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "dissolve_fields": {
                "label": "Dissolve Fields",
                "description": "Comma-separated attribute field names; two segments merge only where they agree on all of them. If omitted, segments merge across every degree-2 node regardless of attributes."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Endpoints within this distance (CRS units) are treated as the same node. Default 1e-6."
              }
            }
          },
          "merge_multidimensional_rasters": {
            "name": "Merge Multidimensional Rasters",
            "description": "Joins several co-registered raster cubes into one, ordered by dimension coordinate, resolving duplicate coordinates per cell (ArcGIS Merge Multidimensional Rasters). aggregate_multidimensional_raster reduces a cube and composite_bands stacks single-band rasters into bands, but nothing joined cubes along their shared dimension.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma- or semicolon-separated cube paths (multiband rasters). At least two."
              },
              "dimension_values": {
                "label": "Dimension Values",
                "description": "Optional per-slice coordinates covering every slice of every input, in input order. Need not be sorted or unique — that is what this tool resolves. Without them the inputs are concatenated in the order given."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Name of the dimension, used only in reporting (default 'slice')."
              },
              "resolve_overlap": {
                "label": "Resolve Overlap",
                "description": "Duplicate-coordinate rule: 'first' (default), 'last', 'mean', 'min', 'max', or 'error'."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Relative tolerance for treating two coordinates as equal (default 1e-9)."
              },
              "output": {
                "label": "Output",
                "description": "Output cube raster, one band per merged slice, in dimension order. If omitted, stored in memory."
              }
            }
          },
          "mgwr": {
            "name": "Multiscale Geographically Weighted Regression",
            "description": "GWR where each explanatory term gets its own bandwidth via AICc back-fitting (MGWR): per-feature coefficients, local R2, residuals, condition number, plus each term's optimal bandwidth with a local/regional/global interpretation and global AICc / R2 diagnostics.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer (points, or other geometries via their representative point)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "dependent_field": {
                "label": "Dependent Field",
                "description": "Dependent (response) numeric field."
              },
              "explanatory_fields": {
                "label": "Explanatory Fields",
                "description": "Comma-separated explanatory numeric field(s), each fit with its own bandwidth."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Distance-decay kernel: 'gaussian' (default) or 'bisquare'."
              },
              "bandwidth_type": {
                "label": "Bandwidth Type",
                "description": "'adaptive' (default; bandwidth = k nearest neighbours) or 'fixed' (bandwidth = a distance). Applies to every term's own bandwidth search."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Back-fitting convergence tolerance: stop when the relative change in RSS between sweeps drops below this (default 0.001)."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "Maximum back-fitting sweeps over all terms (default 30)."
              }
            }
          },
          "minimum_bounding_volume": {
            "name": "Minimum Bounding Volume",
            "description": "Compute the minimum enclosing volume (convex hull, sphere or envelope) around 3D features, per feature, per group, or over all input, emitting the solid as Z-valued triangular faces with volume and surface-area attributes. Like ArcGIS Minimum Bounding Volume.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input 3D point, multipoint or line features."
              },
              "output": {
                "label": "Output",
                "description": "Output path for the volume faces. If omitted, stored in memory."
              },
              "z_value": {
                "label": "Z Value",
                "description": "'geometry' (default) to take Z from the geometry, or the name of a numeric field supplying Z."
              },
              "geometry_type": {
                "label": "Geometry Type",
                "description": "'convex_hull' (default), 'sphere' or 'envelope'. ('concave_hull' is not implemented in this version.)"
              },
              "group_option": {
                "label": "Group Option",
                "description": "'none' (one volume per feature, default), 'all' (a single volume over all input) or 'list' (one per 'group_field' value)."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Field defining groups when 'group_option' is 'list'."
              },
              "mbv_fields": {
                "label": "Mbv Fields",
                "description": "Append MBV_VOLUME and MBV_AREA fields (default false)."
              }
            }
          },
          "multicriteria_overlay": {
            "name": "Multicriteria Overlay",
            "description": "Combine a stack of criterion rasters into one suitability surface with rank-based MCDA: weighted_sum, weighted_geometric_mean, OWA (ordered weighted averaging), or TOPSIS (closeness to the ideal point), with per-raster weights and from_scale/to_scale rescaling, like ArcGIS Multicriteria Overlay.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma-separated list of ≥2 co-registered criterion rasters (higher value = more suitable; each is min-max rescaled to 0..1 before combination)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path. If omitted, the result is stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "Combination method: 'weighted_sum' (default), 'weighted_geometric_mean', 'owa', 'topsis'."
              },
              "weights": {
                "label": "Weights",
                "description": "Comma-separated per-raster importance weights, one per input (default equal). Normalized to sum to 1."
              },
              "order_weights": {
                "label": "Order Weights",
                "description": "OWA only: comma-separated order weights, one per input, applied to the criteria sorted high→low per cell (default equal, which makes OWA == weighted mean). Normalized to sum to 1."
              },
              "from_scale": {
                "label": "From Scale",
                "description": "Low bound of the output evaluation scale (default 0)."
              },
              "to_scale": {
                "label": "To Scale",
                "description": "High bound of the output evaluation scale (default 1)."
              }
            }
          },
          "multidimensional_anomaly": {
            "name": "Generate Multidimensional Anomaly",
            "description": "Per-slice temporal anomaly cube from a raster time stack (like ArcGIS Generate Multidimensional Anomaly): for each pixel compute a temporal baseline (mean/std or median across the slice dimension) and rewrite every time slice as its deviation from that baseline — difference-from-mean, percent-of-mean, z-score, or difference-from-median — emitting an anomaly stack with one slice per input slice.",
            "params": {
              "input": {
                "label": "Input",
                "description": "One multiband raster (each band is a time slice) or a comma-separated list of co-registered rasters, in time order."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband anomaly raster (one band per input slice). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "Anomaly calculation: 'difference_from_mean' (default), 'percent_of_mean', 'z_score', or 'difference_from_median'."
              },
              "reference_range": {
                "label": "Reference Range",
                "description": "Optional 1-based inclusive slice range 'start-end' used to compute the per-pixel baseline (default: all slices)."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum non-no-data observations per pixel inside the reference range (default 1); below this the pixel is no-data."
              }
            }
          },
          "multidimensional_principal_components": {
            "name": "Multidimensional Principal Components",
            "description": "Decomposes a raster cube into the few real modes underlying a long time series, emitting component rasters, loadings and eigenvalues, in either dimension-reduction or spatial-reduction form (ArcGIS Multidimensional Principal Components). The bundled principal_component_analysis decomposes band space within one scene, so its components mix spectral bands rather than time; dimension_reduction works on vector attribute tables. Both reductions come from one slice-space covariance, since the pixel-space equivalent would be millions of rows square.",
            "params": {
              "input": {
                "label": "Input",
                "description": "One multiband raster (each band is a slice) or a comma-separated list of co-registered rasters."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband raster: component scores for 'dimension_reduction', component loadings for 'spatial_reduction'. If omitted, stored in memory."
              },
              "output_loadings": {
                "label": "Output Loadings",
                "description": "Output table of the per-slice loadings (or per-slice component series under 'spatial_reduction'). Always produced; stored in memory when no path is given."
              },
              "output_eigenvalues": {
                "label": "Output Eigenvalues",
                "description": "Output table of eigenvalues and the variance each explains. Always produced; stored in memory when no path is given."
              },
              "mode": {
                "label": "Mode",
                "description": "'dimension_reduction' (default; components are spatial patterns) or 'spatial_reduction' (components are series over the dimension)."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Name of the dimension, used only in the report (default 'slice')."
              },
              "dimension_values": {
                "label": "Dimension Values",
                "description": "Comma-separated coordinate of each slice, strictly increasing. Defaults to the 1-based slice index."
              },
              "number_of_pc": {
                "label": "Number Of Pc",
                "description": "How many components to keep (default: all slices)."
              },
              "correlation": {
                "label": "Correlation",
                "description": "Decompose the correlation matrix instead of the covariance (default false). Use when slices are on different scales."
              }
            }
          },
          "multidimensional_raster_correlation": {
            "name": "Multidimensional Raster Correlation",
            "description": "Correlates two raster cubes cell by cell along their shared dimension, producing a map of Pearson, Spearman or Kendall coefficients and — in cross-correlation mode — the lag at which each cell's association peaks (ArcGIS Multidimensional Raster Correlation). Nothing in either registry maps this: image_correlation collapses an image pair to one scalar, round 17's time_series_cross_correlation is vector-only, attribute_correlation is a table operation, and bivariate_spatial_association compares two single-band rasters with no time axis.",
            "params": {
              "input1": {
                "label": "Input1",
                "description": "First cube: one multiband raster (each band a slice) or a comma-separated list of co-registered rasters."
              },
              "input2": {
                "label": "Input2",
                "description": "Second cube, co-registered with the first and with the same number of slices."
              },
              "output": {
                "label": "Output",
                "description": "Output correlation raster in [-1, 1]. If omitted, stored in memory."
              },
              "output_lag": {
                "label": "Output Lag",
                "description": "Output raster of the best lag per cell (cross-correlation mode); the fixed lag everywhere otherwise. Always produced; stored in memory when no path is given."
              },
              "output_count": {
                "label": "Output Count",
                "description": "Output raster of the paired-sample count behind each coefficient. Always produced; stored in memory when no path is given."
              },
              "method": {
                "label": "Method",
                "description": "'pearson' (default), 'spearman', or 'kendall'."
              },
              "lag": {
                "label": "Lag",
                "description": "Fixed number of slices to shift the second cube forward before pairing (default 0). Ignored in cross-correlation mode."
              },
              "cross_correlation": {
                "label": "Cross Correlation",
                "description": "Search every lag in -max_lag..=max_lag and keep the strongest coefficient (default false)."
              },
              "max_lag": {
                "label": "Max Lag",
                "description": "Half-width of the lag search in slices (default 3). Cross-correlation mode only."
              },
              "use_absolute": {
                "label": "Use Absolute",
                "description": "In cross-correlation mode, rank lags by absolute correlation so a strong negative association wins (default true)."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum paired samples before a coefficient is written (default 3)."
              }
            }
          },
          "multilook": {
            "name": "Multilook",
            "description": "Reduces SAR speckle by incoherently averaging adjacent looks in range and azimuth, producing square-pixel intensity imagery (ArcGIS Multilook). Neither registry ships any SAR tool; the bundled lee_filter family operates on already-detected intensity, so this supplies the upstream step that turns complex single-look data into the detected imagery those filters expect. Complex input is read as a two-band I/Q pair; detection happens before averaging, and the equivalent number of looks is reported for downstream speckle filtering.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input SAR raster: a two-band I/Q pair for complex (SLC) data, or a single band of already-detected data (see 'input_domain')."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "input_domain": {
                "label": "Input Domain",
                "description": "For non-complex input, what band 1 already holds: 'intensity' (default) or 'amplitude'. Amplitude is squared to intensity before averaging, since incoherent averaging is only correct in the intensity domain."
              },
              "complex": {
                "label": "Complex",
                "description": "Treat the input as a complex I/Q pair (default: true when the raster has 2+ bands, false otherwise)."
              },
              "range_looks": {
                "label": "Range Looks",
                "description": "Number of looks in range (x). Default 1, or derived when auto_looks is set."
              },
              "azimuth_looks": {
                "label": "Azimuth Looks",
                "description": "Number of looks in azimuth (y). Default 1, or derived when auto_looks is set."
              },
              "auto_looks": {
                "label": "Auto Looks",
                "description": "If true (default) and looks are not given explicitly, derive them from the pixel-spacing ratio so output ground pixels are approximately square."
              },
              "output_units": {
                "label": "Output Units",
                "description": "amplitude, intensity (default), or db."
              },
              "statistic": {
                "label": "Statistic",
                "description": "mean (default) or median; median is more robust where strong scatterers dominate a look window."
              }
            }
          },
          "multipatch_footprint": {
            "name": "Multipatch Footprint",
            "description": "Projects 3D multipatch features onto the XY plane and dissolves them into 2D footprint polygons, one per feature or per group field (ArcGIS Multipatch Footprint). layer_footprint_vector returns a single extent rectangle for a whole layer, not per-feature outlines, so there is currently no way to feed buffer_3d / voxel_isosurface / imported building solids into the regularize_building_footprints pipeline.",
            "params": {
              "input": {
                "label": "Input",
                "description": "3D multipatch features (triangle-mesh MultiPolygons with Z)."
              },
              "output": {
                "label": "Output",
                "description": "Output 2D polygon footprints. If omitted, stored in memory."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Optional field whose values dissolve footprints together (one output polygon per distinct value). Default: one output per input feature."
              },
              "simplify_tolerance": {
                "label": "Simplify Tolerance",
                "description": "Optional Douglas-Peucker tolerance (CRS units) applied to the dissolved footprint. Omitted by default so the raw outline is preserved for regularize_building_footprints."
              }
            }
          },
          "multipatch_to_mesh": {
            "name": "Multipatch To Mesh",
            "description": "Exports multipatch and 3D solid geometry to OBJ or glTF 2.0 / GLB for any 3D or web viewer (ArcGIS Multipatch To Collada). The union_3d / difference_3d / enclose_multipatch / voxel_isosurface suite had no export path at all — no mesh format existed anywhere in the registry — so 3D results could only be read back by this catalog.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Multipatch / 3D polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Output .glb, .gltf or .obj file path. The extension selects the format unless 'format' is given."
              },
              "format": {
                "label": "Format",
                "description": "'glb' (default for .glb), 'gltf' (JSON with an embedded base64 buffer), or 'obj'. Defaults from the output extension."
              },
              "origin": {
                "label": "Origin",
                "description": "Local-origin translation: 'centroid' (default), 'min_corner', or 'none'. Required for precision — glTF positions are 32-bit floats."
              },
              "y_up": {
                "label": "Y Up",
                "description": "Swap to glTF's Y-up convention from geospatial Z-up (default true for glTF/GLB, false for OBJ)."
              },
              "name_field": {
                "label": "Name Field",
                "description": "Attribute naming each feature's mesh in the output."
              }
            }
          },
          "multiple_ring_buffer": {
            "name": "Multiple Ring Buffer",
            "description": "Buffer features at a list of distances into concentric bands — nested disks or non-overlapping rings — optionally dissolved per distance, with the band distance stored as an attribute.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points, lines, or polygons), format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "distances": {
                "label": "Distances",
                "description": "Comma-separated list of buffer distances in CRS units, e.g. \"100,250,500\". Sorted ascending; duplicates and non-positive values are dropped."
              },
              "ring_type": {
                "label": "Ring Type",
                "description": "'rings' (default) for non-overlapping donut bands, or 'disks' for nested cumulative buffers."
              },
              "dissolve": {
                "label": "Dissolve",
                "description": "'none' (default) keeps one band per source feature; 'per_ring' unions all features' bands at each distance into one polygon."
              },
              "distance_field": {
                "label": "Distance Field",
                "description": "Name of the output attribute holding each band's distance. Default 'distance'."
              }
            }
          },
          "multitemporal_coherence": {
            "name": "Multitemporal Coherence",
            "description": "Computes interferometric coherence across a stack of co-registered SAR acquisitions and reduces it to mean/min/max/std and temporal-decorrelation slope, optionally emitting the per-pair coherence cube (ArcGIS Generate Multitemporal Coherence). sar_coherence handles exactly two scenes, so persistent-scatterer selection and coherence-change timing were out of reach.",
            "params": {
              "inputs": {
                "label": "Inputs",
                "description": "Comma- or semicolon-separated co-registered complex SLC rasters (two bands each: I then Q). At least two."
              },
              "dates": {
                "label": "Dates",
                "description": "Optional acquisition times, one per input, as numbers in consistent units (e.g. days). Required by statistic 'decorrelation_slope'."
              },
              "pairs": {
                "label": "Pairs",
                "description": "'consecutive' (default, i with i+1), 'all' (every unordered pair), or 'reference' (every scene against reference_index)."
              },
              "reference_index": {
                "label": "Reference Index",
                "description": "0-based index of the reference scene for pairs='reference' (default 0)."
              },
              "window_size": {
                "label": "Window Size",
                "description": "Estimation window in cells; a single value or 'range,azimuth' (default 5). Even values are rounded up to odd."
              },
              "bias_correction": {
                "label": "Bias Correction",
                "description": "Apply the small-sample coherence bias correction (default true)."
              },
              "statistics": {
                "label": "Statistics",
                "description": "Comma-separated: 'mean' (default), 'min', 'max', 'std', 'decorrelation_slope'. One output band per statistic, in this order."
              },
              "output": {
                "label": "Output",
                "description": "Output raster, one band per requested statistic. If omitted, stored in memory."
              },
              "output_pairs": {
                "label": "Output Pairs",
                "description": "Optional raster receiving the per-pair coherence cube, one band per pair."
              }
            }
          },
          "multivariate_clustering": {
            "name": "Multivariate Clustering",
            "description": "Cluster vector features by the similarity of their standardized attribute values (seeded k-means or k-medoids), automatically choosing the number of clusters by Calinski-Harabasz pseudo-F when not given, like ArcGIS Multivariate Clustering.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer, format auto-detected (or in-memory handle)."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated numeric analysis fields (attribute space to cluster on)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (a copy of the input with cluster_id/silhouette). If omitted, stored in memory."
              },
              "num_clusters": {
                "label": "Num Clusters",
                "description": "Number of clusters k. Omit or pass 0 to evaluate k = 2..15 automatically by Calinski-Harabasz pseudo-F."
              },
              "method": {
                "label": "Method",
                "description": "Clustering method: 'kmeans' (default) or 'kmedoids' (PAM; suited to smaller feature counts)."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for deterministic k-means++ / medoid initialization (default 1)."
              }
            }
          },
          "near_3d": {
            "name": "Near 3D",
            "description": "Find the nearest feature in true 3D distance, reporting distance, the nearest location, angles and per-axis deltas, like ArcGIS Near 3D.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer (3D vertices; missing Z is treated as 0)."
              },
              "near_features": {
                "label": "Near Features",
                "description": "Comma-separated list of layers to search against. Omit to self-join the input layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Only consider near features within this 3D distance (map units). Unlimited when omitted."
              },
              "location": {
                "label": "Location",
                "description": "Append the nearest point's coordinates as near_x / near_y / near_z (default false)."
              },
              "angle": {
                "label": "Angle",
                "description": "Append the horizontal bearing (near_bearing, degrees from north) and vertical angle (near_vert_angle, degrees from horizontal) to the nearest point (default false)."
              },
              "delta": {
                "label": "Delta",
                "description": "Append per-axis offsets near_dx / near_dy / near_dz (default false)."
              }
            }
          },
          "neighborhood_summary_statistics": {
            "name": "Neighborhood Summary Statistics",
            "description": "For each feature, summarize chosen numeric fields over its neighbours (k nearest, within a distance, or shared-edge contiguity), adding <field>_nbr_mean/median/std/min/max/sum and a neighbour count, like ArcGIS Neighborhood Summary Statistics.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points, lines, or polygons)."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated numeric fields to summarize over neighbours."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (input copy + neighbour-statistic columns). If omitted, stored in memory."
              },
              "neighborhood": {
                "label": "Neighborhood",
                "description": "'knn' (default), 'distance_band', or 'contiguity' (polygons sharing an edge)."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "k for knn (default 8)."
              },
              "distance": {
                "label": "Distance",
                "description": "Band distance for distance_band (map units)."
              },
              "weights": {
                "label": "Weights",
                "description": "'uniform' (default) or 'inverse_distance' (weights the mean and std)."
              }
            }
          },
          "non_maximum_suppression": {
            "name": "Non Maximum Suppression",
            "description": "Keep the highest-confidence detection in each overlap cluster and discard lower-scored polygons whose intersection-over-union exceeds a threshold (like ArcGIS Non Maximum Suppression) — the score-based deduplicator for object-detection/OBIA output that count_overlapping_features (counts, keeps all), resolve_building_conflicts (displaces), and find_identical (exact only) don't provide.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon detections (may overlap)."
              },
              "confidence_score_field": {
                "label": "Confidence Score Field",
                "description": "Numeric field holding each detection's confidence/score; higher wins."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon path with the surviving detections. If omitted, stored in memory."
              },
              "max_overlap_ratio": {
                "label": "Max Overlap Ratio",
                "description": "IoU above which a lower-scored detection is suppressed (0-1, default 0.5)."
              },
              "class_value_field": {
                "label": "Class Value Field",
                "description": "Optional field; only detections of the same class suppress each other."
              }
            }
          },
          "observer_points": {
            "name": "Observer Points",
            "description": "Identifies which of up to 32 observers can see each cell, as a per-observer bit mask, and writes the above-ground-level raster giving the height a target would need to be raised to become visible (ArcGIS Observer Points / Viewshed 2 in OBSERVERS mode). The bundled viewshed returns only a count of visible stations, from which neither answer can be recovered: a count of 1 does not say which tower covers a parcel, and a count of 0 does not distinguish two metres short from behind a mountain.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input elevation raster (DEM or DSM)."
              },
              "observers": {
                "label": "Observers",
                "description": "Point layer of observer positions, at most 32."
              },
              "output": {
                "label": "Output",
                "description": "Output visibility raster: an observer bit mask, or a count under analysis_type 'frequency'. If omitted, stored in memory."
              },
              "output_agl": {
                "label": "Output Agl",
                "description": "Output above-ground-level raster: the height a target must be raised to become visible. Always produced; stored in memory when no path is given."
              },
              "output_table": {
                "label": "Output Table",
                "description": "Output table with one row per observer and the cells and area it sees. Always produced; stored in memory when no path is given."
              },
              "analysis_type": {
                "label": "Analysis Type",
                "description": "'observers' (default; a bit mask) or 'frequency' (a count, matching the bundled viewshed)."
              },
              "observer_offset": {
                "label": "Observer Offset",
                "description": "Height of each observer above the surface, in z units (default 2.0)."
              },
              "observer_offset_field": {
                "label": "Observer Offset Field",
                "description": "Attribute holding a per-observer height, overriding 'observer_offset'."
              },
              "target_offset": {
                "label": "Target Offset",
                "description": "Height of the target above the surface, in z units (default 0.0)."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Ignore cells farther than this from an observer, in map units. Unlimited by default."
              },
              "curvature": {
                "label": "Curvature",
                "description": "Apply the Earth-curvature and refraction correction (default false, i.e. a flat earth)."
              },
              "refractivity_coefficient": {
                "label": "Refractivity Coefficient",
                "description": "Atmospheric refraction coefficient used with 'curvature' (default 0.13)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the elevation raster (default 1)."
              }
            }
          },
          "optics_clustering": {
            "name": "OPTICS Clustering",
            "description": "Multi-scale density-based clustering via OPTICS (like the OPTICS option of ArcGIS Density-based Clustering): builds a reachability ordering and extracts clusters of varying density with the ξ-steep method — the multi-scale member of the DBSCAN/HDBSCAN/OPTICS trio the authored dbscan and hdbscan don't cover.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (projected CRS; distances in its units)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (a copy of the input with cluster fields). If omitted, stored in memory."
              },
              "min_features_cluster": {
                "label": "Min Features Cluster",
                "description": "Minimum points for the core-distance density estimate and the smallest cluster (>= 2). Default 5."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Optional maximum reachability distance (max epsilon). Default: unbounded (all scales)."
              },
              "cluster_sensitivity": {
                "label": "Cluster Sensitivity",
                "description": "0-100; higher detects more/tighter clusters. Maps to xi = 1 - sensitivity/100. Default 95 (xi = 0.05)."
              }
            }
          },
          "optimal_corridor_connections": {
            "name": "Optimal Corridor Connections",
            "description": "Compute the network of fixed-width least-cost corridor polygons that optimally connects every input region across a cost surface, plus the corridor centerlines. Unlike cost_connectivity (zero-width lines) or corridor (a single-pair cost surface), this emits ready-to-use corridor polygons for the whole region network. Like ArcGIS Optimal Corridor Connections.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Region polygon features to connect."
              },
              "output": {
                "label": "Output",
                "description": "Output corridor polygon path. If omitted, stored in memory."
              },
              "cost_raster": {
                "label": "Cost Raster",
                "description": "Optional cost surface. Without it, cost is uniform (Euclidean)."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Optional polygon features treated as impassable."
              },
              "corridor_width": {
                "label": "Corridor Width",
                "description": "Corridor width in map units (default: 10 cells)."
              },
              "output_lines": {
                "label": "Output Lines",
                "description": "Optional path for the corridor centerlines."
              },
              "neighbor_option": {
                "label": "Neighbor Option",
                "description": "'spanning_tree' (default) keeps only the corridors needed to connect every region; 'all_pairs' emits a corridor for every region pair."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Analysis cell size when no cost raster is supplied (default: region extent / 200)."
              }
            }
          },
          "optimal_interpolation": {
            "name": "Optimal Interpolation",
            "description": "Correct a background raster field with point observations via the optimal-interpolation / data-assimilation analysis step x_a = x_b + B Hᵀ (H B Hᵀ + R)⁻¹ (y − H x_b), using a Gaussian spatial correlation of the given correlation length and per-observation/background error variances (like ArcGIS's Optimal Interpolation). Unlike IDW/kriging/EBK, which interpolate from points alone, this blends a prior gridded field with observations and can emit an analysis-error-variance raster.",
            "params": {
              "background": {
                "label": "Background",
                "description": "Background (prior) raster field to be corrected."
              },
              "observations": {
                "label": "Observations",
                "description": "Observation point layer."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field on the observation layer holding the observed value."
              },
              "output": {
                "label": "Output",
                "description": "Output corrected (analysis) raster. If omitted, stored in memory."
              },
              "correlation_length": {
                "label": "Correlation Length",
                "description": "Spatial correlation length L in CRS units (Gaussian). Default: 5% of the background's longer side."
              },
              "background_error_variance": {
                "label": "Background Error Variance",
                "description": "Background-error variance σ_b² (default 1.0). Larger => trust observations more."
              },
              "obs_error_variance": {
                "label": "Obs Error Variance",
                "description": "Observation-error variance σ_o² (default 1.0), used when no per-point error field is given. Larger => trust the background more."
              },
              "error_field": {
                "label": "Error Field",
                "description": "Optional field on the observation layer giving each point's error variance (overrides obs_error_variance where present and > 0)."
              },
              "band": {
                "label": "Band",
                "description": "1-based background band to correct (default 1)."
              },
              "max_obs": {
                "label": "Max Obs",
                "description": "Maximum nearest observations used in each cell's local solve (default 50, range 1..=200)."
              },
              "analysis_error": {
                "label": "Analysis Error",
                "description": "Optional output raster of the analysis-error variance σ_a² (≤ σ_b²)."
              }
            }
          },
          "optimal_path_as_line": {
            "name": "Optimal Path As Line",
            "description": "Traces a cost backlink raster from each destination back to its source and emits the least-cost routes as polylines (ArcGIS Optimal Path As Line / Cost Path As Polyline). cost_pathway only marks the route as raster cells and cost_connectivity only covers the N-site network case, so the ordinary source-to-destination path had no vector form.",
            "params": {
              "destination": {
                "label": "Destination",
                "description": "Destinations to trace from: a raster (any non-zero, non-no-data cell) or a point/multipoint vector layer."
              },
              "backlink": {
                "label": "Backlink",
                "description": "Backlink direction raster from cost_back_link (0 = source, 1-8 = direction toward the source, 1 = east counter-clockwise)."
              },
              "accumulation": {
                "label": "Accumulation",
                "description": "Optional accumulated-cost raster (cost_back_link's out_distance). Supplies each path's total cost and is required by path_type 'each_zone' and 'best_single'."
              },
              "path_type": {
                "label": "Path Type",
                "description": "One of 'each_cell' (default, one path per destination cell), 'each_zone' (one path per destination zone, from its cheapest cell), 'best_single' (the single cheapest path)."
              },
              "zone_field": {
                "label": "Zone Field",
                "description": "Attribute holding the zone id for a vector destination under path_type 'each_zone'. Raster destinations use the cell value as the zone."
              },
              "output": {
                "label": "Output",
                "description": "Output polyline layer. If omitted, stored in memory."
              }
            }
          },
          "optimized_hot_spot_analysis": {
            "name": "Optimized Hot Spot Analysis",
            "description": "Auto-aggregate incidents, auto-select the analysis distance band, run Getis-Ord Gi*, and report an FDR-corrected hot/cold-spot bin (like ArcGIS Optimized Hot Spot Analysis) — the workflow wrapper the raw bundled getis_ord_gi_star lacks.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer (incident points, or features with an analysis field)."
              },
              "output": {
                "label": "Output",
                "description": "Output point layer with Gi* results. If omitted, stored in memory."
              },
              "analysis_field": {
                "label": "Analysis Field",
                "description": "Numeric field to analyze (weighted, no aggregation). Omit to count incidents."
              },
              "aggregation": {
                "label": "Aggregation",
                "description": "Incident aggregation when no analysis_field: 'fishnet' (grid count; default) or 'snap' (merge coincident)."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Aggregation cell/snap size in CRS units. Default: extent's longer side / 30."
              },
              "distance_band": {
                "label": "Distance Band",
                "description": "Analysis distance band in CRS units. Default: auto-selected by peak clustering intensity."
              }
            }
          },
          "optimized_outlier_analysis": {
            "name": "Optimized Outlier Analysis",
            "description": "Auto-aggregate incidents, auto-select the analysis distance band, run Anselin Local Moran's I, and report FDR-corrected cluster/outlier types (HH/LL/HL/LH) — like ArcGIS Optimized Outlier Analysis; the non-temporal Local Moran wrapper the raw bundled local_morans_i_lisa and the space-time local_outlier_analysis don't provide.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer (incident points, or features with an analysis field)."
              },
              "output": {
                "label": "Output",
                "description": "Output point layer with Local Moran results. If omitted, stored in memory."
              },
              "analysis_field": {
                "label": "Analysis Field",
                "description": "Numeric field to analyze (weighted, no aggregation). Omit to count incidents."
              },
              "aggregation": {
                "label": "Aggregation",
                "description": "Incident aggregation when no analysis_field: 'fishnet' (grid count; default) or 'snap' (merge coincident)."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Aggregation cell/snap size in CRS units. Default: extent's longer side / 30."
              },
              "distance_band": {
                "label": "Distance Band",
                "description": "Analysis distance band in CRS units. Default: auto-selected by peak clustering intensity."
              },
              "fdr_alpha": {
                "label": "Fdr Alpha",
                "description": "False Discovery Rate level for COType significance (default 0.05)."
              }
            }
          },
          "ordinary_cokriging": {
            "name": "Ordinary CoKriging Interpolation",
            "description": "Performs multivariate spatial interpolation using auxiliary variables to improve primary variable predictions. Ideal when primary data are sparse but correlated secondary data are abundant.",
            "params": {
              "primary_points": {
                "label": "Primary Points",
                "description": "Vector layer with primary variable training points"
              },
              "primary_field": {
                "label": "Primary Field",
                "description": "Field containing primary variable values"
              },
              "auxiliary_inputs": {
                "label": "Auxiliary Inputs",
                "description": "Comma-separated list of auxiliary variable file paths"
              },
              "auxiliary_fields": {
                "label": "Auxiliary Fields",
                "description": "Comma-separated field names for auxiliary variables (empty for rasters)"
              },
              "template_raster": {
                "label": "Template Raster",
                "description": "Raster template defining output grid and CRS"
              },
              "output": {
                "label": "Output",
                "description": "Output kriged raster path"
              },
              "output_variance": {
                "label": "Output Variance",
                "description": "Optional output kriging variance raster path"
              },
              "neighborhood_size": {
                "label": "Neighborhood Size",
                "description": "Number of nearest neighbors for local cokriging (default: all)"
              }
            }
          },
          "pairwise_comparison_weights": {
            "name": "Pairwise Comparison Weights",
            "description": "Derive criterion weights from an AHP pairwise-comparison matrix (Saaty 1-9 scale) as the normalized principal eigenvector, with a consistency check (lambda_max, consistency index, consistency ratio) — like ArcGIS Assign Weights By Pairwise Comparison.",
            "params": {
              "matrix": {
                "label": "Matrix",
                "description": "The n x n reciprocal comparison matrix as a JSON 2-D array, e.g. [[1,3,5],[0.333,1,2],[0.2,0.5,1]]. Provide this or `input`."
              },
              "input": {
                "label": "Input",
                "description": "CSV file holding the comparison matrix (plain numeric rows, or labeled with a header row and a leading name column). Provide this or `matrix`."
              },
              "criteria": {
                "label": "Criteria",
                "description": "Comma-separated criterion names (must match the matrix order). Overrides CSV labels; defaults to C1..Cn."
              },
              "output": {
                "label": "Output",
                "description": "Output table path — a CSV (extension .csv) or a geometry-less vector table (criterion, weight, rank). If omitted, stored in memory."
              }
            }
          },
          "path_distance": {
            "name": "Path Distance",
            "description": "Accumulated least-cost distance where each step pays the true 3-D surface distance (from a DEM) times a slope-dependent vertical factor (Tobler hiking, linear, binary) times friction, like ArcGIS Path Distance.",
            "params": {
              "source": {
                "label": "Source",
                "description": "Source raster; cells with positive, non-nodata values are origins (accumulated cost 0)."
              },
              "output": {
                "label": "Output",
                "description": "Output accumulated-cost raster. If omitted, stored in memory."
              },
              "cost": {
                "label": "Cost",
                "description": "Optional friction/cost-of-passage raster (default uniform 1)."
              },
              "surface": {
                "label": "Surface",
                "description": "Optional elevation (DEM) raster; enables 3-D surface distance and slope-based vertical factors."
              },
              "vertical_factor": {
                "label": "Vertical Factor",
                "description": "'tobler' (default), 'linear', 'sym_linear', 'inverse_linear', or 'binary'."
              },
              "slope_factor": {
                "label": "Slope Factor",
                "description": "Slope penalty coefficient for the linear factors (default 1)."
              },
              "zero_factor": {
                "label": "Zero Factor",
                "description": "Minimum (downhill) vertical factor floor for linear/inverse_linear (default 0.1)."
              },
              "max_slope": {
                "label": "Max Slope",
                "description": "For 'binary': slopes steeper than this many degrees are impassable (default 30)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band for all rasters (default 1)."
              }
            }
          },
          "percentile_contours": {
            "name": "Percentile Contours",
            "description": "Emit nested polygons enclosing the most extreme cells of a surface, thresholded by value percentile or by cumulative-mass (volume) percentile.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input continuous surface raster (density, suitability, elevation)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output polygon vector path (driver from its extension). If omitted, stored in memory."
              },
              "percentiles": {
                "label": "Percentiles",
                "description": "Comma-separated percentiles in [0,100] (e.g. \"50,90,95\"). Default \"90\"."
              },
              "mode": {
                "label": "Mode",
                "description": "'value' (default): cells at/above the p-th percentile value. 'volume': highest cells carrying the top (100-p)% of cumulative value."
              },
              "ignore_negative": {
                "label": "Ignore Negative",
                "description": "Exclude negative cell values from ranking and output. Default false."
              },
              "smooth": {
                "label": "Smooth",
                "description": "Simplify the cell-edge polygons with Douglas-Peucker (tolerance ~1.5 cells) to soften the staircase. Default false."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "pivot_table": {
            "name": "Pivot Table",
            "description": "Reshape a long-form attribute table to wide: one output row per unique combination of the identity fields, and one column per distinct value of the pivot field, filled from the value field. Like ArcGIS Pivot Table.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer or attribute table in long form."
              },
              "output": {
                "label": "Output",
                "description": "Output table path (driver from extension). If omitted, stored in memory."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma/semicolon-separated field name(s) identifying an output row; carried through unchanged."
              },
              "pivot_field": {
                "label": "Pivot Field",
                "description": "Field whose distinct values become new columns."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Field supplying the cell values."
              },
              "aggregate": {
                "label": "Aggregate",
                "description": "Applied when one row/column cell has multiple source records: 'first' (default), 'sum', 'mean', 'min', 'max', 'count'."
              }
            }
          },
          "pmtiles_extract": {
            "name": "PMTiles Extract",
            "description": "Extract a bbox/zoom subset of a PMTiles archive into a new archive (e.g. an offline basemap from a Protomaps planet build).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input .pmtiles file path."
              },
              "output": {
                "label": "Output",
                "description": "Output .pmtiles file path."
              },
              "bbox": {
                "label": "Bbox",
                "description": "WGS84 bounding box as 'min_lon,min_lat,max_lon,max_lat'."
              },
              "min_zoom": {
                "label": "Min Zoom",
                "description": "Lowest zoom level to include (default 0, so the map stays usable zoomed out)."
              },
              "max_zoom": {
                "label": "Max Zoom",
                "description": "Highest zoom level to include (default: the source archive's max zoom)."
              },
              "max_tiles": {
                "label": "Max Tiles",
                "description": "Abort if the selection addresses more tiles than this (default 2000000)."
              },
              "url": {
                "label": "Url",
                "description": "HTTP(S) PMTiles URL. Provide either url or input; HTTP sources use byte-range requests (the host must allow cross-origin Range reads)."
              },
              "bbox_crs": {
                "label": "Bbox Crs",
                "description": "EPSG code of the bbox coordinates. Defaults to 4326 (WGS84 lon/lat); other CRSs are reprojected to 4326."
              }
            }
          },
          "point_statistics": {
            "name": "Point Statistics",
            "description": "Rasterize a moving-window statistic of a point-feature attribute: for each output cell, a neighborhood (circle or rectangle) collects the values of the chosen numeric field from the points inside it and reduces them to mean/majority/maximum/median/minimum/minority/range/std/sum/variety. Like ArcGIS Point Statistics; complements the density-only line_density/heat_map and the vector-only neighborhood_summary_statistics.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (Point / MultiPoint)."
              },
              "field": {
                "label": "Field",
                "description": "Numeric attribute field to summarize."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path (driver from extension). If omitted, stored in memory."
              },
              "statistic": {
                "label": "Statistic",
                "description": "Statistic per neighborhood: mean (default), majority, maximum, median, minimum, minority, range, std, sum, or variety."
              },
              "neighborhood": {
                "label": "Neighborhood",
                "description": "Neighborhood shape: 'circle' (default, uses 'radius') or 'rectangle' (a square of side 2*radius)."
              },
              "radius": {
                "label": "Radius",
                "description": "Neighborhood radius / rectangle half-side (metres for a geographic CRS, CRS units otherwise). Default: shorter extent side / 20."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size (same units as radius). Default: radius / 5."
              },
              "epsg": {
                "label": "Epsg",
                "description": "Override the input CRS EPSG code (e.g. when the layer is unlabeled). 4326 triggers the metre projection."
              }
            }
          },
          "points_to_line": {
            "name": "Points To Line",
            "description": "Build polyline features from points: one line per distinct line_field value, vertices ordered by sort_field, with an optional close-line flag.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector file path (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output line vector path (driver from its extension). If omitted, stored in memory."
              },
              "line_field": {
                "label": "Line Field",
                "description": "Attribute whose distinct values partition the points into separate lines (one polyline per value). If omitted, all points form a single line."
              },
              "sort_field": {
                "label": "Sort Field",
                "description": "Attribute that sets the vertex order within each line. Numeric values sort numerically, text lexicographically. If omitted, input feature order is used."
              },
              "close_line": {
                "label": "Close Line",
                "description": "Append the first vertex to the end of each line, closing it into a ring. Default false."
              }
            }
          },
          "points_to_path": {
            "name": "Points To Path",
            "description": "Connect points into polyline features, ordered by a field and (optionally) grouped into one path per value, with optional natural sort and path closing.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector file path (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output line vector path (driver from its extension). If omitted, stored in memory."
              },
              "order_field": {
                "label": "Order Field",
                "description": "Attribute that sets the point connection order within each path. Numeric values sort numerically, text lexicographically. If omitted, input feature order is used."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Attribute that partitions points into separate paths (one line per distinct value). If omitted, all points form a single path."
              },
              "natural_sort": {
                "label": "Natural Sort",
                "description": "Sort text order values naturally so 'a9' comes before 'a10'. Default false."
              },
              "close_path": {
                "label": "Close Path",
                "description": "Append the first vertex to the end of each path, closing it into a ring. Default false."
              }
            }
          },
          "polygon_neighbors": {
            "name": "Polygon Neighbors",
            "description": "Build a polygon adjacency (contiguity) table: neighbouring pairs with the length of their shared border and a count of point-touches, like ArcGIS Polygon Neighbors.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output table path — a CSV (extension .csv) or a geometry-less vector table. If omitted, stored in memory."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Field identifying each polygon in the table. Default: the feature index."
              },
              "both_sides": {
                "label": "Both Sides",
                "description": "Emit each neighbour pair twice (src→nbr and nbr→src). Default false (once per pair)."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Quantize vertices onto a grid of this size (CRS units) before matching borders. Default 0 (exact coordinates)."
              }
            }
          },
          "polygon_volume": {
            "name": "Polygon Volume",
            "description": "Per-polygon volume and 3D surface area of a surface raster above/below each feature's reference-plane height, like ArcGIS Polygon Volume — the zonal counterpart of surface_volume.",
            "params": {
              "surface": {
                "label": "Surface",
                "description": "Input elevation surface raster."
              },
              "input": {
                "label": "Input",
                "description": "Polygon vector layer (zones)."
              },
              "height_field": {
                "label": "Height Field",
                "description": "Attribute field giving each polygon's reference-plane elevation."
              },
              "direction": {
                "label": "Direction",
                "description": "Which side of each plane to integrate: 'above' (default), 'below', or 'both'."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from the surface (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "porous_puff": {
            "name": "Porous Puff",
            "description": "Analytic advection-dispersion of an instantaneous contaminant slug through groundwater (like ArcGIS Porous Puff): march the puff centre from a release point along a Darcy velocity field (magnitude+direction, as produced by darcy_flow), then evaluate the closed-form 2-D Gaussian puff concentration in path-aligned coordinates, scaled by porosity, thickness, retardation, and first-order decay.",
            "params": {
              "magnitude": {
                "label": "Magnitude",
                "description": "Darcy velocity magnitude raster, as produced by darcy_flow's 'output'. Cell size/extent are taken from this raster."
              },
              "direction": {
                "label": "Direction",
                "description": "Darcy flow-direction raster (azimuth degrees from north, clockwise, down-gradient), as produced by darcy_flow's 'direction'. Must be co-registered with 'magnitude'."
              },
              "x": {
                "label": "X",
                "description": "Release point X coordinate (map units, same CRS as the velocity rasters)."
              },
              "y": {
                "label": "Y",
                "description": "Release point Y coordinate (map units)."
              },
              "mass": {
                "label": "Mass",
                "description": "Released contaminant mass (must be positive)."
              },
              "porosity": {
                "label": "Porosity",
                "description": "Effective porosity: either a numeric constant (0, 1] or a raster path co-registered with 'magnitude'."
              },
              "thickness": {
                "label": "Thickness",
                "description": "Aquifer thickness: either a positive numeric constant or a raster path co-registered with 'magnitude'."
              },
              "dispersivity_long": {
                "label": "Dispersivity Long",
                "description": "Longitudinal dispersivity (length units; must be positive)."
              },
              "dispersivity_trans": {
                "label": "Dispersivity Trans",
                "description": "Transverse dispersivity (length units; must be positive)."
              },
              "retardation": {
                "label": "Retardation",
                "description": "Retardation factor (default 1, must be >= 1)."
              },
              "decay": {
                "label": "Decay",
                "description": "First-order decay constant (default 0, must be >= 0; same time units as 'time')."
              },
              "time": {
                "label": "Time",
                "description": "Comma-separated list of one or more positive elapsed times. The last time is written to 'output'; all times (including the last) are reported in the 'time_series' output."
              },
              "output": {
                "label": "Output",
                "description": "Output concentration raster path for the last time in 'time'. If omitted, stored in memory."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from the magnitude/direction rasters (default 1)."
              },
              "step": {
                "label": "Step",
                "description": "Puff-centre marching step length in CRS units (default: the magnitude raster's cell size)."
              },
              "max_steps": {
                "label": "Max Steps",
                "description": "Maximum marching steps per requested time (default 1000)."
              }
            }
          },
          "predict_using_trend_raster": {
            "name": "Predict Using Trend Raster",
            "description": "Evaluate the slope/intercept rasters fitted by generate_trend_raster at one or more times, producing predicted surfaces, like ArcGIS Predict Using Trend Raster.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Slope (trend) raster written by generate_trend_raster."
              },
              "intercept": {
                "label": "Intercept",
                "description": "Intercept raster written by generate_trend_raster (its 'intercept_output'), co-registered to the slope raster."
              },
              "output": {
                "label": "Output",
                "description": "Output raster path for the first predicted time. If omitted, results are stored in memory."
              },
              "times": {
                "label": "Times",
                "description": "Comma-separated times to predict at, on the same scale used for the fit (e.g. '12,18,24'). Overrides start/end/interval."
              },
              "start": {
                "label": "Start",
                "description": "First time of a generated range (used when 'times' is absent)."
              },
              "end": {
                "label": "End",
                "description": "Last time of a generated range (inclusive; used when 'times' is absent)."
              },
              "interval": {
                "label": "Interval",
                "description": "Step between generated times (default 1; used when 'times' is absent)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read from each coefficient raster (default 1)."
              }
            }
          },
          "presence_only_prediction": {
            "name": "Presence-only Prediction",
            "description": "MaxEnt-style species/habitat-suitability modelling: fit an L1-regularized logistic model contrasting presence points against a seeded background sample of explanatory rasters (linear/quadratic/hinge basis expansion), then predict a probability-of-presence surface plus a variable-importance report — like ArcGIS Presence-only Prediction (MaxEnt).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input presence point vector layer (observed occurrences)."
              },
              "explanatory": {
                "label": "Explanatory",
                "description": "Comma-separated list of explanatory raster paths (the covariate stack). Sampled at presence + background locations; the first raster defines the output grid."
              },
              "output": {
                "label": "Output",
                "description": "Output probability-of-presence raster path. If omitted, stored in memory."
              },
              "report": {
                "label": "Report",
                "description": "Optional output path for a CSV coefficient / variable-importance table."
              },
              "features": {
                "label": "Features",
                "description": "Comma-separated basis-expansion feature classes: any of 'linear', 'quadratic', 'hinge'. Default 'linear,quadratic'."
              },
              "background": {
                "label": "Background",
                "description": "Number of background samples drawn from the raster stack. Default 1000 (capped at the number of valid cells)."
              },
              "regularization": {
                "label": "Regularization",
                "description": "L1 (lasso) regularization strength on the standardized features. Larger = simpler model. Default 0.01."
              },
              "hinge_knots": {
                "label": "Hinge Knots",
                "description": "Number of interior knots per covariate for hinge features (only used when 'hinge' is enabled). Default 10."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for the deterministic background sample (default 1)."
              }
            }
          },
          "propagate_displacement": {
            "name": "Propagate Displacement",
            "description": "Propagate the displacement introduced by resolve_road_conflicts (or any two-point displacement-links layer) onto nearby features by interpolating the sparse links into a smooth IDW field: rigid features (buildings, parcels) get a single averaged translation, flexible lines get a per-vertex, arc-length-smoothed bend, like ArcGIS Propagate Displacement.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer to adjust (any geometry type)."
              },
              "links": {
                "label": "Links",
                "description": "Displacement links: a 2-vertex line layer per link, first vertex = original location, last vertex = displaced location (the schema resolve_road_conflicts's 'links' output and rubbersheet_features's 'links' input both use)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from extension). If omitted, stored in memory."
              },
              "adjustment_style": {
                "label": "Adjustment Style",
                "description": "'auto' (default: rigid translate for points/polygons, per-vertex bend for lines), 'preserve_orientation' (rigid translate by the field averaged over the footprint), or 'solid' (rigid translate by the field sampled once at the feature's representative point)."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Maximum distance (CRS units) a link may influence a sample point; farther links are ignored. Default: unlimited (every link contributes everywhere)."
              }
            }
          },
          "pycnophylactic_interpolation": {
            "name": "Pycnophylactic Interpolation",
            "description": "Tobler's mass-preserving areal interpolation: turn zone-aggregated counts into a smooth density surface whose per-zone sums exactly match the input (like ArcGIS Areal Interpolation) — the smooth alternative to the uniform-density assumption of apportion_polygon.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon layer with a count field (extensive variable)."
              },
              "count_field": {
                "label": "Count Field",
                "description": "Field holding each zone's total count (population, etc.)."
              },
              "output": {
                "label": "Output",
                "description": "Output density raster (per-cell value; zone sums equal the input). If omitted, stored in memory."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units (default: extent / 200)."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Maximum smoothing iterations (default 100)."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Stop when the max per-cell change falls below this fraction of the mean density (default 0.001)."
              },
              "non_negative": {
                "label": "Non Negative",
                "description": "Clamp negatives to 0 and redistribute to preserve mass (default true)."
              }
            }
          },
          "radiometric_terrain_flattening": {
            "name": "Radiometric Terrain Flattening",
            "description": "Removes the topographic brightness signal from calibrated SAR backscatter by replacing the flat-earth reference area with the DEM-derived local illuminated area, and flags layover and radar shadow (ArcGIS Apply Radiometric Terrain Flattening). Round 17's apply_radiometric_calibration normalises with the ellipsoid incidence angle, so on sloping ground its sigma0/gamma0 tracks topography rather than land cover — routinely by more than 6 dB, which exceeds the forest/bare-soil difference it is meant to measure.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Calibrated SAR backscatter raster (beta nought by default; see 'input_calibration')."
              },
              "dem": {
                "label": "Dem",
                "description": "Digital elevation model, co-registered with the input raster."
              },
              "output": {
                "label": "Output",
                "description": "Output terrain-flattened backscatter raster. If omitted, stored in memory."
              },
              "output_scattering_area": {
                "label": "Output Scattering Area",
                "description": "Output ratio of the true illuminated area to the flat-earth area. Always produced; stored in memory when no path is given."
              },
              "output_geometry_mask": {
                "label": "Output Geometry Mask",
                "description": "Output mask: 0 normal, 1 layover, 2 radar shadow. Always produced; stored in memory when no path is given."
              },
              "incidence_angle": {
                "label": "Incidence Angle",
                "description": "Ellipsoid incidence angle in degrees: a constant, or the path to a per-cell raster. Required."
              },
              "look_azimuth": {
                "label": "Look Azimuth",
                "description": "Compass azimuth in degrees from the target toward the sensor (default 270, i.e. a right-looking ascending pass). A right-looking descending Sentinel-1 pass is about 283."
              },
              "input_calibration": {
                "label": "Input Calibration",
                "description": "What the input already is: 'beta0' (default), 'sigma0_ellipsoid', or 'gamma0_ellipsoid'. The latter two are converted back to beta nought using the ellipsoid angle before flattening."
              },
              "calibration_type": {
                "label": "Calibration Type",
                "description": "Output convention: 'gamma0' (default) or 'sigma0'."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'intensity' (default), 'dn', 'amplitude', or 'db'."
              },
              "output_units": {
                "label": "Output Units",
                "description": "'linear' (default) or 'db'."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Multiplier converting DEM z units into the raster's XY units (default 1.0)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the input raster to flatten (default 1)."
              }
            }
          },
          "raster_domain": {
            "name": "Raster Domain",
            "description": "Traces the boundary of a raster's valid-data region as polygons (or closed polylines), preserving interior no-data holes (ArcGIS Raster Domain). The bundled layer_footprint_raster returns the full rectangular extent, which for a rotated scene, a clipped watershed or a ragged mosaic tile can be several times the actual coverage; polygonize could do it but only from a 0/1 validity mask the caller has to build first, which is the entire task.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster whose valid-data footprint is wanted."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon or line layer. If omitted, stored in memory."
              },
              "geometry_type": {
                "label": "Geometry Type",
                "description": "'polygon' (default) or 'line' for the boundary as closed polylines."
              },
              "ignore_value": {
                "label": "Ignore Value",
                "description": "Treat this value as invalid too, alongside the raster's own no-data (commonly 0 for imagery with a black border)."
              },
              "min_value": {
                "label": "Min Value",
                "description": "Treat values below this as invalid."
              },
              "max_value": {
                "label": "Max Value",
                "description": "Treat values above this as invalid."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Discard footprint parts smaller than this area in map units squared, which removes speckle around a ragged margin."
              },
              "fill_holes": {
                "label": "Fill Holes",
                "description": "Drop interior holes and return the solid footprint (default false)."
              },
              "all_bands": {
                "label": "All Bands",
                "description": "Require a cell to be valid in every band rather than just the selected one (default false)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to test (default 1). Ignored when 'all_bands' is set."
              }
            }
          },
          "raster_normalize": {
            "name": "Raster Normalize",
            "description": "Min-max normalize a raster band to the range [0, 1].",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to normalize (default 1)."
              }
            }
          },
          "raster_to_h3": {
            "name": "Raster to H3 Bins",
            "description": "Aggregate raster band values into H3 discrete-global-grid cells (mean, sum, min, max, count, median).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path (must be geographic lon/lat, EPSG:4326)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path; the driver is taken from its extension (.geojson, .fgb, .parquet, ...). If omitted, the layer is stored in memory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0 (coarsest) to 15 (finest); default 8 (~0.7 km² cells)."
              },
              "band": {
                "label": "Band",
                "description": "1-based raster band to aggregate (default 1)."
              },
              "aggregate": {
                "label": "Aggregate",
                "description": "How to combine pixel values per cell: mean, sum, min, max, count, or median (default mean)."
              }
            }
          },
          "raster_to_tiles": {
            "name": "Raster to XYZ Tiles",
            "description": "Slice a raster into a Web Mercator (EPSG:3857) XYZ PNG tile pyramid for web maps.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path. Must carry a source CRS (EPSG or WKT)."
              },
              "output_dir": {
                "label": "Output Dir",
                "description": "Output directory for the {z}/{x}/{y}.png tile tree (e.g. /work/tiles)."
              },
              "min_zoom": {
                "label": "Min Zoom",
                "description": "Minimum zoom level (default: a single native zoom matching the raster resolution)."
              },
              "max_zoom": {
                "label": "Max Zoom",
                "description": "Maximum zoom level (default: same as min_zoom)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to render (default 1)."
              },
              "colormap": {
                "label": "Colormap",
                "description": "Colormap: viridis (default), magma, turbo, terrain, or grayscale."
              },
              "method": {
                "label": "Method",
                "description": "Resampling method for reprojection and sampling: bilinear (default), nearest, cubic."
              },
              "min": {
                "label": "Min",
                "description": "Value mapped to the low end of the colormap (default: band minimum)."
              },
              "max": {
                "label": "Max",
                "description": "Value mapped to the high end of the colormap (default: band maximum)."
              }
            }
          },
          "raster_to_weighted_points": {
            "name": "Raster To Weighted Points",
            "description": "Distributes a fixed number of points across a raster so their density is proportional to cell value, placing them on a deterministic Fibonacci lattice, spiral, circular or centroid pattern (ArcGIS Raster To Weighted Points). Nothing in either registry weights by a surface: random_sample and random_points_in_polygon are uniform, create_spatially_balanced_points deliberately spreads points evenly, and raster_to_vector_points emits one per cell without thinning or weighting. Allocation uses the largest-remainder method and needs no RNG, so results are reproducible in WASM.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input surface raster; cell values are the weights."
              },
              "output": {
                "label": "Output",
                "description": "Output point layer. If omitted, stored in memory."
              },
              "max_number_of_points": {
                "label": "Max Number Of Points",
                "description": "Total points to distribute (default 1000)."
              },
              "method": {
                "label": "Method",
                "description": "In-cell placement: 'fibonacci_lattice' (default), 'fibonacci_spiral', 'circular', or 'centroid'."
              },
              "min_value": {
                "label": "Min Value",
                "description": "Cells at or below this weight get no points (default 0). Negative weights are always excluded."
              },
              "max_points_per_cell": {
                "label": "Max Points Per Cell",
                "description": "Cap the points any single cell may receive, so one hot cell cannot absorb the whole budget."
              },
              "include_weight": {
                "label": "Include Weight",
                "description": "Write the source cell value onto each point (default true)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band supplying the weights (default 1)."
              }
            }
          },
          "read_geoparquet": {
            "name": "Read GeoParquet",
            "description": "Read a GeoParquet file and convert it to another vector format (or store it in memory).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input GeoParquet file path (e.g. /work/data.parquet)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path; format is taken from its extension (.geojson, .fgb, .shp, .gpkg, ...). If omitted, the layer is stored in memory."
              }
            }
          },
          "reclassify_field": {
            "name": "Reclassify Field",
            "description": "Classify a numeric vector attribute into class bins (like ArcGIS Reclassify Field): equal_interval, defined_interval, quantile, natural_breaks (Jenks), std_dev, or geometric_interval, writing an integer class field plus an optional break-value field.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (or table) with the numeric field to classify."
              },
              "field": {
                "label": "Field",
                "description": "Name of the numeric field to classify."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer with the class field added. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "Classification method: equal_interval, defined_interval, quantile, natural_breaks, std_dev, or geometric_interval (default natural_breaks)."
              },
              "classes": {
                "label": "Classes",
                "description": "Number of classes for equal_interval/quantile/natural_breaks/geometric_interval (default 5). Ignored by defined_interval and std_dev, whose class count follows the data."
              },
              "interval": {
                "label": "Interval",
                "description": "Fixed class width for defined_interval (required for that method)."
              },
              "std_dev_interval": {
                "label": "Std Dev Interval",
                "description": "Interval size for std_dev, in units of standard deviation (default 1.0; e.g. 0.5 for half-sigma bands)."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Name of the integer class field to add (default 'class')."
              },
              "break_field": {
                "label": "Break Field",
                "description": "If given, also add a float field with the upper class limit each feature falls under."
              }
            }
          },
          "reconstruct_tracks": {
            "name": "Reconstruct Tracks",
            "description": "Turn timestamped points into movement track polylines (grouped by id, sorted by time, split on time/distance gaps) with per-track stats, and optionally find dwell locations where the mover paused — like ArcGIS Reconstruct Tracks / Find Dwell Locations.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer of timestamped observations."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying each track/mover (e.g. vehicle or animal id)."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: numeric seconds or an ISO-8601 timestamp."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector of tracks (driver from extension). If omitted, stored in memory."
              },
              "time_gap": {
                "label": "Time Gap",
                "description": "Start a new track segment when the time gap between points exceeds this many seconds. Default: no time split."
              },
              "distance_gap": {
                "label": "Distance Gap",
                "description": "Start a new track segment when the distance between points exceeds this (metres for geographic CRS, CRS units otherwise). Default: no distance split."
              },
              "dwells": {
                "label": "Dwells",
                "description": "Optional output point path for dwell locations (where the mover paused)."
              },
              "dwell_distance": {
                "label": "Dwell Distance",
                "description": "Max radius for a dwell, in the distance units above. Default 50."
              },
              "dwell_min_duration": {
                "label": "Dwell Min Duration",
                "description": "Minimum time (seconds) a mover must stay within dwell_distance to count as a dwell. Default 300."
              }
            }
          },
          "reduce_point_density": {
            "name": "Reduce Point Density",
            "description": "Thins a vector point layer so no two retained points are closer than a minimum spacing, or keeps one point per grid cell (ArcGIS Reduce Point Density). lidar_thin is LAS-only and find_identical catches only exact duplicates, so dense sounding, GPS and sensor layers could not be decimated before interpolation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point (or multipoint) layer."
              },
              "method": {
                "label": "Method",
                "description": "'spacing' (default): greedy minimum-separation thinning. 'bin': keep one point per grid cell."
              },
              "min_distance": {
                "label": "Min Distance",
                "description": "Minimum separation between retained points, in layer units. Required by method 'spacing'."
              },
              "bin_size": {
                "label": "Bin Size",
                "description": "Grid cell size in layer units. Required by method 'bin'."
              },
              "sort_field": {
                "label": "Sort Field",
                "description": "Numeric attribute deciding which point wins a conflict. Without it, input order decides."
              },
              "sort_order": {
                "label": "Sort Order",
                "description": "'descending' (default, highest sort_field wins) or 'ascending'."
              },
              "keep_field": {
                "label": "Keep Field",
                "description": "Attribute marking points that must always be retained (non-zero / true / non-empty). Use for hazards such as shoal soundings."
              },
              "output": {
                "label": "Output",
                "description": "Output layer of retained points. If omitted, stored in memory."
              },
              "output_removed": {
                "label": "Output Removed",
                "description": "Optional layer receiving the dropped points, for review."
              }
            }
          },
          "regression_kriging": {
            "name": "Regression Kriging",
            "description": "Kriging with external drift: regresses sample values on exhaustive covariate rasters, fits a variogram to the residuals, and adds the kriged residual field back to the regression surface (ArcGIS EBK Regression Prediction). Every shipped kriging variant models trend in the coordinates or needs secondary point samples; none accepts covariate rasters, which is what most applied geostatistics actually needs.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Sample point layer."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric attribute to predict."
              },
              "covariates": {
                "label": "Covariates",
                "description": "Comma- or semicolon-separated covariate raster paths, exhaustive over the prediction grid. The first defines the output grid."
              },
              "variogram_model": {
                "label": "Variogram Model",
                "description": "Residual variogram model: 'spherical' (default), 'exponential', or 'gaussian'."
              },
              "lag_count": {
                "label": "Lag Count",
                "description": "Number of lag bins used to fit the residual variogram (default 12)."
              },
              "max_neighbors": {
                "label": "Max Neighbors",
                "description": "Nearest samples used in each cell's kriging system (default 16)."
              },
              "bilinear": {
                "label": "Bilinear",
                "description": "Sample covariates bilinearly at the point locations instead of nearest-cell (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Output prediction raster. If omitted, stored in memory."
              },
              "output_error": {
                "label": "Output Error",
                "description": "Prediction standard-error raster (kriging standard error of the residual field). Always produced."
              }
            }
          },
          "regularize_adjacent_building_footprint": {
            "name": "Regularize Adjacent Building Footprint",
            "description": "Regularize a group of adjacent building footprints to one shared orientation so shared walls stay parallel and collinear (like ArcGIS Regularize Adjacent Building Footprint) — the group-consistent counterpart of the per-building regularize_building_footprints, which lets neighbouring footprints drift out of alignment.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input building-footprint polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon path. If omitted, stored in memory."
              },
              "group": {
                "label": "Group",
                "description": "Optional field grouping footprints to regularize together. Without it, groups are formed by boundary adjacency."
              },
              "method": {
                "label": "Method",
                "description": "'right_angles' (default) or 'right_angles_and_diagonals'."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Minimum wall length; shorter edges are pruned as noise (CRS units). Default 1.0."
              },
              "precision": {
                "label": "Precision",
                "description": "Grid step for snapping wall offsets so nearby parallel walls become collinear (CRS units). Default: tolerance."
              },
              "adjacency_distance": {
                "label": "Adjacency Distance",
                "description": "When no 'group' field is given, footprints whose vertices come within this distance are one group (CRS units). Default: 2 x tolerance."
              }
            }
          },
          "regularize_building_footprints": {
            "name": "Regularize Building Footprints",
            "description": "Normalize noisy building footprint polygons into regular shapes (right-angle, diagonal, any-angle, or circular walls).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "Regularization method: 'right_angles' (default), 'right_angles_and_diagonals', 'any_angle', or 'circle'."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum distance (in CRS units) the regularized footprint may deviate from the original boundary. Default 1.0."
              },
              "diagonal_penalty": {
                "label": "Diagonal Penalty",
                "description": "For 'right_angles_and_diagonals': how strongly right angles are preferred over 45-degree walls (a wall becomes diagonal only when its angular deviation from a diagonal, times this factor, is smaller than its deviation from an axis). Default 1.5; larger values yield fewer diagonals."
              },
              "min_radius": {
                "label": "Min Radius",
                "description": "For 'circle': smallest allowed fitted radius; smaller fits keep the original footprint. Default 0.1."
              },
              "max_radius": {
                "label": "Max Radius",
                "description": "For 'circle': largest allowed fitted radius; larger fits keep the original footprint. Unlimited if omitted."
              }
            }
          },
          "remove_overlap_multiple": {
            "name": "Remove Overlap (Multiple)",
            "description": "Reallocate every overlap among a set of polygons to exactly one feature, producing a gap-free, overlap-free partition of their union (centre-line or Thiessen division), like ArcGIS Remove Overlap (Multiple).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer (features may overlap)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path (driver from extension). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'center_line' (assign each overlap point to the feature it lies deepest inside, default) or 'thiessen' (nearest generator centroid)."
              },
              "grid_resolution": {
                "label": "Grid Resolution",
                "description": "Cells across the longer side of each overlap region when dividing (default 40; higher = smoother dividing lines, slower)."
              }
            }
          },
          "remove_thermal_noise": {
            "name": "Remove Thermal Noise",
            "description": "Subtracts the receiver's additive thermal noise floor from SAR backscatter, removing the across-swath banding that dominates dark surfaces such as calm water, flooded ground and radar shadow (ArcGIS Remove Thermal Noise). Nothing in either registry does this: the bundled lee/frost/kuan/refined-lee filters suppress multiplicative speckle, a different quantity. Without it an Otsu water threshold latches onto a sub-swath boundary rather than a shoreline, and cross-polarisation ratios are computed from a numerator that is largely noise.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Calibrated SAR backscatter raster."
              },
              "output": {
                "label": "Output",
                "description": "Output denoised raster. If omitted, stored in memory."
              },
              "output_snr": {
                "label": "Output Snr",
                "description": "Output signal-to-noise ratio in dB. Always produced; stored in memory when no path is given."
              },
              "noise_raster": {
                "label": "Noise Raster",
                "description": "Per-cell noise power raster, co-registered with the input. Takes precedence over the other two forms."
              },
              "noise_profile": {
                "label": "Noise Profile",
                "description": "Comma-separated across-range noise powers, linearly interpolated across the raster's columns. At least two values."
              },
              "noise_constant": {
                "label": "Noise Constant",
                "description": "Single noise-equivalent sigma nought applied to every cell."
              },
              "noise_units": {
                "label": "Noise Units",
                "description": "Units the noise values are in: 'intensity' (default), 'dn', 'amplitude', or 'db'."
              },
              "input_units": {
                "label": "Input Units",
                "description": "'intensity' (default), 'dn', 'amplitude', or 'db'."
              },
              "output_units": {
                "label": "Output Units",
                "description": "'linear' (default) or 'db'."
              },
              "floor_fraction": {
                "label": "Floor Fraction",
                "description": "Cells driven to or below zero are clamped to this fraction of the local noise power (default 0.01). Keeps a dB conversion finite."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to denoise (default 1)."
              }
            }
          },
          "render_raster_png": {
            "name": "Render Raster to PNG",
            "description": "Render a single raster band to a PNG image through a colormap (no-data becomes transparent).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Output PNG file path (e.g. /work/preview.png)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to render (default 1)."
              },
              "colormap": {
                "label": "Colormap",
                "description": "Colormap: viridis (default), magma, turbo, terrain, or grayscale."
              },
              "min": {
                "label": "Min",
                "description": "Value mapped to the low end of the colormap (default: band minimum)."
              },
              "max": {
                "label": "Max",
                "description": "Value mapped to the high end of the colormap (default: band maximum)."
              }
            }
          },
          "render_vector_png": {
            "name": "Render Vector to PNG",
            "description": "Draw a vector layer (points/lines/polygons) to a PNG map image.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Output PNG file path (e.g. /work/map.png)."
              },
              "width": {
                "label": "Width",
                "description": "Image width in pixels (default 800)."
              },
              "height": {
                "label": "Height",
                "description": "Image height in pixels (default: from the data aspect ratio)."
              },
              "fill": {
                "label": "Fill",
                "description": "Polygon/point fill color as #rrggbb or #rrggbbaa (default semi-transparent blue)."
              },
              "stroke": {
                "label": "Stroke",
                "description": "Outline/line color as #rrggbb or #rrggbbaa (default dark blue)."
              },
              "stroke_width": {
                "label": "Stroke Width",
                "description": "Outline/line width in pixels (default 1)."
              },
              "background": {
                "label": "Background",
                "description": "Background color as #rrggbb[aa] or 'transparent' (default transparent)."
              }
            }
          },
          "repair_geometry": {
            "name": "Repair Geometry",
            "description": "Detect and fix invalid polygon geometry — self-intersections (via self-union), ring winding, duplicate vertices, and null/empty parts — or, with check_only, report a per-feature problem code. Like ArcGIS Repair Geometry / Check Geometry.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or an in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "check_only": {
                "label": "Check Only",
                "description": "When true, do not modify geometry: emit the input with 'problem_code'/'problem_desc' columns (like ArcGIS Check Geometry). Default false."
              }
            }
          },
          "rescale_by_function": {
            "name": "Rescale By Function",
            "description": "Rescale a continuous raster onto a common suitability scale via a transfer function (linear, inverse_linear, power, exponential, logarithmic, logistic, gaussian, near, small, large, symmetric_linear), like ArcGIS Rescale By Function.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input continuous raster."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              },
              "function": {
                "label": "Function",
                "description": "Transfer function: linear (default), inverse_linear, power, exponential, logarithmic, logistic, gaussian, near, small, large, symmetric_linear."
              },
              "from_scale": {
                "label": "From Scale",
                "description": "Low end of the output scale (default 0)."
              },
              "to_scale": {
                "label": "To Scale",
                "description": "High end of the output scale (default 1)."
              },
              "param1": {
                "label": "Param1",
                "description": "First shape parameter (exponent for power; steepness for exponential/logarithmic/logistic/small/large; center for gaussian/near). Function-specific default."
              },
              "param2": {
                "label": "Param2",
                "description": "Second shape parameter (spread for gaussian/near). Function-specific default."
              },
              "low_threshold": {
                "label": "Low Threshold",
                "description": "Optional lower cut-off: values below map to 'value_below'."
              },
              "high_threshold": {
                "label": "High Threshold",
                "description": "Optional upper cut-off: values above map to 'value_above'."
              },
              "value_below": {
                "label": "Value Below",
                "description": "Output value for cells below 'low_threshold' (default = from_scale)."
              },
              "value_above": {
                "label": "Value Above",
                "description": "Output value for cells above 'high_threshold' (default = to_scale)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to rescale (default 1)."
              }
            }
          },
          "resolve_building_conflicts": {
            "name": "Resolve Building Conflicts",
            "description": "Displace, shrink, or hide building footprints that graphically conflict with symbolized road barriers (and each other) for small-scale mapping, tagging each with a status, like ArcGIS Resolve Building Conflicts.",
            "params": {
              "buildings": {
                "label": "Buildings",
                "description": "Input building polygon layer."
              },
              "barriers": {
                "label": "Barriers",
                "description": "Barrier line layer (e.g. roads) buildings must clear."
              },
              "output": {
                "label": "Output",
                "description": "Output building layer with a 'status' field. If omitted, stored in memory."
              },
              "barrier_width": {
                "label": "Barrier Width",
                "description": "Symbolized barrier width in map units (buffered by half this each side). Default 0."
              },
              "gap": {
                "label": "Gap",
                "description": "Minimum spacing to keep between a building and a barrier (map units). Default 0."
              },
              "min_size": {
                "label": "Min Size",
                "description": "Minimum building area (map units²) before a conflicting building is hidden rather than shrunk. Default 0 (never hide)."
              },
              "hide": {
                "label": "Hide",
                "description": "Whether to drop hidden buildings from the output (default false: keep them with status='hidden')."
              }
            }
          },
          "resolve_road_conflicts": {
            "name": "Resolve Road Conflicts",
            "description": "Displace roads whose symbolized (drawn-width) representations overlap or crowd at a target scale: lower-hierarchy roads are pushed clear of higher-hierarchy ones with endpoint-pinned, smoothed vertex shifts, optionally emitting displacement links, like ArcGIS Resolve Road Conflicts / Propagate Displacement.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input road line layer (LineString / MultiLineString)."
              },
              "output": {
                "label": "Output",
                "description": "Output displaced road layer with 'status' and 'shift' fields. If omitted, stored in memory."
              },
              "symbol_width": {
                "label": "Symbol Width",
                "description": "Fixed symbolized width for all roads, in map units (or page mm when 'scale' is set). Used when 'symbol_width_field' is absent."
              },
              "symbol_width_field": {
                "label": "Symbol Width Field",
                "description": "Numeric field giving each road's symbolized width (map units, or page mm when 'scale' is set). Falls back to 'symbol_width' when a value is missing."
              },
              "hierarchy_field": {
                "label": "Hierarchy Field",
                "description": "Numeric field ranking road importance (lower value = more important, held fixed). Absent: all roads share displacement equally."
              },
              "scale": {
                "label": "Scale",
                "description": "Target map scale denominator. When set, symbol widths are page millimetres converted to ground units (mm * scale / 1000). Default: widths taken directly as map units."
              },
              "gap": {
                "label": "Gap",
                "description": "Extra clear spacing to keep between symbol strips, in map units. Default 0."
              },
              "max_iter": {
                "label": "Max Iter",
                "description": "Maximum displacement iterations. Default 50."
              },
              "pin_endpoints": {
                "label": "Pin Endpoints",
                "description": "Keep the first/last vertex of every road fixed to preserve junctions/connectivity (default true)."
              },
              "links": {
                "label": "Links",
                "description": "Optional output path for displacement links (from→to lines) consumable by rubbersheet_features."
              }
            }
          },
          "ripleys_k": {
            "name": "Ripley's K",
            "description": "Multi-distance point-pattern analysis (Ripley's K / L function) with Monte-Carlo complete-spatial-randomness envelopes, to detect clustering or dispersion across a range of distances.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer (other geometries use their vertex-mean representative point)."
              },
              "output": {
                "label": "Output",
                "description": "Optional CSV path for the K/L table. The table is also returned in the tool result."
              },
              "distance_bands": {
                "label": "Distance Bands",
                "description": "Number of distance bands to evaluate (default 10)."
              },
              "max_distance": {
                "label": "Max Distance",
                "description": "Largest distance to evaluate, in CRS units. Default: a quarter of the shorter side of the point bounding box."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Number of CSR simulations for the significance envelope (default 99; 0 disables the envelope)."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field weighting each point."
              },
              "seed": {
                "label": "Seed",
                "description": "Seed for the CSR RNG (default 1), for reproducible envelopes."
              }
            }
          },
          "rubbersheet_features": {
            "name": "Rubbersheet Features",
            "description": "Warp a vector layer to align with a target using displacement links: a Delaunay-TIN piecewise-affine (or IDW) transform that lands control points on their targets and deforms everything between smoothly — the conflation transform, like ArcGIS Rubbersheet Features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer to adjust (any geometry type)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from extension). If omitted, stored in memory."
              },
              "links": {
                "label": "Links",
                "description": "Optional line layer of displacement links (each line: first vertex = from, last vertex = to)."
              },
              "target": {
                "label": "Target",
                "description": "Optional target vector layer; links are generated by matching each input feature's representative point to the nearest target within search_distance."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Max distance to match input to target when generating links (CRS units). Required with 'target'."
              },
              "method": {
                "label": "Method",
                "description": "'linear' (Delaunay TIN piecewise-affine, default) or 'idw' (inverse-distance-weighted)."
              },
              "power": {
                "label": "Power",
                "description": "IDW power for the falloff outside the TIN / for method=idw. Default 2."
              }
            }
          },
          "sar_coherence": {
            "name": "SAR Coherence",
            "description": "Computes normalised interferometric coherence magnitude (and optionally the interferometric phase) between two co-registered complex SAR acquisitions over a moving window (ArcGIS Compute Coherence / Generate Interferogram). Coherence measures phase stability rather than brightness, so it detects change that intensity differencing cannot see — collapse, flooding under vegetation, harvest, ice motion — in all weather. No tool in either registry uses SAR phase. Inputs are two-band I/Q pairs and must already be co-registered.",
            "params": {
              "reference": {
                "label": "Reference",
                "description": "Complex SAR raster (two bands: I and Q) from the first acquisition."
              },
              "secondary": {
                "label": "Secondary",
                "description": "Co-registered complex SAR raster (two bands: I and Q) from the second acquisition."
              },
              "output": {
                "label": "Output",
                "description": "Optional output coherence raster path (magnitude, 0..1). If omitted, stored in memory."
              },
              "output_phase": {
                "label": "Output Phase",
                "description": "Optional output path for the interferometric phase raster in radians, wrapped to (-pi, pi]."
              },
              "window_size": {
                "label": "Window Size",
                "description": "Estimation window as 'range,azimuth' in cells (default '5,5'). The estimator is centred, so an even value is rounded UP to the next odd size; the effective window is reported back as window_range/window_azimuth."
              },
              "bias_correction": {
                "label": "Bias Correction",
                "description": "Correct the upward bias of the coherence estimator at small window sizes (default true)."
              }
            }
          },
          "semivariogram_sensitivity": {
            "name": "Semivariogram Sensitivity",
            "description": "Perturbs the nugget, partial sill and range of a fitted variogram, re-krige at evaluation locations, and reports how far predictions and standard errors move — the standard defensibility check on a kriging model (ArcGIS GA Semivariogram Sensitivity). The bundled kriging suite is broad and kriging_cross_validation measures fit, but nothing measures sensitivity, and the two are independent: a well-cross-validated model can still be highly fragile to the parameters the analyst chose.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Point layer holding the measured values."
              },
              "field": {
                "label": "Field",
                "description": "Numeric field to krige."
              },
              "locations": {
                "label": "Locations",
                "description": "Point layer of prediction locations to evaluate the sensitivity at."
              },
              "output": {
                "label": "Output",
                "description": "Table with one row per perturbed model. If omitted, stored in memory."
              },
              "model": {
                "label": "Model",
                "description": "Variogram model: 'exponential' (default), 'spherical', or 'gaussian'."
              },
              "nugget_span_percent": {
                "label": "Nugget Span Percent",
                "description": "Perturbation half-width for the nugget, in percent (default 10)."
              },
              "partial_sill_span_percent": {
                "label": "Partial Sill Span Percent",
                "description": "Perturbation half-width for the partial sill, in percent (default 10)."
              },
              "range_span_percent": {
                "label": "Range Span Percent",
                "description": "Perturbation half-width for the range, in percent (default 10)."
              },
              "nugget_steps": {
                "label": "Nugget Steps",
                "description": "Samples across the nugget span (default 3; 1 pins it at the fitted value)."
              },
              "partial_sill_steps": {
                "label": "Partial Sill Steps",
                "description": "Samples across the partial-sill span (default 3)."
              },
              "range_steps": {
                "label": "Range Steps",
                "description": "Samples across the range span (default 3)."
              },
              "lag_count": {
                "label": "Lag Count",
                "description": "Empirical-variogram lag bins used for the baseline fit (default 12)."
              }
            }
          },
          "similarity_search": {
            "name": "Similarity Search",
            "description": "Rank candidate features by attribute similarity to one or more reference features across z-standardized numeric fields (Euclidean or cosine), most/least/both — like ArcGIS Similarity Search.",
            "params": {
              "reference": {
                "label": "Reference",
                "description": "Reference vector layer (one or more features defining the profile to match)."
              },
              "candidates": {
                "label": "Candidates",
                "description": "Candidate vector layer to rank by similarity to the reference."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated numeric field(s) to compare (must exist on both layers)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path (ranked candidates). If omitted, stored in memory."
              },
              "match_method": {
                "label": "Match Method",
                "description": "'euclidean' (z-standardized distance; default) or 'cosine' (angular similarity)."
              },
              "most_or_least": {
                "label": "Most Or Least",
                "description": "Keep the 'most' similar (default), 'least' similar, or 'both' ends."
              },
              "num_results": {
                "label": "Num Results",
                "description": "Number of results to keep per end (0 = all candidates). Default 10."
              }
            }
          },
          "simplify_3d_line": {
            "name": "Simplify 3D Line",
            "description": "Reduce the vertex count of 3D polylines using a Douglas-Peucker split that measures deviation in three dimensions, preserving the vertical profile, like ArcGIS Simplify 3D Line.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polyline layer (3D vertices; 2D vertices are handled as a planar special case)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum 3D deviation in map units. Vertices closer than this to the chord are removed."
              },
              "z_factor": {
                "label": "Z Factor",
                "description": "Multiplier applied to Z before the distance test, for data whose Z unit differs from XY (default 1)."
              }
            }
          },
          "simplify_building": {
            "name": "Simplify Building",
            "description": "Reduce building footprint vertices while protecting right-angle corners, with a minimum-area drop threshold, like ArcGIS Simplify Building.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Building footprint polygons."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Simplification tolerance in map units: the maximum distance the boundary may move."
              },
              "minimum_area": {
                "label": "Minimum Area",
                "description": "Footprints below this area are dropped (default 0, keep all)."
              },
              "keep_collapsed_points": {
                "label": "Keep Collapsed Points",
                "description": "Emit a point at the centroid of each footprint dropped by minimum_area (default false)."
              },
              "corner_tolerance": {
                "label": "Corner Tolerance",
                "description": "Degrees within which an interior angle counts as a protected right angle (default 20)."
              }
            }
          },
          "simplify_by_circular_arcs": {
            "name": "Simplify By Circular Arcs",
            "description": "Simplifies lines and polygons by replacing runs of vertices with straight segments and true circular arcs, preserving engineered curves instead of approximating them with chords (ArcGIS Simplify By Straight Lines And Circular Arcs; 'tangent' mode covers Simplify By Tangent Segments). Every simplifier in either registry is vertex-removal only, which forces a choice between a faceted curve and an unacceptable vertex count on cul-de-sac bulbs, roundabouts and tank footprints. Circles are fitted by algebraic least squares but accepted on true orthogonal deviation, so the tolerance guarantee holds.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line or polygon layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path. If omitted, the result is stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Maximum allowed deviation of a fitted primitive from the original vertices, in CRS units."
              },
              "mode": {
                "label": "Mode",
                "description": "'arcs' (default; fits straight segments and circular arcs) or 'tangent' (straight segments only, the Simplify By Tangent Segments behaviour)."
              },
              "min_arc_angle": {
                "label": "Min Arc Angle",
                "description": "Arcs subtending less than this many degrees are emitted as straight segments instead (default 10)."
              },
              "max_radius": {
                "label": "Max Radius",
                "description": "Arcs with a larger radius than this are emitted as straight segments (default: 1e6)."
              },
              "densify_output": {
                "label": "Densify Output",
                "description": "Re-densify fitted arcs to a chord tolerance on write (default true). When false only the arc endpoints are emitted, so the geometry alone loses the curve — read 'output_arcs' to recover it."
              },
              "output_arcs": {
                "label": "Output Arcs",
                "description": "Optional path for the fitted-arc table (feature id, endpoints, centre, radius, signed sweep in degrees). If omitted, stored in memory (still returned)."
              }
            }
          },
          "simplify_by_tangent_segments": {
            "name": "Simplify By Tangent Segments",
            "description": "Replaces densified curve geometry with the minimal chain of straight segments staying within a maximum perpendicular offset, joining consecutive segments at their intersection so the result remains tangent to the original (ArcGIS Simplify By Tangent Segments). The linear companion to simplify_by_circular_arcs: simplify_features (Douglas-Peucker) can only keep existing vertices and guarantees no tangency, leaving kinks on engineered geometry, while smooth_line and smooth_natural_features move vertices rather than reducing them.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Line or polygon features to simplify."
              },
              "output": {
                "label": "Output",
                "description": "Simplified features with vertex-count fields appended. If omitted, stored in memory."
              },
              "max_offset": {
                "label": "Max Offset",
                "description": "Maximum perpendicular deviation from the original, in CRS UNITS. On EPSG:4326 this is degrees, so metre-scale work needs roughly 2e-5, not 2.0. The bound is enforced against each fitted line, so the emitted chain can exceed it slightly near a joint where consecutive segments meet."
              },
              "anchor_points": {
                "label": "Anchor Points",
                "description": "Optional point layer whose locations must survive as vertices (ArcGIS anchor_points). Runs are never grown across an anchor."
              },
              "anchor_tolerance": {
                "label": "Anchor Tolerance",
                "description": "Distance within which an input vertex counts as matching an anchor point (CRS units). Default: max_offset."
              },
              "min_run": {
                "label": "Min Run",
                "description": "Minimum number of input vertices a run must span before it is collapsed to a segment (default 3). Shorter runs are emitted unchanged."
              },
              "preserve_endpoints": {
                "label": "Preserve Endpoints",
                "description": "Keep each part's first and last vertex exactly (default true)."
              }
            }
          },
          "simplify_shared_edges": {
            "name": "Simplify Shared Edges",
            "description": "Simplify a polygon coverage while keeping boundaries shared between adjacent polygons coincident (no gaps or slivers), like ArcGIS Simplify Shared Edges.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Douglas-Peucker simplification tolerance: the maximum distance (in CRS units) a simplified arc may deviate from the original. Default 1.0."
              },
              "simplify_boundary": {
                "label": "Simplify Boundary",
                "description": "Also simplify arcs on the coverage's outer boundary (edges belonging to a single polygon). Default true; set false to keep the outer boundary unchanged."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Quantize vertices onto a grid of this size (CRS units) before building the topology, so nearly-coincident shared vertices are treated as one. Default 0 (use coordinates exactly)."
              }
            }
          },
          "slice_raster": {
            "name": "Slice Raster",
            "description": "Classify a continuous raster into N ordinal zones (equal interval, equal area, natural breaks, geometric interval, or standard deviation).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input continuous raster file path."
              },
              "output": {
                "label": "Output",
                "description": "Optional output zone raster path. If omitted, stored in memory."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to classify (default 1)."
              },
              "number_zones": {
                "label": "Number Zones",
                "description": "Number of output zones (default 10). Ignored for std_dev."
              },
              "slice_type": {
                "label": "Slice Type",
                "description": "Classification method: equal_interval, equal_area, natural_breaks, geometric_interval, or std_dev (default equal_interval)."
              },
              "base_output_zone": {
                "label": "Base Output Zone",
                "description": "Zone id assigned to the lowest zone (default 1)."
              },
              "class_interval_size": {
                "label": "Class Interval Size",
                "description": "Std-dev interval size in σ units (default 1.0). Only used by std_dev."
              }
            }
          },
          "smooth_natural_features": {
            "name": "Smooth Natural Features",
            "description": "Smooth pixelated polygons and jagged lines (raster-to-vector outputs) into natural-looking curves via Chaikin corner cutting, preserving polygon area.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path with polygon or line features, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "segment_length": {
                "label": "Segment Length",
                "description": "Scale of the staircase noise to remove, in CRS units — ideally the source raster's cell size. Auto-detected from the layer's median edge length if omitted."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Chaikin smoothing iterations (1-8); more iterations give smoother output with more vertices. Default 3."
              },
              "preserve_area": {
                "label": "Preserve Area",
                "description": "Restore each polygon's original area after smoothing (corner cutting shrinks convex shapes). Default true."
              }
            }
          },
          "smooth_shared_edges": {
            "name": "Smooth Shared Edges",
            "description": "Smooth a polygon coverage while keeping boundaries shared between adjacent polygons coincident (no gaps or slivers), like ArcGIS Smooth Shared Edges.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "algorithm": {
                "label": "Algorithm",
                "description": "Smoothing algorithm: 'paek' (Gaussian kernel, tolerance-controlled; default) or 'bezier' (Chaikin corner-cutting, ignores tolerance)."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "PAEK smoothing length in CRS units: the arc-length window over which vertices are averaged. Larger values give smoother curves. Default 1.0. Ignored by the 'bezier' algorithm."
              },
              "smooth_boundary": {
                "label": "Smooth Boundary",
                "description": "Also smooth arcs on the coverage's outer boundary (edges belonging to a single polygon). Default true; set false to keep the outer boundary unchanged."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Quantize vertices onto a grid of this size (CRS units) before building the topology, so nearly-coincident shared vertices are treated as one. Default 0 (use coordinates exactly)."
              }
            }
          },
          "snap_tracks": {
            "name": "Snap Tracks",
            "description": "Map-match timestamped GPS tracks onto a road network with a Viterbi dynamic program (emission = snap distance, transition = route continuity), so matched tracks follow one plausible path instead of zig-zagging between parallel streets — like ArcGIS Snap Tracks.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input timestamped GPS point layer."
              },
              "network": {
                "label": "Network",
                "description": "Road network line layer to match onto."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying each track/mover."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time (numeric seconds or ISO-8601)."
              },
              "output": {
                "label": "Output",
                "description": "Output snapped point layer (driver from extension). If omitted, stored in memory."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Candidate radius: only network edges within this distance of a fix are considered. Required."
              },
              "max_candidates": {
                "label": "Max Candidates",
                "description": "Maximum candidate edges kept per fix (default 5)."
              }
            }
          },
          "solar_radiation": {
            "name": "Solar Radiation",
            "description": "Incoming solar radiation (Wh/m²) over a DEM for a date range: direct + diffuse, accounting for slope/aspect, horizon shading, and sun position through time — like ArcGIS Raster Solar Radiation.",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input elevation raster (projected, metres — slope and horizon need real distances)."
              },
              "output": {
                "label": "Output",
                "description": "Output total-radiation raster (Wh/m²). If omitted, stored in memory."
              },
              "direct_output": {
                "label": "Direct Output",
                "description": "Optional output raster for the direct-radiation component (Wh/m²)."
              },
              "diffuse_output": {
                "label": "Diffuse Output",
                "description": "Optional output raster for the diffuse-radiation component (Wh/m²)."
              },
              "start_day": {
                "label": "Start Day",
                "description": "First day of year (1-365) or an ISO date (YYYY-MM-DD). Default 1."
              },
              "end_day": {
                "label": "End Day",
                "description": "Last day of year (1-365) or an ISO date. Default 365."
              },
              "day_interval": {
                "label": "Day Interval",
                "description": "Sample every this many days across the range (each sample represents that many days). Default: span/12 (about 12 samples)."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Hours between sun-position samples through each day. Default 0.5."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Latitude in degrees. Default: derived from the DEM centre for EPSG:4326 / 3857."
              },
              "transmittivity": {
                "label": "Transmittivity",
                "description": "Atmospheric transmittivity (0-1) for a unit air mass. Default 0.6."
              },
              "diffuse_proportion": {
                "label": "Diffuse Proportion",
                "description": "Fraction of extraterrestrial horizontal irradiance treated as diffuse sky radiation (0-1). Default 0.3."
              },
              "horizon_distance": {
                "label": "Horizon Distance",
                "description": "Maximum horizon ray length in cells (bounds shadow computation). Default 100."
              },
              "band": {
                "label": "Band",
                "description": "1-based DEM band (default 1)."
              }
            }
          },
          "sort_features": {
            "name": "Sort Features",
            "description": "Reorder a vector layer by attribute fields or along a Hilbert space-filling curve (spatial sort), like ArcGIS Sort — Hilbert ordering clusters spatially-near records to improve GeoParquet pruning and PMTiles locality.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer in the new order. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'hilbert' (spatial curve order; default) or 'attribute' (by the 'fields' list)."
              },
              "fields": {
                "label": "Fields",
                "description": "attribute mode: comma-separated fields with optional direction, e.g. 'pop:desc,name:asc'."
              },
              "index_field": {
                "label": "Index Field",
                "description": "Optional field name to store each feature's Hilbert-curve distance."
              }
            }
          },
          "space_time_kernel_density": {
            "name": "Space Time Kernel Density",
            "description": "Space-time kernel density of timestamped points: one density band per time slice (a multiband raster) from a separable spatial (Epanechnikov/quartic) x temporal (triangular/Epanechnikov) kernel, so each band aggregates points near in both space and time, like ArcGIS Space Time Kernel Density. The time-aware companion to the bundled 2-D heat_map.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer. Geographic (EPSG:4326/untagged lon-lat) uses haversine metres; projected uses CRS units. Non-point geometries use their first/representative vertex."
              },
              "output": {
                "label": "Output",
                "description": "Output multiband raster path (one band per time slice; driver from extension). If omitted, stored in memory."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: a numeric field (its own units) or an ISO-8601 date/datetime string."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Slice interval: a plain number (numeric time_field) or a duration like '1w', '7d', '12h', '1M'. Default '1w'."
              },
              "temporal_bandwidth": {
                "label": "Temporal Bandwidth",
                "description": "Temporal kernel half-width, same units/duration syntax as time_step. Default: equal to time_step."
              },
              "spatial_bandwidth": {
                "label": "Spatial Bandwidth",
                "description": "Spatial kernel radius, in metres for geographic input or CRS units for projected. Default: max extent / 20."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units (degrees for geographic). Default: max extent / 200."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Optional numeric field weighting each point. Default: every point counts as 1."
              },
              "spatial_kernel": {
                "label": "Spatial Kernel",
                "description": "Spatial kernel shape: 'epanechnikov' (default) or 'quartic'."
              },
              "temporal_kernel": {
                "label": "Temporal Kernel",
                "description": "Temporal kernel shape: 'triangular' (default) or 'epanechnikov'."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG to tag the output raster (default: from the input layer)."
              }
            }
          },
          "spatial_association_between_zones": {
            "name": "Spatial Association Between Zones",
            "description": "Measure how strongly two categorical zone rasters correspond via the V-measure (homogeneity/completeness) plus per-zone association scores.",
            "params": {
              "zones1": {
                "label": "Zones1",
                "description": "First categorical zone raster (e.g. land cover). Same grid as zones2."
              },
              "zones2": {
                "label": "Zones2",
                "description": "Second categorical zone raster (e.g. ecoregions) on the same grid as zones1."
              },
              "output": {
                "label": "Output",
                "description": "Optional per-zone-1-class CSV table (class, count, association, dominant zone-2 class and share). Overall metrics are always returned in the result."
              },
              "band1": {
                "label": "Band1",
                "description": "1-based band of zones1 to read (default 1)."
              },
              "band2": {
                "label": "Band2",
                "description": "1-based band of zones2 to read (default 1)."
              }
            }
          },
          "spatial_eigenvector_filtering": {
            "name": "Spatial Eigenvector Filtering (MESF)",
            "description": "Generate Moran eigenvectors (spatial filters) from a spatial weights matrix and append the autocorrelated components as explanatory-variable fields (MEV1, MEV2, …), like ArcGIS Decompose Spatial Structure / Create Spatial Component Explanatory Variables. Builds a symmetric connectivity matrix (contiguity or symmetrized KNN), double-centres it (M C M), and eigendecomposes it with a pure-Rust cyclic-Jacobi solver; keeps eigenvectors whose Moran's I ≥ min_autocorrelation, ranked descending and capped at max_components.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (points/lines/polygons; contiguity methods require polygons)."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path — the input features with the kept eigenvectors appended as MEV1, MEV2, …. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "Conceptualization of spatial relationships: 'contiguity_edges' (rook), 'contiguity_edges_corners' (queen), or 'knn' (symmetrized). Default 'contiguity_edges_corners'."
              },
              "number_of_neighbors": {
                "label": "Number Of Neighbors",
                "description": "Number of nearest neighbours k for method = knn. Default 8."
              },
              "min_autocorrelation": {
                "label": "Min Autocorrelation",
                "description": "Minimum Moran's I an eigenvector must have to be kept (positive spatial autocorrelation). Default 0.25."
              },
              "max_components": {
                "label": "Max Components",
                "description": "Maximum number of eigenvectors to emit, taken in descending Moran's I order. Default 15."
              }
            }
          },
          "spatial_outlier_detection": {
            "name": "Spatial Outlier Detection",
            "description": "Score points by their Local Outlier Factor (LOF) — how isolated each point is relative to the local density of its k nearest neighbours — and flag the top outliers, like ArcGIS Spatial Outlier Detection. Fills the gap DBSCAN's binary noise label leaves.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Output points with LOF score and outlier flag. If omitted, stored in memory."
              },
              "neighbors": {
                "label": "Neighbors",
                "description": "Number of nearest neighbours k (default 20)."
              },
              "percent_outlier": {
                "label": "Percent Outlier",
                "description": "Flag the top this-percent of points by LOF as outliers (default 5). Ignored if 'threshold' is set."
              },
              "threshold": {
                "label": "Threshold",
                "description": "Explicit LOF cutoff: points with LOF above this are outliers (overrides percent_outlier)."
              }
            }
          },
          "spatially_constrained_multivariate_clustering": {
            "name": "Spatially Constrained Multivariate Clustering",
            "description": "Partition features into spatially contiguous, attribute-homogeneous regions with the SKATER algorithm (minimum spanning tree over a contiguity graph, cut to maximise between-cluster variance), with optional size/balance constraints. Every cluster is connected by construction, unlike multivariate_clustering. Like ArcGIS Spatially Constrained Multivariate Clustering.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon (or point) features."
              },
              "output": {
                "label": "Output",
                "description": "Output path for the input features plus a CLUSTER_ID field. If omitted, stored in memory."
              },
              "analysis_fields": {
                "label": "Analysis Fields",
                "description": "Comma/semicolon-separated numeric field names to cluster on."
              },
              "number_of_clusters": {
                "label": "Number Of Clusters",
                "description": "Target number of clusters (default 5)."
              },
              "neighborhood": {
                "label": "Neighborhood",
                "description": "'contiguity_edges' (rook, default), 'contiguity_edges_corners' (queen) or 'knn'."
              },
              "number_of_neighbors": {
                "label": "Number Of Neighbors",
                "description": "Neighbour count for the 'knn' neighbourhood (default 8)."
              },
              "constraint": {
                "label": "Constraint",
                "description": "'none' (default), 'feature_count' or 'attribute_value'."
              },
              "constraint_field": {
                "label": "Constraint Field",
                "description": "Field summed per cluster when 'constraint' is 'attribute_value'."
              },
              "min_constraint": {
                "label": "Min Constraint",
                "description": "Minimum per-cluster feature count or attribute total; cuts violating it are skipped."
              },
              "max_constraint": {
                "label": "Max Constraint",
                "description": "Maximum per-cluster feature count or attribute total; clusters above it are split further even past 'number_of_clusters'."
              },
              "scale_data": {
                "label": "Scale Data",
                "description": "Z-standardise the analysis fields before clustering (default true)."
              },
              "output_table": {
                "label": "Output Table",
                "description": "Optional path for the per-cluster summary (means, R-squared per variable, pseudo-F)."
              }
            }
          },
          "spectral_index": {
            "name": "Spectral Index",
            "description": "Compute a spectral index (NDVI, NDWI, NDBI, NBR, EVI, SAVI) from a multi-band raster.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input multi-band raster file path."
              },
              "index": {
                "label": "Index",
                "description": "Index to compute: ndvi, ndwi, ndbi, nbr, evi, or savi."
              },
              "red": {
                "label": "Red",
                "description": "1-based band number for the red band."
              },
              "nir": {
                "label": "Nir",
                "description": "1-based band number for the near-infrared band."
              },
              "green": {
                "label": "Green",
                "description": "1-based band number for the green band."
              },
              "blue": {
                "label": "Blue",
                "description": "1-based band number for the blue band."
              },
              "swir": {
                "label": "Swir",
                "description": "1-based band number for the shortwave-infrared band."
              },
              "soil_factor": {
                "label": "Soil Factor",
                "description": "Soil-adjustment factor L for SAVI (default 0.5)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, the result is stored in memory."
              }
            }
          },
          "split_by_attributes": {
            "name": "Split By Attributes",
            "description": "Split a vector layer into one output file per unique value (or combination) of the given field(s), like ArcGIS Split By Attributes.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer."
              },
              "output_dir": {
                "label": "Output Dir",
                "description": "Output directory; one file per group is written here (created if needed)."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated field name(s) to split on (a multi-field key joins values with '__')."
              },
              "format": {
                "label": "Format",
                "description": "Output format extension: geojson (default), fgb, parquet, shp."
              }
            }
          },
          "split_by_features": {
            "name": "Split By Features",
            "description": "Clip an input layer against each zone of a polygon split layer, writing one output file per distinct split-field value. Zones sharing a value are dissolved first, and empty zones are skipped. Like ArcGIS Split (Analysis).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Features to split (point, line or polygon)."
              },
              "split_features": {
                "label": "Split Features",
                "description": "Polygon layer whose features define the split zones."
              },
              "split_field": {
                "label": "Split Field",
                "description": "Field on 'split_features' supplying each output's name."
              },
              "output_dir": {
                "label": "Output Dir",
                "description": "Directory receiving one output file per distinct split value."
              },
              "output_format": {
                "label": "Output Format",
                "description": "Output file extension/driver: 'geojson' (default), 'shp', 'gpkg', 'parquet', 'csv'."
              }
            }
          },
          "split_line_at_point": {
            "name": "Split Line At Point",
            "description": "Split polyline features at the locations of point features that fall within a search radius, inserting a node at each snapped point and emitting one feature per resulting sub-segment (parent attributes preserved) — like ArcGIS Split Line At Point.",
            "params": {
              "input_lines": {
                "label": "Input Lines",
                "description": "Input polyline vector layer to be split."
              },
              "point_features": {
                "label": "Point Features",
                "description": "Point (or multipoint) vector layer whose locations define the split nodes."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Maximum distance, in the lines' CRS units, between a point and a line for the point to split that line. Required, positive."
              },
              "output": {
                "label": "Output",
                "description": "Output line vector path (driver from extension). If omitted, stored in memory."
              }
            }
          },
          "split_raster": {
            "name": "Split Raster",
            "description": "Split a raster into standalone tiles by tile count, fixed pixel size, or polygon features, with optional pixel overlap — like ArcGIS Split Raster. Each tile preserves CRS and georeferencing.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster."
              },
              "output_dir": {
                "label": "Output Dir",
                "description": "Output directory for the tile files (created if needed)."
              },
              "base_name": {
                "label": "Base Name",
                "description": "Output filename prefix (default 'tile')."
              },
              "split_method": {
                "label": "Split Method",
                "description": "'count' (N×M grid, default), 'size' (fixed-pixel tiles), or 'polygons' (one clip per feature)."
              },
              "num_x": {
                "label": "Num X",
                "description": "Number of tile columns for 'count' (default 2)."
              },
              "num_y": {
                "label": "Num Y",
                "description": "Number of tile rows for 'count' (default 2)."
              },
              "tile_size_x": {
                "label": "Tile Size X",
                "description": "Tile width in pixels for 'size' (default 256)."
              },
              "tile_size_y": {
                "label": "Tile Size Y",
                "description": "Tile height in pixels for 'size' (default 256)."
              },
              "polygons": {
                "label": "Polygons",
                "description": "Polygon vector layer for 'polygons' mode (one tile per feature)."
              },
              "overlap": {
                "label": "Overlap",
                "description": "Pixel overlap padded onto each tile on all sides (default 0)."
              },
              "format": {
                "label": "Format",
                "description": "Output file extension/driver: 'tif' (default) or 'png'."
              }
            }
          },
          "stack_profile": {
            "name": "Stack Profile",
            "description": "Sample several surface rasters along the same polyline and emit one long-form table (LINE_ID, FIRST_DIST, FIRST_Z, SRC_ID, SRC_NAME) so the surfaces can be compared in cross-section on a shared distance axis. Like ArcGIS Stack Profile.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line features to profile."
              },
              "surfaces": {
                "label": "Surfaces",
                "description": "Comma/semicolon-separated list of surface raster paths, sampled in the order given."
              },
              "output": {
                "label": "Output",
                "description": "Output profile table path. If omitted, stored in memory."
              },
              "sample_distance": {
                "label": "Sample Distance",
                "description": "Station spacing in map units (default: the finest input cell size)."
              },
              "line_id_field": {
                "label": "Line Id Field",
                "description": "Optional field supplying LINE_ID; defaults to the feature index."
              },
              "method": {
                "label": "Method",
                "description": "Surface sampling: 'bilinear' (default) or 'nearest'."
              }
            }
          },
          "storage_capacity": {
            "name": "Storage Capacity",
            "description": "Sweep water-surface elevations over a DEM and report the flooded surface area and storage volume at each level (the stage-area-volume curve) per analysis zone or over the whole DEM, like ArcGIS Storage Capacity.",
            "params": {
              "dem": {
                "label": "Dem",
                "description": "Input DEM raster (elevations)."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path (zone_id, level, elevation, area, volume)."
              },
              "zones": {
                "label": "Zones",
                "description": "Optional polygon layer; one stage-area-volume curve per polygon. If omitted, the whole DEM is one zone."
              },
              "zone_id_field": {
                "label": "Zone Id Field",
                "description": "Field naming each zone in the output (default: the feature index)."
              },
              "num_levels": {
                "label": "Num Levels",
                "description": "Number of elevation steps between each zone's min and max (default 20). Ignored if 'increment' is given."
              },
              "increment": {
                "label": "Increment",
                "description": "Fixed elevation step between levels (map units). Overrides 'num_levels'."
              },
              "min_elevation": {
                "label": "Min Elevation",
                "description": "Optional lower elevation bound for the sweep (default: each zone's minimum terrain)."
              },
              "max_elevation": {
                "label": "Max Elevation",
                "description": "Optional upper elevation bound for the sweep (default: each zone's maximum terrain)."
              },
              "band": {
                "label": "Band",
                "description": "1-based DEM band (default 1)."
              }
            }
          },
          "strip_map_index_features": {
            "name": "Strip Map Index Features",
            "description": "Walk each input line and emit a numbered sequence of rotated, overlapping page rectangles oriented to the local route bearing, for strip-map atlases along a highway, river, pipeline, or trail — like ArcGIS Strip Map Index Features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector layer to index."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path of index pages (driver from extension). If omitted, stored in memory."
              },
              "page_length": {
                "label": "Page Length",
                "description": "Along-route length of each page, in CRS units. Required."
              },
              "page_width": {
                "label": "Page Width",
                "description": "Cross-route width of each page, in CRS units. Required."
              },
              "overlap": {
                "label": "Overlap",
                "description": "Fraction [0, 1) of page_length that consecutive pages overlap along the route. Default 0."
              },
              "orientation": {
                "label": "Orientation",
                "description": "along_line (default): rotate each page to its local chord bearing. horizontal/vertical: snap rotation to the nearest east-west/north-south axis."
              },
              "start_page": {
                "label": "Start Page",
                "description": "First page number to assign. Default 1."
              }
            }
          },
          "subdivide_polygon": {
            "name": "Subdivide Polygon",
            "description": "Divide each polygon into equal-area parts (a set number of parts, or a target area each) using straight parallel cuts at a given angle, like ArcGIS Subdivide Polygon.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input polygon vector layer (use a projected/equal-area CRS for true equal areas)."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon vector path (driver from extension). If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'equal_parts' (num_parts strips of equal area, default) or 'equal_areas' (strips of target_area, remainder in the last)."
              },
              "num_parts": {
                "label": "Num Parts",
                "description": "Number of equal-area parts (for method=equal_parts). Default 2."
              },
              "target_area": {
                "label": "Target Area",
                "description": "Area of each part in CRS units (required for method=equal_areas)."
              },
              "angle": {
                "label": "Angle",
                "description": "Cut orientation in degrees (0 = vertical cuts / horizontal strips). Default 0."
              }
            }
          },
          "subset_features": {
            "name": "Subset Features",
            "description": "Randomly split a feature layer into a training subset and its complement (test subset), by percentage or absolute count, using a seeded deterministic RNG. Optionally stratified by a group field. Like ArcGIS Subset Features.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (any geometry type)."
              },
              "output_training": {
                "label": "Output Training",
                "description": "Output path for the training subset. If omitted, stored in memory."
              },
              "output_test": {
                "label": "Output Test",
                "description": "Optional output path for the complement (test) subset. If omitted, the test subset is stored in memory."
              },
              "size": {
                "label": "Size",
                "description": "Training subset size: a percentage (0-100) or an absolute feature count, per 'size_method' (default 50)."
              },
              "size_method": {
                "label": "Size Method",
                "description": "'percentage' (default) or 'absolute'."
              },
              "seed": {
                "label": "Seed",
                "description": "RNG seed for a reproducible split (default fixed constant)."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Optional field to stratify on: each group contributes its own proportional share of the training subset."
              }
            }
          },
          "subset_multidimensional_raster": {
            "name": "Subset Multidimensional Raster",
            "description": "Narrows a multidimensional raster cube to a subset of its slices, by dimension-coordinate range, explicit indices, or a step (ArcGIS Subset Multidimensional Raster / Select By Dimension). The round-18 cube tools all consume a whole cube, so there was no way to analyse a study window without regenerating the input outside the catalog.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Multidimensional raster, or a comma-separated list of co-registered rasters whose bands concatenate into one cube."
              },
              "dimension_values": {
                "label": "Dimension Values",
                "description": "Optional strictly increasing per-slice coordinates (dates, depths, wavelengths), one per slice. Required by 'dimension_range'."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Name of the dimension, used only in reporting (default 'slice')."
              },
              "dimension_range": {
                "label": "Dimension Range",
                "description": "Inclusive coordinate range as 'min,max'. Requires 'dimension_values'. Mutually exclusive with 'indices'."
              },
              "indices": {
                "label": "Indices",
                "description": "Explicit 0-based slice indices, e.g. '0,2,5'. Mutually exclusive with 'dimension_range'."
              },
              "step": {
                "label": "Step",
                "description": "Keep every Nth slice after the other filters (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Output cube raster, one band per retained slice. If omitted, stored in memory."
              }
            }
          },
          "summarize_categorical_raster": {
            "name": "Summarize Categorical Raster",
            "description": "Tabulates the cell count, area and share of every class in a categorical raster, one row per slice for multi-band/multidimensional stacks, optionally restricted to an area of interest (ArcGIS Summarize Categorical Raster). The bundled raster_area writes class totals back into raster cells rather than a table and is single-band only, so it cannot produce the per-date class-area series that land-cover-change analysis needs. Cell area is integrated per row for geographic rasters.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input categorical raster (single- or multi-band)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output table path. If omitted, the result is stored in memory."
              },
              "aoi": {
                "label": "Aoi",
                "description": "Optional polygon layer restricting the summary to an area of interest."
              },
              "aoi_id_field": {
                "label": "Aoi Id Field",
                "description": "Field on 'aoi' identifying each area; when given, the summary is produced per AOI feature."
              },
              "area_units": {
                "label": "Area Units",
                "description": "Area units: map_units (default), hectares, or square_kilometers."
              },
              "include_nodata": {
                "label": "Include Nodata",
                "description": "If true, no-data is reported as its own class row (default false)."
              },
              "bands": {
                "label": "Bands",
                "description": "Comma-separated 1-based band list to summarize (default: all bands)."
              }
            }
          },
          "summarize_nearby": {
            "name": "Summarize Nearby",
            "description": "Buffer input features at one or more straight-line distances and summarize a second layer within each buffer: count of features, intersected area (polygons), clipped length (lines), and measure-weighted sum/mean of numeric fields.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer whose features are buffered (points, lines, or polygons), format auto-detected (or in-memory handle)."
              },
              "summary_features": {
                "label": "Summary Features",
                "description": "Vector layer to summarize within each buffer (polygons summarized by intersected area, lines by clipped length, or points by count)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "distances": {
                "label": "Distances",
                "description": "Comma-separated list of buffer distances in CRS units, e.g. \"1000,2000,5000\". Sorted ascending; duplicates and non-positive values are dropped."
              },
              "sum_fields": {
                "label": "Sum Fields",
                "description": "Optional comma-separated numeric fields in the summary layer to aggregate. Each yields a sum_<field> and mean_<field> column (area-weighted for polygons, length-weighted for lines, plain for points)."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Optional field in the input layer identifying each source feature in the output. Defaults to the input feature index."
              }
            }
          },
          "summarize_percent_change": {
            "name": "Summarize Percent Change",
            "description": "Count incidents from a current and a previous period within each area feature and report the count difference, percent change and a change class. Percent change is null (class 'new') where the previous count is zero. Like ArcGIS Summarize Percent Change.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Area features (beats, tracts, grid cells) to summarize into."
              },
              "current_features": {
                "label": "Current Features",
                "description": "Incident point features for the current period."
              },
              "previous_features": {
                "label": "Previous Features",
                "description": "Incident point features for the previous period."
              },
              "output": {
                "label": "Output",
                "description": "Output path for the areas with change fields. If omitted, stored in memory."
              },
              "search_radius": {
                "label": "Search Radius",
                "description": "Optional distance in map units; incidents within this distance of an area also count, not only those inside it. Note that a positive radius makes catchments overlap, so an incident can be counted by more than one area (the reported corpus totals stay deduplicated)."
              }
            }
          },
          "summarize_within": {
            "name": "Summarize Within",
            "description": "Summarize a layer's attributes inside an existing polygon layer, weighting partially-overlapping features by intersected area or length, like ArcGIS Summarize Within.",
            "params": {
              "polygons": {
                "label": "Polygons",
                "description": "Polygon layer to summarize into. Its features and attributes are preserved."
              },
              "input": {
                "label": "Input",
                "description": "Layer being summarized (point, line, or polygon)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output polygon path. If omitted, the result is stored in memory."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated 'field:statistic' pairs, e.g. 'pop:sum,income:mean'. Statistics: sum, mean, min, max, stddev, count."
              },
              "keep_all": {
                "label": "Keep All",
                "description": "Keep polygons with no intersecting features (default true). When false, empty polygons are dropped."
              },
              "shape_sum": {
                "label": "Shape Sum",
                "description": "Append the summed count / length / area of intersected input geometry (default true)."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Optional field on the summarized layer; emits one grouped summary row per distinct value."
              }
            }
          },
          "summary_statistics": {
            "name": "Summary Statistics",
            "description": "SQL-style GROUP BY over one or more case fields: for each unique case-field combination, compute a list of (field, statistic) aggregates (count/sum/mean/min/max/std/first/last) plus a group record count. Output is a pure attribute table. No case field yields a single grand-total row (like ArcGIS's Summary Statistics; count-only reproduces Frequency).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer or attribute table to aggregate."
              },
              "statistics": {
                "label": "Statistics",
                "description": "Semicolon/comma-separated list of 'field statistic' pairs (also accepts 'field:statistic'), e.g. 'population sum; population mean; elev max'. Statistics: count, sum, mean, min, max, std, first, last."
              },
              "case_fields": {
                "label": "Case Fields",
                "description": "Optional comma/semicolon-separated case (GROUP BY) field name(s). If omitted, a single summary row is produced over the whole table."
              },
              "output": {
                "label": "Output",
                "description": "Optional output table path (driver from its extension; GeoParquet or CSV). If omitted, the table is stored in memory. Columns: the case fields, a record 'count', then one '<field>_<statistic>' column per requested pair."
              }
            }
          },
          "sun_shadow_volume": {
            "name": "Sun Shadow Volume",
            "description": "Extrudes 3D solids along the solar vector to the ground to produce closed shadow-volume solids for a given date and time (ArcGIS Sun Shadow Volume). shadow_image, shadow_animation and time_in_daylight all work on a raster DSM and emit rasters, and solar_radiation computes irradiance — none produces shadow geometry, so questions like 'is this window shaded' or 'how much of this plot's airspace is in shadow' cannot be answered. The output composes with inside_3d, intersect_3d and union_3d.",
            "params": {
              "input": {
                "label": "Input",
                "description": "3D building solids or extruded footprints (triangle-mesh MultiPolygons with Z)."
              },
              "output": {
                "label": "Output",
                "description": "Closed shadow-volume solids. If omitted, stored in memory."
              },
              "datetime": {
                "label": "Datetime",
                "description": "Local date-time of the sun position as 'YYYY-MM-DDTHH:MM' or 'YYYY-MM-DD HH:MM'. Taken as a parameter, never from a clock, so results are reproducible."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Latitude in degrees, used for the solar geometry. Required: it cannot be derived without a projection engine."
              },
              "utc_offset": {
                "label": "Utc Offset",
                "description": "Hours from UTC of the supplied local time (default 0)."
              },
              "adjusted_for_dst": {
                "label": "Adjusted For Dst",
                "description": "Treat the supplied time as daylight-saving-adjusted, subtracting an hour before the solar calculation (default false), matching ArcGIS."
              },
              "ground_elevation": {
                "label": "Ground Elevation",
                "description": "Constant ground Z the shadow is projected onto. Default: each feature's own minimum Z."
              },
              "max_length": {
                "label": "Max Length",
                "description": "Cap on the sweep distance in CRS units, so a low sun does not produce a kilometres-long prism. Default: unlimited."
              }
            }
          },
          "surface_difference": {
            "name": "Surface Difference",
            "description": "Delineates where one surface lies above, below or level with another as polygons, each carrying its class, area, volume and difference statistics (ArcGIS Surface Difference). cut_fill measures the same quantities but emits only a region-label raster and a CSV, so its regions have no geometry to overlay, clip or join; surface_volume and polygon_volume measure against a plane or within polygons you already have rather than discovering them.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Surface raster to classify."
              },
              "reference": {
                "label": "Reference",
                "description": "Reference surface: a co-registered raster path, or a constant elevation to compare against a flat datum."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer of the classified regions. If omitted, stored in memory."
              },
              "output_raster": {
                "label": "Output Raster",
                "description": "Output signed difference raster (input minus reference). Always produced; stored in memory when no path is given."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Differences within this of zero count as coincident (default 0.0)."
              },
              "min_area": {
                "label": "Min Area",
                "description": "Discard regions smaller than this area in map units squared."
              },
              "include_coincident": {
                "label": "Include Coincident",
                "description": "Emit polygons for the unchanged class too (default false). Off by default because on most scenes it is one enormous background polygon."
              },
              "band": {
                "label": "Band",
                "description": "1-based band of the input surface (default 1)."
              },
              "reference_band": {
                "label": "Reference Band",
                "description": "1-based band of the reference surface (default 1)."
              }
            }
          },
          "surface_parameters": {
            "name": "Surface Parameters",
            "description": "Slope, aspect, or curvature (mean/profile/tangential/plan/gaussian/casorati/contour_geodesic_torsion) from a DEM via a local quadratic/biquadratic least-squares surface fit over a chosen neighborhood distance, like ArcGIS Surface Parameters — the scale-adaptive counterpart to the bundled fixed 3×3 terrain tools.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input elevation raster (DEM)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output raster path. If omitted, stored in memory."
              },
              "parameter": {
                "label": "Parameter",
                "description": "Which parameter to compute: slope (default), aspect, mean_curvature, profile_curvature, tangential_curvature, plan_curvature, gaussian_curvature, casorati_curvature, contour_geodesic_torsion."
              },
              "fit": {
                "label": "Fit",
                "description": "Surface model: 'quadratic' (6-term, default) or 'biquadratic' (9-term)."
              },
              "neighborhood_distance": {
                "label": "Neighborhood Distance",
                "description": "Neighborhood radius in map units (default = one cell size, i.e. a 3×3 window)."
              },
              "neighborhood_type": {
                "label": "Neighborhood Type",
                "description": "'fixed' (default) uses the full radius everywhere; 'adaptive' shrinks the window to 1 cell next to data gaps/edges."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              }
            }
          },
          "surface_volume": {
            "name": "Surface Volume",
            "description": "Integrate a raster surface against a horizontal reference plane, reporting 2D area, 3D surface area, and volume for the portion above and/or below the plane (like ArcGIS's Surface Volume). Earthworks cut/fill and reservoir-capacity analysis.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input elevation surface raster."
              },
              "reference_plane": {
                "label": "Reference Plane",
                "description": "Reference-plane elevation to integrate against (default 0)."
              },
              "direction": {
                "label": "Direction",
                "description": "Which side of the plane to integrate: 'above', 'below', or 'both' (default 'above')."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read (default 1)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output CSV path for the results table. If omitted, results are returned in the run result only."
              }
            }
          },
          "table_to_geometry": {
            "name": "Table To Geometry",
            "description": "Build line or ellipse features from tabular fields: start/end coordinate pairs (XY To Line), origin + bearing + distance (Bearing Distance To Line), or center + major/minor axis + azimuth (Table To Ellipse) — with planar, geodesic, and rhumb line construction.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input attribute table or point vector layer."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "mode": {
                "label": "Mode",
                "description": "'xy_to_line', 'bearing_distance', or 'ellipse'."
              },
              "line_type": {
                "label": "Line Type",
                "description": "'geodesic' (default, shortest path on the WGS84 ellipsoid), 'rhumb' (constant bearing), or 'planar' (straight Cartesian segments in the input's own units)."
              },
              "vertex_spacing": {
                "label": "Vertex Spacing",
                "description": "Densification spacing for curved (geodesic/rhumb) lines, and ellipse outline sample spacing, in meters for geodesic/rhumb or CRS units for planar. Default: a fixed segment count."
              },
              "polygon_output": {
                "label": "Polygon Output",
                "description": "mode=ellipse only: emit a filled Polygon instead of a closed line outline. Default false."
              },
              "start_x": {
                "label": "Start X",
                "description": "mode=xy_to_line: field holding the start X / longitude."
              },
              "start_y": {
                "label": "Start Y",
                "description": "mode=xy_to_line: field holding the start Y / latitude."
              },
              "end_x": {
                "label": "End X",
                "description": "mode=xy_to_line: field holding the end X / longitude."
              },
              "end_y": {
                "label": "End Y",
                "description": "mode=xy_to_line: field holding the end Y / latitude."
              },
              "x": {
                "label": "X",
                "description": "mode=bearing_distance/ellipse: field holding the origin/center X / longitude."
              },
              "y": {
                "label": "Y",
                "description": "mode=bearing_distance/ellipse: field holding the origin/center Y / latitude."
              },
              "bearing": {
                "label": "Bearing",
                "description": "mode=bearing_distance: field holding the bearing in degrees clockwise from north."
              },
              "distance": {
                "label": "Distance",
                "description": "mode=bearing_distance: field holding the travel distance (meters for geodesic/rhumb, CRS units for planar)."
              },
              "major": {
                "label": "Major",
                "description": "mode=ellipse: field holding the semi-major axis length (meters for geodesic/rhumb, CRS units for planar)."
              },
              "minor": {
                "label": "Minor",
                "description": "mode=ellipse: field holding the semi-minor axis length (same units as major)."
              },
              "azimuth": {
                "label": "Azimuth",
                "description": "mode=ellipse: field holding the major-axis direction in degrees clockwise from north."
              }
            }
          },
          "tabulate_intersection": {
            "name": "Tabulate Intersection",
            "description": "Vector-on-vector zonal summary: apportion a class layer (polygons by area, lines by intersected length, or points by count) across zone polygons, reporting intersected measure, percentage of zone, and measure-weighted sum fields.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Zone polygon layer, format auto-detected (or in-memory handle)."
              },
              "class_features": {
                "label": "Class Features",
                "description": "Class vector layer to apportion across the zones (polygons summarized by area, lines by intersected length, or points by count)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "class_field": {
                "label": "Class Field",
                "description": "Optional categorical field in the class layer; results are grouped by zone x this value. Omit to treat all class features as one class."
              },
              "sum_fields": {
                "label": "Sum Fields",
                "description": "Optional comma-separated numeric fields in the class layer to apportion into each zone (area-weighted for polygons, length-weighted for lines, summed for points)."
              },
              "zone_field": {
                "label": "Zone Field",
                "description": "Optional field identifying each zone in the output. Defaults to the zone feature index."
              }
            }
          },
          "thin_road_network": {
            "name": "Thin Road Network",
            "description": "Generalize a road network for small-scale display: hide short, low-hierarchy roads while preserving connectivity, flagging each road visible/thinned (non-destructive) like ArcGIS Thin Road Network.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input road (line) vector layer, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "min_length": {
                "label": "Min Length",
                "description": "Roads shorter than this (CRS units) are candidates to thin out. Longer roads are always kept."
              },
              "hierarchy_field": {
                "label": "Hierarchy Field",
                "description": "Optional numeric road-class field; lower value = more important (kept longer). Candidates are thinned highest-class-number first."
              },
              "visibility_field": {
                "label": "Visibility Field",
                "description": "Name of the output visibility flag field (1 = kept, 0 = thinned). Default 'visible'."
              },
              "keep_only": {
                "label": "Keep Only",
                "description": "If true, output only the visible roads instead of flagging all of them. Default false (non-destructive)."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Distance within which road endpoints are treated as the same junction. Default 1e-6."
              }
            }
          },
          "tile_grid_polygons": {
            "name": "Tile Grid Polygons",
            "description": "Emits web-map tile boundaries as polygons for a zoom level (or range) and extent, each carrying z/x/y and its quadkey (ArcGIS Map Server Cache Tiling Scheme To Polygons, Create Vector Tile Index, Generate Tile Cache Tiling Scheme). The bundled rectangular/hexagonal grid tools build arbitrary grids in the input CRS and cannot coincide with the WebMercator quadtree the PMTiles and raster_to_tiles tools use.",
            "params": {
              "zoom": {
                "label": "Zoom",
                "description": "Zoom level. Use with 'max_zoom' to emit a pyramid of levels."
              },
              "max_zoom": {
                "label": "Max Zoom",
                "description": "Optional highest zoom; when given, every level from 'zoom' to 'max_zoom' is emitted."
              },
              "extent": {
                "label": "Extent",
                "description": "Optional raster or vector layer whose bounds clip the grid. Without it, the whole world at that zoom (subject to 'max_tiles')."
              },
              "bbox": {
                "label": "Bbox",
                "description": "Optional explicit extent as 'min_lon,min_lat,max_lon,max_lat' in degrees. Takes precedence over 'extent'."
              },
              "scheme": {
                "label": "Scheme",
                "description": "'xyz' (default, Google/OSM, y counts down from the north) or 'tms' (y counts up from the south)."
              },
              "output_crs": {
                "label": "Output Crs",
                "description": "'EPSG:3857' (default, square tiles) or 'EPSG:4326' (lon/lat quadrilaterals)."
              },
              "max_tiles": {
                "label": "Max Tiles",
                "description": "Hard cap on the number of tiles (default 1000000); exceeding it is an error naming the computed count."
              },
              "output": {
                "label": "Output",
                "description": "Output polygon layer. If omitted, stored in memory."
              }
            }
          },
          "time_series_clustering": {
            "name": "Time Series Clustering",
            "description": "Cluster the cells of an H3 space-time cube by the similarity of their time series (value, z-normalized profile, or correlation) with deterministic k-medoids, so places that evolve alike group together, like ArcGIS Time Series Clustering.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer in EPSG:4326 (lon/lat) with a timestamp field."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Timestamp field (numeric or ISO-8601 date/datetime)."
              },
              "output": {
                "label": "Output",
                "description": "Output H3 polygon layer with cluster_id/is_medoid. If omitted, stored in memory."
              },
              "num_clusters": {
                "label": "Num Clusters",
                "description": "Number of clusters k (default 4)."
              },
              "characteristic": {
                "label": "Characteristic",
                "description": "Time-series distance: 'value' (raw), 'profile' (z-normalized, default), or 'correlation' (1 − r)."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Width of a time step: a plain number (numeric time_field) or a duration like '1w', '7d', '12h'. Default '1w'."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Optional numeric field summed into each bin. Default: count of points per bin."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0 (coarsest) to 15 (finest); default 7 (~5 km² cells)."
              },
              "seed": {
                "label": "Seed",
                "description": "Random seed for reproducible medoid initialization (default 1)."
              }
            }
          },
          "time_series_cross_correlation": {
            "name": "Time Series Cross Correlation",
            "description": "Per-cell lagged cross-correlation between two aligned space-time raster stacks (like ArcGIS's Time Series Cross Correlation / Multidimensional Raster Correlation): for each cell, optionally detrend/deseasonalize, then correlate series A against series B across min_lag..=max_lag and report the best lag and its Pearson correlation, plus optional lag-0 correlation and a Pyper-Peterman effective-sample-size pseudo p-value. The two-variable, lag-aware complement to the single-series generate_trend_raster / change_point_detection cube tools — nothing bundled relates two variables through time.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Stack A: a multiband raster (one band per time step) OR a comma-separated list of co-registered single-band raster paths in time order."
              },
              "secondary": {
                "label": "Secondary",
                "description": "Stack B: same shape and length as 'input' (multiband raster or comma-separated single-band list)."
              },
              "output": {
                "label": "Output",
                "description": "Output best-lag raster (integer lag maximizing |correlation|). If omitted, stored in memory."
              },
              "corr_output": {
                "label": "Corr Output",
                "description": "Optional output raster of the (signed) Pearson correlation at the best lag."
              },
              "corr0_output": {
                "label": "Corr0 Output",
                "description": "Optional output raster of the correlation at lag 0 (contemporaneous)."
              },
              "pvalue_output": {
                "label": "Pvalue Output",
                "description": "Optional output raster of a pseudo two-sided p-value at the best lag (Pyper-Peterman effective sample size + Fisher z)."
              },
              "min_lag": {
                "label": "Min Lag",
                "description": "Minimum lag in time steps (default -6). A[t] is paired with B[t+lag]."
              },
              "max_lag": {
                "label": "Max Lag",
                "description": "Maximum lag in time steps (default 6). Must be >= min_lag."
              },
              "detrend": {
                "label": "Detrend",
                "description": "If true, subtract a per-series OLS linear trend before correlating (default false)."
              },
              "deseasonalize": {
                "label": "Deseasonalize",
                "description": "If true, subtract a per-series additive seasonal cycle of period 'season_length' before correlating (default false)."
              },
              "season_length": {
                "label": "Season Length",
                "description": "Seasonal period (time steps) used when 'deseasonalize' is true (default 12)."
              },
              "min_valid": {
                "label": "Min Valid",
                "description": "Minimum valid overlapping pairs required to correlate at a lag (default 5)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to read when a stack is given as a comma-separated single-band list (default 1). Ignored for multiband stacks."
              }
            }
          },
          "time_series_forecast": {
            "name": "Time Series Forecast",
            "description": "Per-location forecasting on an H3 space-time cube (like ArcGIS Exponential Smoothing / Curve Fit Forecast): forecast each cell's series ahead by Holt's exponential smoothing or polynomial curve fits, picking per cell the lowest hold-out-RMSE model, with next/final-step forecasts and a 90% confidence half-width. The temporal forecasting the bundled spatial trend_surface can't do.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer of timestamped events (lon/lat)."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field holding each point's time: a number or an ISO-8601 timestamp."
              },
              "output": {
                "label": "Output",
                "description": "Output H3 polygon layer with forecast attributes. If omitted, stored in memory."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field to aggregate per bin (default: point count)."
              },
              "steps": {
                "label": "Steps",
                "description": "Number of time steps to forecast ahead (default 3)."
              },
              "model": {
                "label": "Model",
                "description": "'auto' (lowest hold-out RMSE; default), 'exp_smoothing', 'linear', or 'parabolic'."
              },
              "holdout": {
                "label": "Holdout",
                "description": "Time steps held out to validate/select the model (default 3)."
              },
              "time_step": {
                "label": "Time Step",
                "description": "Width of a time step in the time_field's units (default 1)."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0..15 (default 7)."
              }
            }
          },
          "time_series_smoothing": {
            "name": "Time Series Smoothing",
            "description": "Smooth an in-sample time series per location (like ArcGIS Time Series Smoothing): group features by id_field, order each group by time_field, and append a smoothed value via a backward/centered/forward moving average or adaptive-bandwidth local-linear (LOESS) pass. Geometry and all original attributes are preserved. Complements time_series_forecast, which projects ahead rather than smoothing the observed series.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input feature layer of timestamped observations."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Numeric field whose series is smoothed."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Field ordering each series: a number or an ISO-8601 timestamp."
              },
              "id_field": {
                "label": "Id Field",
                "description": "Field identifying each location/series. If omitted, all features form one series."
              },
              "method": {
                "label": "Method",
                "description": "'moving_average' (default) or 'local_linear' (adaptive-bandwidth LOESS)."
              },
              "window": {
                "label": "Window",
                "description": "moving_average: number of points in the averaging window (default 3)."
              },
              "bandwidth": {
                "label": "Bandwidth",
                "description": "local_linear: number of nearest-in-time points used per local fit (default 5)."
              },
              "alignment": {
                "label": "Alignment",
                "description": "moving_average window placement: 'backward', 'centered' (default), or 'forward'."
              },
              "output_field": {
                "label": "Output Field",
                "description": "Name of the appended smoothed field (default 'smoothed')."
              },
              "output": {
                "label": "Output",
                "description": "Output layer path. If omitted, stored in memory."
              }
            }
          },
          "topo_to_raster": {
            "name": "Topo To Raster",
            "description": "Interpolate a hydrologically correct DEM from contour lines, spot-height points, and optional stream lines using a minimum-curvature (thin-plate) relaxation with drainage enforcement — like ArcGIS Topo To Raster (ANUDEM). Unlike the bundled IDW/TIN/spline interpolators it does not terrace contours and it removes spurious closed depressions.",
            "params": {
              "contours": {
                "label": "Contours",
                "description": "Input contour line vector layer (elevation read from elevation_field). At least one of contours/points is required."
              },
              "points": {
                "label": "Points",
                "description": "Input spot-height point vector layer (elevation read from elevation_field)."
              },
              "streams": {
                "label": "Streams",
                "description": "Optional stream line vector layer used for drainage enforcement (burned into the surface before sink removal)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output DEM raster path (driver from extension). If omitted, stored in memory."
              },
              "elevation_field": {
                "label": "Elevation Field",
                "description": "Name of the numeric elevation field on the contour and point layers. Default: auto-detect (HEIGHT/ELEV/ELEVATION/Z, else the first numeric field)."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units. Default: sized so the longer grid axis is ~400 cells."
              },
              "tension": {
                "label": "Tension",
                "description": "Surface stiffness in [0,1]: 0 = pure thin-plate (smoothest), 1 = taut membrane. Default 0.35."
              },
              "iterations": {
                "label": "Iterations",
                "description": "Maximum SOR iterations (default 2000). Iteration stops early once the max cell change falls below tolerance."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Convergence tolerance: stop when the largest cell change in an iteration is below this (CRS elevation units). Default 0.01."
              },
              "enforce_drainage": {
                "label": "Enforce Drainage",
                "description": "Remove spurious interior sinks after interpolation so the DEM drains to its edges (default true)."
              },
              "stream_burn": {
                "label": "Stream Burn",
                "description": "Depth (elevation units) to lower stream cells before sink removal, to route flow along them. Default 0 (auto = 1% of relief when streams are supplied)."
              }
            }
          },
          "trace_proximity_events": {
            "name": "Trace Proximity Events",
            "description": "Find intervals where two moving tracks were within a distance of each other for at least a minimum duration (proximity events), and optionally trace transitive downstream contacts from seed entities, like ArcGIS Trace Proximity Events.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Timestamped point layer (use a projected CRS; distances are in map units)."
              },
              "track_field": {
                "label": "Track Field",
                "description": "Field identifying each moving entity / track."
              },
              "time_field": {
                "label": "Time Field",
                "description": "Timestamp field (numeric seconds or ISO-8601)."
              },
              "output": {
                "label": "Output",
                "description": "Output proximity-event line layer. If omitted, stored in memory."
              },
              "search_distance": {
                "label": "Search Distance",
                "description": "Maximum separation for two tracks to be 'in proximity' (map units)."
              },
              "min_duration": {
                "label": "Min Duration",
                "description": "Minimum time in proximity to count as an event: seconds or a duration like '5m', '1h' (default 0)."
              },
              "entities": {
                "label": "Entities",
                "description": "Optional comma-separated seed track ids to trace downstream contacts from (contact tracing)."
              },
              "depth": {
                "label": "Depth",
                "description": "Maximum tracing generations from the seeds (default unlimited)."
              }
            }
          },
          "transform_features": {
            "name": "Transform Features",
            "description": "Apply an affine transform (shift, rotate about an anchor, per-axis scale, mirror) to every geometry in a vector layer.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "dx": {
                "label": "Dx",
                "description": "Shift applied to X after scale/mirror/rotation, in CRS units. Default 0."
              },
              "dy": {
                "label": "Dy",
                "description": "Shift applied to Y after scale/mirror/rotation, in CRS units. Default 0."
              },
              "angle": {
                "label": "Angle",
                "description": "Counter-clockwise rotation about the anchor, in degrees. Default 0."
              },
              "scale_x": {
                "label": "Scale X",
                "description": "Scale factor about the anchor along X. Default 1."
              },
              "scale_y": {
                "label": "Scale Y",
                "description": "Scale factor about the anchor along Y. Default 1."
              },
              "mirror_axis": {
                "label": "Mirror Axis",
                "description": "Reflect through the anchor: NONE (default), X (flip Y across the horizontal axis), or Y (flip X across the vertical axis)."
              },
              "anchor": {
                "label": "Anchor",
                "description": "Pivot for scale/mirror/rotation: CENTROID (bounding-box center, default), ORIGIN (0,0), or XY (use anchor_x/anchor_y)."
              },
              "anchor_x": {
                "label": "Anchor X",
                "description": "Anchor X coordinate; required when anchor=XY."
              },
              "anchor_y": {
                "label": "Anchor Y",
                "description": "Anchor Y coordinate; required when anchor=XY."
              }
            }
          },
          "transform_fields": {
            "name": "Transform Fields",
            "description": "Standardize, transform, and encode attribute fields (like ArcGIS Standardize/Transform/Encode Field): z-score, min-max, robust, log/log1p/sqrt/boxcox/inverse, equal-interval/quantile/std-dev binning, and one-hot encoding.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer (or table) with the fields to transform."
              },
              "fields": {
                "label": "Fields",
                "description": "Comma-separated field names to transform; the same transform is applied to each."
              },
              "transform": {
                "label": "Transform",
                "description": "Transform to apply: zscore, minmax, robust, log, log1p, sqrt, boxcox, inverse, bin, onehot."
              },
              "output": {
                "label": "Output",
                "description": "Output vector layer with the transformed fields added. If omitted, stored in memory."
              },
              "bins": {
                "label": "Bins",
                "description": "Number of classes for 'bin' (default 5)."
              },
              "bin_method": {
                "label": "Bin Method",
                "description": "Classification method for 'bin': equal_interval (default), quantile, or std_dev."
              },
              "boxcox_lambda": {
                "label": "Boxcox Lambda",
                "description": "Fixed lambda for 'boxcox'; if omitted, fit by maximum likelihood (golden-section search)."
              },
              "suffix": {
                "label": "Suffix",
                "description": "Output field name suffix (default depends on transform, e.g. '_z' for zscore)."
              },
              "drop_input": {
                "label": "Drop Input",
                "description": "If true, remove the original field(s) from the output after transforming (default false)."
              }
            }
          },
          "transform_route_events": {
            "name": "Transform Route Events",
            "description": "Re-reference point events measured against a source route system onto a target route system: recover each event's XY from its source route and measure, then relocate it onto the nearest target route within a cluster tolerance, emitting the target route id and measure — like ArcGIS Transform Route Events.",
            "params": {
              "source_events": {
                "label": "Source Events",
                "description": "Input point event layer. Each feature carries a route identifier (route_id_field) and a measure (measure_field)."
              },
              "source_routes": {
                "label": "Source Routes",
                "description": "Source route system: line layer whose features are keyed by route_id_field. Measures are distance from each route's first vertex."
              },
              "target_routes": {
                "label": "Target Routes",
                "description": "Target route system: line layer onto which events are relocated. Route identifiers come from target_id_field."
              },
              "output": {
                "label": "Output",
                "description": "Output point vector path (driver from extension). If omitted, the result is stored in memory."
              },
              "route_id_field": {
                "label": "Route Id Field",
                "description": "Field naming the route identifier in source_events and source_routes (default 'route_id'). Absent field -> the source route feature index is used."
              },
              "measure_field": {
                "label": "Measure Field",
                "description": "Numeric field in source_events holding the source-system measure (default 'measure')."
              },
              "target_id_field": {
                "label": "Target Id Field",
                "description": "Field naming the route identifier in target_routes (default: same as route_id_field). Absent field -> the target route feature index is used."
              },
              "cluster_tolerance": {
                "label": "Cluster Tolerance",
                "description": "Maximum XY distance (CRS units) from the recovered event location to a target route for the event to transfer. 0 or omitted means no limit (always snap to the nearest target route)."
              }
            }
          },
          "transpose_fields": {
            "name": "Transpose Fields",
            "description": "Reshapes a wide attribute table to long form: each listed value column becomes its own row, tagged with the column it came from (ArcGIS Transpose Fields). pivot_table only goes long-to-wide, so tables arriving with one column per period could not be fed to the time-series tools that need one row per observation.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector layer or table."
              },
              "transpose_fields": {
                "label": "Transpose Fields",
                "description": "Comma- or semicolon-separated value columns to unpivot."
              },
              "value_field": {
                "label": "Value Field",
                "description": "Name of the output column holding the cell value (default 'VALUE')."
              },
              "transposed_field": {
                "label": "Transposed Field",
                "description": "Name of the output column holding the source column name (default 'FIELD')."
              },
              "field_labels": {
                "label": "Field Labels",
                "description": "Optional labels written into 'transposed_field' instead of the raw column names, e.g. '2000,2010,2020'. Must have the same length as 'transpose_fields'."
              },
              "retain_fields": {
                "label": "Retain Fields",
                "description": "Attributes copied onto every output row. Defaults to all non-transposed fields."
              },
              "drop_nulls": {
                "label": "Drop Nulls",
                "description": "Skip output rows whose value is null (default false)."
              },
              "output": {
                "label": "Output",
                "description": "Output layer. If omitted, stored in memory."
              }
            }
          },
          "trim_line": {
            "name": "Trim Line",
            "description": "Delete short dangling line segments (overshoots and spurs) shorter than a length tolerance, keeping true intersections and long lines.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input line vector file path, format auto-detected (or in-memory handle)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output vector path (driver from its extension). If omitted, stored in memory."
              },
              "dangle_length": {
                "label": "Dangle Length",
                "description": "Length tolerance in CRS units. A dangling segment shorter than this is trimmed; longer dangles are kept. Must be positive."
              },
              "keep_short": {
                "label": "Keep Short",
                "description": "When true (default), short segments that are unconnected at both ends (isolated) are kept; when false they are also deleted. Segments dangling at exactly one end are always trimmed when short."
              },
              "snap_tolerance": {
                "label": "Snap Tolerance",
                "description": "Endpoints within this distance (CRS units) are treated as the same node. Default 1e-6."
              }
            }
          },
          "union_3d": {
            "name": "Union 3D",
            "description": "Computes the combined volume of overlapping closed 3D solids without double-counting their intersections, plus per-pair overlap volumes (ArcGIS Union 3D). Neither registry has any 3D overlay, so summing buffer_3d capsules or minimum_bounding_volume hulls today double-counts every overlap; polygon_volume and surface_volume only measure against a reference plane. Per-solid volumes are exact (signed-tetrahedron summation); the union is estimated by voxel occupancy at a reported resolution.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Closed 3D solid features (triangle-mesh MultiPolygons with Z, as buffer_3d and minimum_bounding_volume emit)."
              },
              "output": {
                "label": "Output",
                "description": "Optional output table path of per-group volumes. If omitted, stored in memory."
              },
              "group_field": {
                "label": "Group Field",
                "description": "Optional field; solids are unioned within each group value rather than across the whole layer."
              },
              "output_overlap_table": {
                "label": "Output Overlap Table",
                "description": "Optional path for the per-pair overlap volumes. If omitted, stored in memory (still returned)."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Voxel samples per axis used to estimate the union volume, 4 to 512 (default 96). Higher is more accurate and slower."
              }
            }
          },
          "unwrap_phase": {
            "name": "Unwrap Phase",
            "description": "Converts wrapped interferometric phase in (-pi, pi] into a continuous absolute field by weighted least squares, solved with preconditioned conjugate gradient, with optional coherence weighting and masking (ArcGIS Unwrap Phase). Nothing in either registry unwraps phase — raster_calculator cannot express the global solve and the bundled speckle filters smooth rather than unwrap — so sar_coherence's phase output and flatten_interferogram currently have no continuous endpoint.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Wrapped-phase raster in radians, or a two-band I/Q interferogram."
              },
              "output": {
                "label": "Output",
                "description": "Unwrapped continuous phase raster. If omitted, stored in memory."
              },
              "method": {
                "label": "Method",
                "description": "'least_squares_pcg' (default), matching the method ArcGIS supports."
              },
              "coherence": {
                "label": "Coherence",
                "description": "Optional co-registered coherence raster used as per-edge solve weights, so low-coherence pixels pull the solution less."
              },
              "coherence_threshold": {
                "label": "Coherence Threshold",
                "description": "Mask out pixels whose coherence falls below this (default 0.3). Ignored when no coherence raster is given. Masking that splits the valid pixels into disconnected components leaves each component other than the reference pixel's with its own arbitrary additive constant."
              },
              "max_iterations": {
                "label": "Max Iterations",
                "description": "PCG iteration cap (default 500)."
              },
              "tolerance": {
                "label": "Tolerance",
                "description": "Relative residual at which the solve stops (default 1e-8)."
              },
              "reference_row": {
                "label": "Reference Row",
                "description": "Row of the pixel pinned to zero, fixing the solution's additive constant. Default: the first valid pixel."
              },
              "reference_col": {
                "label": "Reference Col",
                "description": "Column of the pinned pixel. Default: the first valid pixel."
              },
              "band": {
                "label": "Band",
                "description": "1-based band holding the phase. Omit it for a single-band phase raster or a two-band I/Q interferogram (which is then auto-detected); supply it to read real phase from a specific band of a multiband stack. A raster with more than two bands REQUIRES this parameter, because three or more bands are not an I/Q pair and guessing would return plausible but wrong phase."
              }
            }
          },
          "validate_flow_direction": {
            "name": "Validate Flow Direction",
            "description": "Reports the cells that make a flow-direction raster unusable — codes that are not D8 directions, interior cells with no outlet, flow into no-data, flow off the edge, and cells on a circular flow path — as a point layer of problems (ArcGIS Validate Flow Direction). The bundled hydrology suite consumes pointer rasters everywhere (d8_flow_accumulation, watershed, basins, trace_downslope_flowpaths) but nothing validates one, so a raster broken by resampling, reclassing or clipping yields a plausible wrong answer rather than an error, and a routing loop can hang.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Flow-direction (pointer) raster to check."
              },
              "output": {
                "label": "Output",
                "description": "Output point layer, one point per problem cell. If omitted, stored in memory."
              },
              "flow_direction_type": {
                "label": "Flow Direction Type",
                "description": "'d8' (default) for single power-of-two codes, or 'mfd' where a value may be the sum of several directions."
              },
              "report_edge_outflow": {
                "label": "Report Edge Outflow",
                "description": "Report cells whose flow leaves the raster (default false). Normal on a true boundary, a real defect on a clipped interior."
              },
              "check_circular": {
                "label": "Check Circular",
                "description": "Detect circular flow paths (default true)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band holding the directions (default 1)."
              }
            }
          },
          "vector_convert": {
            "name": "Vector Convert",
            "description": "Convert a vector dataset to another format (the output extension picks the driver).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path (format auto-detected) or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path; the driver is taken from its extension (.geojson, .fgb, .shp, .gpkg, .parquet, ...). If omitted, the layer is stored in memory."
              }
            }
          },
          "vector_to_h3": {
            "name": "Vector to H3 Bins",
            "description": "Bin a vector layer into H3 discrete-global-grid cells, counting features per cell.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path (must be geographic lon/lat, EPSG:4326) or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Output vector path; the driver is taken from its extension (.geojson, .fgb, .parquet, ...). If omitted, the layer is stored in memory."
              },
              "resolution": {
                "label": "Resolution",
                "description": "H3 resolution 0 (coarsest) to 15 (finest); default 8 (~0.7 km² cells)."
              }
            }
          },
          "vector_to_pmtiles": {
            "name": "Vector to PMTiles",
            "description": "Pack a vector layer into a single PMTiles archive (Mapbox Vector Tile pyramid).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path (GeoJSON, Shapefile, GeoPackage, FlatGeobuf, GeoParquet, ...)."
              },
              "output": {
                "label": "Output",
                "description": "Output PMTiles file path (e.g. /work/roads.pmtiles)."
              },
              "min_zoom": {
                "label": "Min Zoom",
                "description": "Minimum zoom level (default 0)."
              },
              "max_zoom": {
                "label": "Max Zoom",
                "description": "Maximum zoom level (default 14, maximum 18)."
              },
              "layer_name": {
                "label": "Layer Name",
                "description": "Name of the layer inside the tiles, used when styling (default: the input layer's name)."
              },
              "simplify": {
                "label": "Simplify",
                "description": "Simplify geometries per zoom level (default true)."
              },
              "drop_rate": {
                "label": "Drop Rate",
                "description": "Rate at which features are dropped at low zooms, as in tippecanoe (default: no dropping)."
              }
            }
          },
          "voxel_isosurface": {
            "name": "Voxel Isosurface",
            "description": "Extracts a triangulated isosurface at one or more threshold values from a 3D voxel field via marching tetrahedra (ArcGIS Export Voxel Isosurface). The whole contouring suite in both registries is 2D — lines from a plane; this is the volumetric analogue, turning the output of idw_3d or a multidimensional raster into renderable geometry. Emits the triangle-mesh convention used by buffer_3d and minimum_bounding_volume, so results feed straight into inside_3d.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Voxel field as a multi-band raster: band k is the Z slice at z_min + k * z_spacing."
              },
              "values": {
                "label": "Values",
                "description": "Threshold value(s): a number, a JSON array of numbers, or a comma-separated string. One surface per value."
              },
              "output": {
                "label": "Output",
                "description": "Optional output path for the triangle-mesh surfaces. If omitted, stored in memory."
              },
              "z_min": {
                "label": "Z Min",
                "description": "Z coordinate of the first slice (default 0)."
              },
              "z_spacing": {
                "label": "Z Spacing",
                "description": "Vertical spacing between slices (default 1)."
              },
              "close_boundaries": {
                "label": "Close Boundaries",
                "description": "Cap surfaces where they meet the volume edge so the result bounds a closed solid (default true). Implemented by marching an extra below-iso shell, so the cap is welded to the surface; it lies between the boundary plane and one cell beyond it. This seals the OUTER faces only: cells touching interior no-data are skipped, so a no-data pocket that intersects the extracted surface still leaves an open rim (one lying wholly inside or outside the contour never meets the mesh)."
              },
              "smooth": {
                "label": "Smooth",
                "description": "Laplacian smoothing iterations applied to the extracted mesh (default 0)."
              }
            }
          },
          "warp_raster": {
            "name": "Warp Raster",
            "description": "Georeference a raster from ground control points (like ArcGIS Warp): fit an order 1/2/3 polynomial from source-pixel → world-coordinate GCP pairs and resample into a new georeferenced grid (nearest/bilinear), reporting per-GCP residuals and RMS error. The raster half of the conflation story the vector rubbersheet_features already covers.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster (its pixel grid is the source coordinate space)."
              },
              "gcps": {
                "label": "Gcps",
                "description": "Ground control points as 'col,row,x,y' quads separated by ';' (>= 3 for order 1, 6 for order 2, 10 for order 3)."
              },
              "output": {
                "label": "Output",
                "description": "Output georeferenced raster. If omitted, stored in memory."
              },
              "transform": {
                "label": "Transform",
                "description": "Polynomial order: 'poly1' (affine; default), 'poly2', or 'poly3'."
              },
              "resampling": {
                "label": "Resampling",
                "description": "'nearest' (default) or 'bilinear'."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in world units (default: input width mapped to the target extent)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG code to tag the output CRS (optional)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to warp (default 1)."
              }
            }
          },
          "weighted_voronoi": {
            "name": "Weighted Voronoi",
            "description": "Weighted Voronoi allocation raster (market/dominance areas): assign each cell to the site with the smallest weighted distance — multiplicative (d/w, Apollonius), additive (d-w), or power (d²-w²) — like ArcGIS Generate Weighted Voronoi. The unequal-site version of the bundled unweighted voronoi_diagram.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input point layer of sites."
              },
              "output": {
                "label": "Output",
                "description": "Output allocation raster (1-based site index per cell). If omitted, stored in memory."
              },
              "weight_field": {
                "label": "Weight Field",
                "description": "Numeric field giving each site's weight/attractiveness (default: all sites weight 1)."
              },
              "weight_type": {
                "label": "Weight Type",
                "description": "'multiplicative' (d/w; default), 'additive' (d-w), or 'power' (d²-w²)."
              },
              "cell_size": {
                "label": "Cell Size",
                "description": "Output cell size in CRS units (default: extent / 400)."
              },
              "margin": {
                "label": "Margin",
                "description": "Fraction of the site extent to pad the raster by (default 0.1)."
              },
              "epsg": {
                "label": "Epsg",
                "description": "EPSG to tag the output (default: from the input layer)."
              }
            }
          },
          "write_geoparquet": {
            "name": "Write GeoParquet",
            "description": "Convert a vector dataset (GeoJSON, Shapefile, FlatGeobuf, GeoPackage, ...) to GeoParquet, Hilbert-sorted and ZSTD-compressed by default.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input vector file path (format auto-detected) or in-memory handle."
              },
              "output": {
                "label": "Output",
                "description": "Output GeoParquet file path (e.g. /work/data.parquet)."
              },
              "compression": {
                "label": "Compression",
                "description": "Column compression: zstd (default), snappy, gzip, or uncompressed."
              },
              "hilbert_sort": {
                "label": "Hilbert Sort",
                "description": "Sort features along a Hilbert curve for spatial locality (default true)."
              }
            }
          },
          "write_pmtiles": {
            "name": "Raster to PMTiles",
            "description": "Render a raster into a single PMTiles archive (Web Mercator PNG tile pyramid).",
            "params": {
              "input": {
                "label": "Input",
                "description": "Input raster file path. Must carry a source CRS (EPSG or WKT)."
              },
              "output": {
                "label": "Output",
                "description": "Output PMTiles file path (e.g. /work/dem.pmtiles)."
              },
              "min_zoom": {
                "label": "Min Zoom",
                "description": "Minimum zoom level (default: a single native zoom matching the raster resolution)."
              },
              "max_zoom": {
                "label": "Max Zoom",
                "description": "Maximum zoom level (default: same as min_zoom)."
              },
              "band": {
                "label": "Band",
                "description": "1-based band to render (default 1)."
              },
              "colormap": {
                "label": "Colormap",
                "description": "Colormap: viridis (default), magma, turbo, terrain, or grayscale."
              },
              "method": {
                "label": "Method",
                "description": "Resampling method: bilinear (default), nearest, cubic."
              },
              "min": {
                "label": "Min",
                "description": "Value mapped to the low end of the colormap (default: band minimum)."
              },
              "max": {
                "label": "Max",
                "description": "Value mapped to the high end of the colormap (default: band maximum)."
              }
            }
          },
          "zonal_characterization": {
            "name": "Zonal Characterization",
            "description": "Compute statistics for several value rasters over one zone raster in a single pass, with a per-raster statistic and arbitrary percentiles, like ArcGIS Zonal Characterization.",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Zone raster; each distinct value defines a zone."
              },
              "rasters": {
                "label": "Rasters",
                "description": "Comma-separated 'path:statistic[:name]' entries, e.g. 'dem.tif:mean,ndvi.tif:median'. Value rasters use band 1. Statistics: mean, sum, min, max, range, stddev, median, majority, minority, variety, count, percentile."
              },
              "output": {
                "label": "Output",
                "description": "Optional output statistics table path. If omitted, stored in memory."
              },
              "percentile": {
                "label": "Percentile",
                "description": "Percentile (0-100) applied to any raster whose statistic is 'percentile' (default 50)."
              },
              "zone_band": {
                "label": "Zone Band",
                "description": "1-based band to read from the zone raster (default 1)."
              },
              "ignore_nodata": {
                "label": "Ignore Nodata",
                "description": "Skip no-data cells in the value rasters (default true). When false, any no-data in a zone makes that zone's statistic null."
              }
            }
          },
          "zonal_fill": {
            "name": "Zonal Fill",
            "description": "Fill each zone of a categorical raster with the minimum value of a weight raster found along that zone's boundary (like ArcGIS Zonal Fill) — a constrained-surface building block absent from the bundled suite (fill is flow-based, zonal_statistics only summarizes).",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Categorical zone raster (each distinct integer value is one zone)."
              },
              "weight": {
                "label": "Weight",
                "description": "Co-registered weight raster whose boundary minimum fills each zone."
              },
              "output": {
                "label": "Output",
                "description": "Output raster. If omitted, stored in memory."
              }
            }
          },
          "zonal_geometry": {
            "name": "Zonal Geometry",
            "description": "Per-zone geometric measures from a categorical zone raster (like ArcGIS Zonal Geometry): area, perimeter, thickness, centroid, and standard-deviational ellipse major/minor axis + orientation — the zone-shape counterpart the bundled value-based zonal_statistics and zonal_histogram don't provide.",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Categorical zone raster (each distinct integer value is one zone)."
              },
              "output": {
                "label": "Output",
                "description": "Output raster (raster mode) or CSV path (as_table mode). If omitted, stored in memory / returned in the result only."
              },
              "measure": {
                "label": "Measure",
                "description": "Raster-mode measure: 'area' (default), 'perimeter', 'thickness', 'centroid_x', 'centroid_y', 'major_axis', 'minor_axis', or 'orientation'."
              },
              "as_table": {
                "label": "As Table",
                "description": "When true, emit one row per zone with every measure instead of a per-cell raster (default false)."
              }
            }
          },
          "zonal_histogram": {
            "name": "Zonal Histogram",
            "description": "Tabulate the distribution of a value raster's cells within each zone: class counts (categorical) or binned frequencies (continuous), as a zones x classes cross-tab table.",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Zone raster file path (integer/categorical zone ids)."
              },
              "value": {
                "label": "Value",
                "description": "Value raster file path; must share the grid of 'zones'."
              },
              "output": {
                "label": "Output",
                "description": "Output CSV path: one row per zone, one column per class/bin."
              },
              "mode": {
                "label": "Mode",
                "description": "'classes' (default) treats each rounded value as its own class, for integer/categorical value rasters. 'bins' buckets continuous values into equal-width bins."
              },
              "bins": {
                "label": "Bins",
                "description": "Number of equal-width bins for 'bins' mode. Default 10."
              },
              "percent": {
                "label": "Percent",
                "description": "Emit each class's percentage of the zone's valid cells instead of raw cell counts. Default false."
              },
              "zone_band": {
                "label": "Zone Band",
                "description": "1-based band to read from 'zones'. Default 1."
              },
              "value_band": {
                "label": "Value Band",
                "description": "1-based band to read from 'value'. Default 1."
              },
              "long_output": {
                "label": "Long Output",
                "description": "Optional CSV path for the long-format (zone,class,count,percent) variant."
              }
            }
          },
          "extract_cog_subset": {
            "name": "Extract COG Subset",
            "description": "Extract a bbox subset from a local or HTTP Cloud Optimized GeoTIFF.",
            "params": {
              "input": {
                "label": "Input",
                "description": "Local COG file. Provide either input or url."
              },
              "url": {
                "label": "Url",
                "description": "HTTP(S) COG URL. Provide either url or input; HTTP sources use byte-range requests."
              },
              "bbox": {
                "label": "Bbox",
                "description": "Bounding box as minX,minY,maxX,maxY in bbox_crs."
              },
              "bbox_crs": {
                "label": "Bbox Crs",
                "description": "EPSG code of bbox coordinates."
              },
              "output": {
                "label": "Output",
                "description": "Output COG path."
              },
              "level": {
                "label": "Level",
                "description": "COG overview level to read; 0 is full resolution."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Target output pixel size. Uses output_crs units when output_crs is set; otherwise bbox_crs units. Selects the closest COG overview when level is omitted."
              },
              "output_crs": {
                "label": "Output Crs",
                "description": "Optional output EPSG code. When set, the subset is reprojected to this CRS. For source CRSs that cannot be written as EPSG metadata, defaults to bbox_crs."
              },
              "nodata": {
                "label": "Nodata",
                "description": "Optional output nodata value. Used as reprojection fill and written as output nodata metadata."
              }
            }
          },
          "extract_wms_subset": {
            "name": "Extract WMS Subset",
            "description": "Request a bbox subset from a WMS GetMap endpoint and write it as a Deflate COG.",
            "params": {
              "url": {
                "label": "Url",
                "description": "WMS endpoint URL."
              },
              "layers": {
                "label": "Layers",
                "description": "WMS layer name(s), comma-separated."
              },
              "styles": {
                "label": "Styles",
                "description": "WMS style name(s), comma-separated. Defaults to empty."
              },
              "bbox": {
                "label": "Bbox",
                "description": "Bounding box as minX,minY,maxX,maxY in bbox_crs."
              },
              "bbox_crs": {
                "label": "Bbox Crs",
                "description": "EPSG code of bbox coordinates."
              },
              "output": {
                "label": "Output",
                "description": "Output COG path."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Target output pixel size in output_crs units when output_crs is set; otherwise bbox_crs units."
              },
              "width": {
                "label": "Width",
                "description": "Output request width in pixels. Used when resolution is omitted."
              },
              "height": {
                "label": "Height",
                "description": "Output request height in pixels. Used when resolution is omitted."
              },
              "output_crs": {
                "label": "Output Crs",
                "description": "Optional output/request EPSG code. Defaults to bbox_crs."
              },
              "format": {
                "label": "Format",
                "description": "WMS image format. Defaults to image/geotiff."
              },
              "version": {
                "label": "Version",
                "description": "WMS version. Defaults to 1.1.1."
              },
              "nodata": {
                "label": "Nodata",
                "description": "Optional output nodata value."
              }
            }
          },
          "extract_xyz_tile_subset": {
            "name": "Extract XYZ Tile Subset",
            "description": "Fetch XYZ raster tiles for a bbox, mosaic them, and write a Deflate RGB COG.",
            "params": {
              "url": {
                "label": "Url",
                "description": "XYZ tile URL template, e.g. https://.../{z}/{x}/{y}.png."
              },
              "zoom": {
                "label": "Zoom",
                "description": "XYZ zoom level."
              },
              "bbox": {
                "label": "Bbox",
                "description": "Bounding box as minX,minY,maxX,maxY in bbox_crs."
              },
              "bbox_crs": {
                "label": "Bbox Crs",
                "description": "EPSG code of bbox coordinates."
              },
              "output": {
                "label": "Output",
                "description": "Output COG path."
              },
              "resolution": {
                "label": "Resolution",
                "description": "Target output pixel size in output_crs units. Defaults to native tile resolution."
              },
              "width": {
                "label": "Width",
                "description": "Output width in pixels. Used when resolution is omitted."
              },
              "height": {
                "label": "Height",
                "description": "Output height in pixels. Used when resolution is omitted."
              },
              "output_crs": {
                "label": "Output Crs",
                "description": "Optional output EPSG code. Defaults to bbox_crs."
              },
              "tile_size": {
                "label": "Tile Size",
                "description": "Tile size in pixels. Defaults to 256."
              },
              "subdomains": {
                "label": "Subdomains",
                "description": "Optional subdomain letters for {s}, e.g. abc."
              },
              "nodata": {
                "label": "Nodata",
                "description": "Optional output nodata value used for missing/transparent pixels."
              }
            }
          }
        }
      },
      "whitebox": {
        "categories": {
          "conversion": "Conversion",
          "conversionGeometryTopology": "Conversion - Geometry & Topology",
          "conversionRasterVectorConversion": "Conversion - Raster/Vector Conversion",
          "conversionVectorTableIO": "Conversion - Vector & Table I/O",
          "hydrology": "Hydrology",
          "hydrologyDepressionsStorage": "Hydrology - Depressions & Storage",
          "hydrologyFlowRouting": "Hydrology - Flow Routing",
          "hydrologyHydrologicIndices": "Hydrology - Hydrologic Indices",
          "hydrologyStreamsLongitudinalAnalysis": "Hydrology - Streams - Longitudinal Analysis",
          "hydrologyStreamsNetworkExtraction": "Hydrology - Streams - Network Extraction",
          "hydrologyStreamsOrderingMetrics": "Hydrology - Streams - Ordering Metrics",
          "hydrologyWatershedsBasins": "Hydrology - Watersheds & Basins",
          "lidarAnalysisMetrics": "LiDAR - Analysis Metrics",
          "lidarFilteringClassification": "LiDAR - Filtering & Classification",
          "lidarIOManagement": "LiDAR - I/O & Management",
          "lidarInterpolationGridding": "LiDAR - Interpolation & Gridding",
          "projectionAndGeoreferencing": "Projection and Georeferencing",
          "raster": "Raster",
          "rasterDistanceCost": "Raster - Distance & Cost",
          "rasterLocalNeighborhood": "Raster - Local Neighborhood",
          "rasterOverlayMath": "Raster - Overlay Math",
          "rasterReclassifyMask": "Raster - Reclassify & Mask",
          "rasterSpatialStatistics": "Raster - Spatial Statistics",
          "remoteSensingChangeDetection": "Remote Sensing - Change Detection",
          "remoteSensingClassification": "Remote Sensing - Classification",
          "remoteSensingEdgeFeatureDetection": "Remote Sensing - Edge & Feature Detection",
          "remoteSensingEnhancementContrast": "Remote Sensing - Enhancement & Contrast",
          "remoteSensingFilters": "Remote Sensing - Filters",
          "remoteSensingObia": "Remote Sensing - OBIA",
          "remoteSensingRadiometricCorrection": "Remote Sensing - Radiometric Correction",
          "remoteSensingSar": "Remote Sensing - SAR",
          "remoteSensingSpectralAnalytics": "Remote Sensing - Spectral Analytics",
          "remoteSensingThermalEmissivity": "Remote Sensing - Thermal & Emissivity",
          "terrain": "Terrain",
          "terrainDerivatives": "Terrain - Derivatives",
          "terrainLandformIndices": "Terrain - Landform Indices",
          "terrainMultiscaleSignatures": "Terrain - Multiscale Signatures",
          "terrainRoughnessTexture": "Terrain - Roughness & Texture",
          "terrainVisibility": "Terrain - Visibility",
          "terrainWorkflowProducts": "Terrain - Workflow Products",
          "vector": "Vector",
          "vectorAttributeAnalysis": "Vector - Attribute Analysis",
          "vectorGeometryProcessing": "Vector - Geometry Processing",
          "vectorLinearReferencing": "Vector - Linear Referencing",
          "vectorNetworkAnalysis": "Vector - Network Analysis",
          "vectorOnlineData": "Vector - Online Data",
          "vectorOverlayAnalysis": "Vector - Overlay Analysis",
          "vectorSamplingGridding": "Vector - Sampling & Gridding",
          "vectorShapeMetrics": "Vector - Shape Metrics",
          "vectorSpatialStatistics": "Vector - Spatial Statistics"
        },
        "menuTool": {
          "calculate_transit_service_frequency": "Calculate Transit Service Frequency",
          "excel_to_table": "Excel To Table",
          "extract_scanned_features": "Extract Scanned Features",
          "features_to_gpx": "Features To GPX",
          "features_to_gtfs": "Features To GTFS",
          "gpx_to_features": "GPX To Features",
          "gtfs_to_features": "GTFS To Features",
          "h3_to_vector": "H3 Cells to Polygons",
          "h3_polyfill": "H3 Polyfill",
          "kml_to_features": "KML To Features",
          "pmtiles_extract": "PMTiles Extract",
          "raster_to_h3": "Raster to H3 Bins",
          "write_pmtiles": "Raster to PMTiles",
          "raster_to_tiles": "Raster to XYZ Tiles",
          "read_geoparquet": "Read GeoParquet",
          "vector_convert": "Vector Convert",
          "vector_to_h3": "Vector to H3 Bins",
          "vector_to_pmtiles": "Vector to PMTiles",
          "write_geoparquet": "Write GeoParquet",
          "fix_dangling_arcs": "Fix Dangling Arcs",
          "lines_to_polygons": "Lines To Polygons",
          "multipart_to_singlepart": "Multipart To Singlepart",
          "polygons_to_lines": "Polygons To Lines",
          "remove_polygon_holes": "Remove Polygon Holes",
          "singlepart_to_multipart": "Singlepart To Multipart",
          "topology_rule_autofix": "Topology Rule Autofix",
          "topology_rule_validate": "Topology Rule Validate",
          "topology_validation_report": "Topology Validation Report",
          "convert_nodata_to_zero": "Convert Nodata To Zero",
          "modify_nodata_value": "Modify Nodata Value",
          "new_raster_from_base_raster": "New Raster From Base Raster",
          "new_raster_from_base_vector": "New Raster From Base Vector",
          "raster_to_vector_lines": "Raster To Vector Lines",
          "raster_to_vector_points": "Raster To Vector Points",
          "raster_to_vector_polygons": "Raster To Vector Polygons",
          "remove_raster_polygon_holes": "Remove Raster Polygon Holes",
          "set_nodata_value": "Set Nodata Value",
          "vector_lines_to_raster": "Vector Lines To Raster",
          "vector_points_to_raster": "Vector Points To Raster",
          "vector_polygons_to_raster": "Vector Polygons To Raster",
          "add_point_coordinates_to_table": "Add Point Coordinates To Table",
          "clean_vector": "Clean Vector",
          "csv_points_to_vector": "Csv Points To Vector",
          "export_table_to_csv": "Export Table To Csv",
          "join_tables": "Join Tables",
          "merge_table_with_csv": "Merge Table With Csv",
          "merge_vectors": "Merge Vectors",
          "reinitialize_attribute_table": "Reinitialize Attribute Table",
          "vector_summary_statistics": "Vector Summary Statistics",
          "delineate_depressions": "Delineate Depressions",
          "delineate_mounts": "Delineate Mounts",
          "enforce_river_monotonicity": "Enforce River Monotonicity",
          "extract_sinks": "Extract Sinks",
          "fill_spill_merge": "Fill-Spill-Merge",
          "topo_to_raster": "Topo To Raster",
          "breach_depressions_least_cost": "Breach Depressions Least Cost",
          "breach_single_cell_pits": "Breach Single Cell Pits",
          "burn_streams": "Burn Streams",
          "burn_streams_at_roads": "Burn Streams At Roads",
          "depth_in_sink": "Depth In Sink",
          "fill_burn": "Fill Burn",
          "fill_depressions": "Fill Depressions",
          "fill_depressions_planchon_and_darboux": "Fill Depressions Planchon And Darboux",
          "fill_depressions_wang_and_liu": "Fill Depressions Wang And Liu",
          "fill_pits": "Fill Pits",
          "flatten_lakes": "Flatten Lakes",
          "impoundment_size_index": "Impoundment Size Index",
          "insert_dams": "Insert Dams",
          "raise_walls": "Raise Walls",
          "sink": "Sink",
          "stochastic_depression_analysis": "Stochastic Depression Analysis",
          "topological_breach_burn": "Topological Breach Burn",
          "upslope_depression_storage": "Upslope Depression Storage",
          "average_flowpath_slope": "Average Flowpath Slope",
          "average_upslope_flowpath_length": "Average Upslope Flowpath Length",
          "d8_flow_accum": "D8 Flow Accum",
          "d8_mass_flux": "D8 Mass Flux",
          "d8_pointer": "D8 Pointer",
          "dinf_flow_accum": "Dinf Flow Accum",
          "dinf_mass_flux": "Dinf Mass Flux",
          "dinf_pointer": "Dinf Pointer",
          "downslope_flowpath_length": "Downslope Flowpath Length",
          "fd8_flow_accum": "Fd8 Flow Accum",
          "fd8_pointer": "Fd8 Pointer",
          "flow_accum_full_workflow": "Flow Accum Full Workflow",
          "flow_length_diff": "Flow Length Diff",
          "max_upslope_flowpath_length": "Max Upslope Flowpath Length",
          "max_upslope_value": "Max Upslope Value",
          "mdinf_flow_accum": "Mdinf Flow Accum",
          "minimal_dispersion_flow_algorithm": "Minimal Dispersion Flow Algorithm",
          "num_inflowing_neighbours": "Num Inflowing Neighbours",
          "qin_flow_accumulation": "Qin Flow Accumulation",
          "quinn_flow_accumulation": "Quinn Flow Accumulation",
          "rho8_flow_accum": "Rho8 Flow Accum",
          "rho8_pointer": "Rho8 Pointer",
          "trace_downslope_flowpaths": "Trace Downslope Flowpaths",
          "depth_to_water": "Depth To Water",
          "distance_to_outlet": "Distance To Outlet",
          "downslope_distance_to_stream": "Downslope Distance To Stream",
          "downslope_index": "Downslope Index",
          "edge_contamination": "Edge Contamination",
          "elev_relative_to_watershed_min_max": "Elev Relative To Watershed Min Max",
          "elevation_above_stream": "Elevation Above Stream",
          "elevation_above_stream_euclidean": "Elevation Above Stream Euclidean",
          "find_noflow_cells": "Find Noflow Cells",
          "find_parallel_flow": "Find Parallel Flow",
          "hydrologic_connectivity": "Hydrologic Connectivity",
          "relative_stream_power_index": "Relative Stream Power Index",
          "sediment_transport_index": "Sediment Transport Index",
          "wetness_index": "Wetness Index",
          "farthest_channel_head": "Farthest Channel Head",
          "find_main_stem": "Find Main Stem",
          "length_of_upstream_channels": "Length Of Upstream Channels",
          "long_profile": "Long Profile",
          "long_profile_from_points": "Long Profile From Points",
          "extract_streams": "Extract Streams",
          "extract_valleys": "Extract Valleys",
          "prune_vector_streams": "Prune Vector Streams",
          "raster_streams_to_vector": "Raster Streams To Vector",
          "rasterize_streams": "Rasterize Streams",
          "remove_short_streams": "Remove Short Streams",
          "repair_stream_vector_topology": "Repair Stream Vector Topology",
          "river_centerlines": "River Centerlines",
          "hack_stream_order": "Hack Stream Order",
          "horton_ratios": "Horton Ratios",
          "horton_stream_order": "Horton Stream Order",
          "shreve_stream_magnitude": "Shreve Stream Magnitude",
          "strahler_order_basins": "Strahler Order Basins",
          "strahler_stream_order": "Strahler Stream Order",
          "stream_link_class": "Stream Link Class",
          "stream_link_identifier": "Stream Link Identifier",
          "stream_link_length": "Stream Link Length",
          "stream_link_slope": "Stream Link Slope",
          "stream_slope_continuous": "Stream Slope Continuous",
          "topological_stream_order": "Topological Stream Order",
          "tributary_identifier": "Tributary Identifier",
          "vector_stream_network_analysis": "Vector Stream Network Analysis",
          "basins": "Basins",
          "flood_order": "Flood Order",
          "hillslopes": "Hillslopes",
          "isobasins": "Isobasins",
          "jenson_snap_pour_points": "Jenson Snap Pour Points",
          "longest_flowpath": "Longest Flowpath",
          "max_branch_length": "Max Branch Length",
          "snap_pour_points": "Snap Pour Points",
          "subbasins": "Subbasins",
          "unnest_basins": "Unnest Basins",
          "watershed": "Watershed",
          "watershed_from_raster_pour_points": "Watershed From Raster Pour Points",
          "assign_projection_lidar": "Assign Projection Lidar",
          "colourize_based_on_class": "Colourize Based On Class",
          "colourize_based_on_point_returns": "Colourize Based On Point Returns",
          "find_flightline_edge_points": "Find Flightline Edge Points",
          "individual_tree_detection": "Individual Tree Detection",
          "lidar_eigenvalue_features": "Lidar Eigenvalue Features",
          "lidar_histogram": "Lidar Histogram",
          "lidar_info": "Lidar Info",
          "lidar_kappa": "Lidar Kappa",
          "lidar_point_density": "Lidar Point Density",
          "lidar_point_return_analysis": "Lidar Point Return Analysis",
          "lidar_point_stats": "Lidar Point Stats",
          "lidar_ransac_planes": "Lidar Ransac Planes",
          "lidar_rooftop_analysis": "Lidar Rooftop Analysis",
          "normal_vectors": "Normal Vectors",
          "classify_buildings_in_lidar": "Classify Buildings In Lidar",
          "classify_lidar": "Classify Lidar",
          "classify_overlap_points": "Classify Overlap Points",
          "clip_lidar_to_polygon": "Clip Lidar To Polygon",
          "erase_polygon_from_lidar": "Erase Polygon From Lidar",
          "filter_lidar": "Filter Lidar",
          "filter_lidar_by_percentile": "Filter Lidar By Percentile",
          "filter_lidar_by_reference_surface": "Filter Lidar By Reference Surface",
          "filter_lidar_classes": "Filter Lidar Classes",
          "filter_lidar_noise": "Filter Lidar Noise",
          "filter_lidar_scan_angles": "Filter Lidar Scan Angles",
          "height_above_ground": "Height Above Ground",
          "improved_ground_point_filter": "Improved Ground Point Filter",
          "individual_tree_segmentation": "Individual Tree Segmentation",
          "lidar_classify_subset": "Lidar Classify Subset",
          "lidar_elevation_slice": "Lidar Elevation Slice",
          "lidar_remove_outliers": "Lidar Remove Outliers",
          "lidar_segmentation": "Lidar Segmentation",
          "lidar_segmentation_based_filter": "Lidar Segmentation Based Filter",
          "modify_lidar": "Modify Lidar",
          "normalize_lidar": "Normalize Lidar",
          "remove_duplicates": "Remove Duplicates",
          "ascii_to_las": "Ascii To Las",
          "las_to_ascii": "Las To Ascii",
          "las_to_shapefile": "Las To Shapefile",
          "lidar_colourize": "Lidar Colourize",
          "lidar_join": "Lidar Join",
          "lidar_shift": "Lidar Shift",
          "lidar_tile": "Lidar Tile",
          "lidar_tophat_transform": "Lidar Tophat Transform",
          "recover_flightline_info": "Recover Flightline Info",
          "select_tiles_by_polygon": "Select Tiles By Polygon",
          "sort_lidar": "Sort Lidar",
          "split_lidar": "Split Lidar",
          "flightline_overlap": "Flightline Overlap",
          "lidar_block_maximum": "Lidar Block Maximum",
          "lidar_block_minimum": "Lidar Block Minimum",
          "lidar_construct_vector_tin": "Lidar Construct Vector Tin",
          "lidar_contour": "Lidar Contour",
          "lidar_digital_surface_model": "Lidar Digital Surface Model",
          "lidar_hex_bin": "Lidar Hex Bin",
          "lidar_hillshade": "Lidar Hillshade",
          "lidar_idw_interpolation": "Lidar Idw Interpolation",
          "lidar_nearest_neighbour_gridding": "Lidar Nearest Neighbour Gridding",
          "lidar_radial_basis_function_interpolation": "Lidar Radial Basis Function Interpolation",
          "lidar_sibson_interpolation": "Lidar Sibson Interpolation",
          "lidar_thin": "Lidar Thin",
          "lidar_thin_high_density": "Lidar Thin High Density",
          "lidar_tile_footprint": "Lidar Tile Footprint",
          "lidar_tin_gridding": "Lidar Tin Gridding",
          "build_network_topology": "Build Network Topology",
          "closest_facility_network": "Closest Facility Network",
          "generate_network_nodes": "Generate Network Nodes",
          "k_shortest_paths_network": "K Shortest Paths Network",
          "location_allocation_network": "Location Allocation Network",
          "map_matching_v1": "Map Matching V1",
          "multimodal_od_cost_matrix": "Multimodal Od Cost Matrix",
          "multimodal_routes_from_od": "Multimodal Routes From Od",
          "multimodal_shortest_path": "Multimodal Shortest Path",
          "network_accessibility_metrics": "Network Accessibility Metrics",
          "network_centrality_metrics": "Network Centrality Metrics",
          "network_connected_components": "Network Connected Components",
          "network_node_degree": "Network Node Degree",
          "network_od_cost_matrix": "Network Od Cost Matrix",
          "network_routes_from_od": "Network Routes From Od",
          "network_service_area": "Network Service Area",
          "network_topology_audit": "Network Topology Audit",
          "od_sensitivity_analysis": "Od Sensitivity Analysis",
          "shortest_path_network": "Shortest Path Network",
          "snap_points_to_network": "Snap Points To Network",
          "split_lines_at_intersections": "Split Lines At Intersections",
          "transfer_attributes": "Transfer Attributes",
          "travelling_salesman_problem": "Travelling Salesman Problem",
          "vehicle_routing_cvrp": "Vehicle Routing Cvrp",
          "vehicle_routing_pickup_delivery": "Vehicle Routing Pickup Delivery",
          "vehicle_routing_vrptw": "Vehicle Routing Vrptw",
          "georeference_raster_from_control_points": "Georeference Raster From Control Points",
          "orthorectification": "Orthorectification",
          "reproject_lidar": "Reproject Lidar",
          "reproject_vector": "Reproject Vector",
          "aggregate_multidimensional_raster": "Aggregate Multidimensional Raster",
          "analyze_changes_ccdc": "Analyze Changes Using CCDC",
          "apply_radiometric_calibration": "Apply Radiometric Calibration",
          "assign_projection_raster": "Assign Projection Raster",
          "band_collection_statistics": "Band Collection Statistics",
          "block_statistics": "Block Statistics",
          "boundary_clean": "Boundary Clean",
          "cell_position_statistics": "Cell Position Statistics",
          "cell_statistics": "Cell Statistics",
          "classification_accuracy_assessment": "Classification Accuracy Assessment",
          "combine": "Combine",
          "composite_bands": "Composite Bands",
          "compute_sar_indices": "Compute SAR Indices",
          "contour_with_barriers": "Contour With Barriers",
          "convert_sar_units": "Convert SAR Units",
          "coregister_rasters": "Coregister Rasters",
          "corridor": "Corridor",
          "cost_back_link": "Cost Back Link",
          "cut_fill": "Cut Fill",
          "darcy_flow": "Darcy Flow",
          "dem_filter": "DEM Filter",
          "detect_image_anomalies": "Detect Image Anomalies",
          "diffusion_interpolation_with_barriers": "Diffusion Interpolation With Barriers",
          "dimensional_moving_statistics": "Dimensional Moving Statistics",
          "empirical_bayesian_kriging": "Empirical Bayesian Kriging",
          "euclidean_direction": "Euclidean Direction",
          "expand_shrink": "Expand / Shrink",
          "extract_cog_subset": "Extract COG Subset",
          "extract_ocean_winds": "Extract Ocean Winds",
          "extract_spectra_from_image": "Extract Spectra From Image",
          "extract_wms_subset": "Extract WMS Subset",
          "extract_xyz_tile_subset": "Extract XYZ Tile Subset",
          "find_argument_statistics": "Find Argument Statistics",
          "flatten_interferogram": "Flatten Interferogram",
          "focal_flow": "Focal Flow",
          "focal_statistics": "Focal Statistics",
          "frequency_comparison": "Frequency Comparison",
          "fuzzy_overlay": "Fuzzy Overlay",
          "gaussian_geostatistical_simulations": "Gaussian Geostatistical Simulations",
          "multidimensional_anomaly": "Generate Multidimensional Anomaly",
          "generate_trend_raster": "Generate Trend Raster",
          "goldstein_phase_filter": "Goldstein Phase Filter",
          "idw_3d": "IDW 3D",
          "interpolate_from_spatiotemporal_points": "Interpolate From Spatiotemporal Points",
          "interpolate_with_barriers": "Interpolate With Barriers",
          "kernel_density_ratio": "Kernel Density Ratio",
          "kernel_interpolation_with_barriers": "Kernel Interpolation With Barriers",
          "landtrendr": "LandTrendr",
          "las_height_metrics": "LAS Height Metrics",
          "line_density": "Line Density",
          "line_statistics": "Line Statistics",
          "local_polynomial_interpolation": "Local Polynomial Interpolation",
          "locate_regions": "Locate Regions",
          "matched_filter_target_detection": "Matched Filter Target Detection (CEM/ACE)",
          "maximum_likelihood_classification": "Maximum Likelihood Classification",
          "merge_multidimensional_rasters": "Merge Multidimensional Rasters",
          "multicriteria_overlay": "Multicriteria Overlay",
          "multidimensional_principal_components": "Multidimensional Principal Components",
          "multidimensional_raster_correlation": "Multidimensional Raster Correlation",
          "multilook": "Multilook",
          "multitemporal_coherence": "Multitemporal Coherence",
          "observer_points": "Observer Points",
          "optimal_interpolation": "Optimal Interpolation",
          "path_distance": "Path Distance",
          "percentile_contours": "Percentile Contours",
          "point_statistics": "Point Statistics",
          "porous_puff": "Porous Puff",
          "predict_using_trend_raster": "Predict Using Trend Raster",
          "presence_only_prediction": "Presence-only Prediction",
          "pycnophylactic_interpolation": "Pycnophylactic Interpolation",
          "radiometric_terrain_flattening": "Radiometric Terrain Flattening",
          "raster_normalize": "Raster Normalize",
          "regression_kriging": "Regression Kriging",
          "remove_thermal_noise": "Remove Thermal Noise",
          "render_raster_png": "Render Raster to PNG",
          "reproject_raster": "Reproject Raster",
          "rescale_by_function": "Rescale By Function",
          "sar_coherence": "SAR Coherence",
          "slice_raster": "Slice Raster",
          "solar_radiation": "Solar Radiation",
          "space_time_kernel_density": "Space Time Kernel Density",
          "spatial_association_between_zones": "Spatial Association Between Zones",
          "spectral_index": "Spectral Index",
          "split_raster": "Split Raster",
          "storage_capacity": "Storage Capacity",
          "subset_multidimensional_raster": "Subset Multidimensional Raster",
          "summarize_categorical_raster": "Summarize Categorical Raster",
          "surface_parameters": "Surface Parameters",
          "surface_volume": "Surface Volume",
          "time_series_cross_correlation": "Time Series Cross Correlation",
          "unwrap_phase": "Unwrap Phase",
          "warp_raster": "Warp Raster",
          "weighted_voronoi": "Weighted Voronoi",
          "zonal_characterization": "Zonal Characterization",
          "zonal_fill": "Zonal Fill",
          "zonal_geometry": "Zonal Geometry",
          "zonal_histogram": "Zonal Histogram",
          "abs": "Abs",
          "aggregate_raster": "Aggregate Raster",
          "anova": "Anova",
          "arccos": "Arccos",
          "arcosh": "Arcosh",
          "arcsin": "Arcsin",
          "arctan": "Arctan",
          "arsinh": "Arsinh",
          "artanh": "Artanh",
          "atan2": "Atan2",
          "block_maximum": "Block Maximum",
          "block_minimum": "Block Minimum",
          "boundary_shape_complexity": "Boundary Shape Complexity",
          "ceil": "Ceil",
          "centroid_raster": "Centroid Raster",
          "clip_raster_to_polygon": "Clip Raster To Polygon",
          "clump": "Clump",
          "cos": "Cos",
          "cosh": "Cosh",
          "create_plane": "Create Plane",
          "crispness_index": "Crispness Index",
          "cross_tabulation": "Cross Tabulation",
          "cumulative_distribution": "Cumulative Distribution",
          "dbscan": "Dbscan",
          "decrement": "Decrement",
          "edge_proportion": "Edge Proportion",
          "equal_to": "Equal To",
          "erase_polygon_from_raster": "Erase Polygon From Raster",
          "exp": "Exp",
          "exp2": "Exp2",
          "fft_random_field": "Fft Random Field",
          "filter_raster_features_by_area": "Filter Raster Features By Area",
          "find_patch_edge_cells": "Find Patch Edge Cells",
          "floor": "Floor",
          "greater_than": "Greater Than",
          "greater_than_or_equal_to": "GreaterThanOrEqualTo",
          "heat_map": "Heat Map",
          "idw_interpolation": "Idw Interpolation",
          "image_autocorrelation": "Image Autocorrelation",
          "image_correlation": "Image Correlation",
          "image_regression": "Image Regression",
          "increment": "Increment",
          "inplace_add": "Inplace Add",
          "inplace_divide": "Inplace Divide",
          "inplace_multiply": "Inplace Multiply",
          "inplace_subtract": "Inplace Subtract",
          "integer_division": "Integer Division",
          "inverse_pca": "Inverse Pca",
          "is_nodata": "Is Nodata",
          "kappa_index": "Kappa Index",
          "ks_normality_test": "Ks Normality Test",
          "less_than": "Less Than",
          "less_than_or_equal_to": "LessThanOrEqualTo",
          "list_unique_values_raster": "List Unique Values Raster",
          "ln": "Ln",
          "log10": "Log10",
          "log2": "Log2",
          "map_features": "Map Features",
          "max": "Max",
          "min": "Min",
          "modified_shepard_interpolation": "Modified Shepard Interpolation",
          "narrowness_index": "Narrowness Index",
          "negate": "Negate",
          "nibble": "Nibble",
          "not_equal_to": "Not Equal To",
          "ordinary_cokriging": "Ordinary CoKriging Interpolation",
          "paired_sample_t_test": "Paired Sample T Test",
          "phi_coefficient": "Phi Coefficient",
          "principal_component_analysis": "Principal Component Analysis",
          "print_geotiff_tags": "Print Geotiff Tags",
          "quantiles": "Quantiles",
          "radial_basis_function_interpolation": "Radial Basis Function Interpolation",
          "radius_of_gyration": "Radius Of Gyration",
          "random_field": "Random Field",
          "random_forest_classification_fit": "Random Forest Classification Fit",
          "random_forest_classification_predict": "Random Forest Classification Predict",
          "random_forest_regression_fit": "Random Forest Regression Fit",
          "random_forest_regression_predict": "Random Forest Regression Predict",
          "random_sample": "Random Sample",
          "raster_area": "Raster Area",
          "raster_calculator": "Raster Calculator",
          "raster_cell_assignment": "Raster Cell Assignment",
          "raster_histogram": "Raster Histogram",
          "raster_perimeter": "Raster Perimeter",
          "raster_summary_stats": "Raster Summary Stats",
          "reciprocal": "Reciprocal",
          "rescale_value_range": "Rescale Value Range",
          "root_mean_square_error": "Root Mean Square Error",
          "round": "Round",
          "shape_complexity_index_raster": "Shape Complexity Index Raster",
          "sieve": "Sieve",
          "sin": "Sin",
          "sinh": "Sinh",
          "sqrt": "Sqrt",
          "square": "Square",
          "tan": "Tan",
          "tanh": "Tanh",
          "tin_interpolation": "Tin Interpolation",
          "to_degrees": "To Degrees",
          "to_radians": "To Radians",
          "trend_surface": "Trend Surface",
          "trend_surface_vector_points": "Trend Surface Vector Points",
          "truncate": "Truncate",
          "turning_bands_simulation": "Turning Bands Simulation",
          "two_sample_ks_test": "Two Sample Ks Test",
          "wilcoxon_signed_rank_test": "Wilcoxon Signed Rank Test",
          "z_scores": "Z Scores",
          "zonal_statistics": "Zonal Statistics",
          "buffer_raster": "Buffer Raster",
          "cost_allocation": "Cost Allocation",
          "cost_distance": "Cost Distance",
          "cost_pathway": "Cost Pathway",
          "euclidean_allocation": "Euclidean Allocation",
          "euclidean_distance": "Euclidean Distance",
          "image_correlation_neighbourhood_analysis": "Image Correlation Neighbourhood Analysis",
          "natural_neighbour_interpolation": "Natural Neighbour Interpolation",
          "nearest_neighbour_interpolation": "Nearest Neighbour Interpolation",
          "add": "Add",
          "average_overlay": "Average Overlay",
          "bool_and": "Bool And",
          "bool_not": "Bool Not",
          "bool_or": "Bool Or",
          "bool_xor": "Bool Xor",
          "count_if": "Count If",
          "divide": "Divide",
          "highest_position": "Highest Position",
          "lowest_position": "Lowest Position",
          "max_absolute_overlay": "Max Absolute Overlay",
          "max_overlay": "Max Overlay",
          "min_absolute_overlay": "Min Absolute Overlay",
          "min_overlay": "Min Overlay",
          "modulo": "Modulo",
          "multiply": "Multiply",
          "multiply_overlay": "Multiply Overlay",
          "percent_equal_to": "Percent Equal To",
          "percent_greater_than": "Percent Greater Than",
          "percent_less_than": "Percent Less Than",
          "pick_from_list": "Pick From List",
          "power": "Power",
          "standard_deviation_overlay": "Standard Deviation Overlay",
          "subtract": "Subtract",
          "sum_overlay": "Sum Overlay",
          "update_nodata_cells": "Update Nodata Cells",
          "weighted_overlay": "Weighted Overlay",
          "weighted_sum": "Weighted Sum",
          "conditional_evaluation": "Conditional Evaluation",
          "reclass": "Reclass",
          "reclass_equal_interval": "Reclass Equal Interval",
          "geographically_weighted_regression_raster": "Geographically Weighted Regression Raster",
          "getis_ord_gi_star_raster": "Getis Ord Gi Star Raster",
          "inhomogeneous_intensity_raster": "Inhomogeneous Intensity Raster",
          "local_kriging": "Local Kriging",
          "local_morans_i_lisa_raster": "Local Morans I Lisa Raster",
          "ordinary_kriging": "Ordinary Kriging",
          "simple_kriging": "Simple Kriging",
          "spacetime_kriging": "Spacetime Kriging",
          "spatial_error_regression_raster": "Spatial Error Regression Raster",
          "spatial_lag_regression_raster": "Spatial Lag Regression Raster",
          "universal_kriging": "Universal Kriging",
          "change_vector_analysis": "Change Vector Analysis",
          "image_difference_change_detection": "Image Difference Change Detection",
          "pca_based_change_detection": "Pca Based Change Detection",
          "post_classification_change": "Post Classification Change",
          "write_function_memory_insertion": "Write Function Memory Insertion",
          "evaluate_training_sites": "Evaluate Training Sites",
          "fuzzy_knn_classification": "Fuzzy Knn Classification",
          "generalize_classified_raster": "Generalize Classified Raster",
          "generalize_with_similarity": "Generalize With Similarity",
          "k_means_clustering": "K Means Clustering",
          "knn_classification": "Knn Classification",
          "knn_regression": "Knn Regression",
          "logistic_regression": "Logistic Regression",
          "min_dist_classification": "Min Dist Classification",
          "modified_k_means_clustering": "Modified K Means Clustering",
          "nnd_classification": "Nnd Classification",
          "otsu_thresholding": "Otsu Thresholding",
          "parallelepiped_classification": "Parallelepiped Classification",
          "random_forest_classification": "Random Forest Classification",
          "random_forest_regression": "Random Forest Regression",
          "svm_classification": "Svm Classification",
          "svm_regression": "Svm Regression",
          "canny_edge_detection": "Canny Edge Detection",
          "corner_detection": "Corner Detection",
          "laplacian_filter": "Laplacian Filter",
          "laplacian_of_gaussians_filter": "Laplacian Of Gaussians Filter",
          "prewitt_filter": "Prewitt Filter",
          "roberts_cross_filter": "Roberts Cross Filter",
          "sobel_filter": "Sobel Filter",
          "balance_contrast_enhancement": "Balance Contrast Enhancement",
          "create_colour_composite": "Create Colour Composite",
          "direct_decorrelation_stretch": "Direct Decorrelation Stretch",
          "false_colour_composite": "False Colour Composite",
          "gamma_correction": "Gamma Correction",
          "gaussian_contrast_stretch": "Gaussian Contrast Stretch",
          "histogram_equalization": "Histogram Equalization",
          "histogram_matching": "Histogram Matching",
          "histogram_matching_two_images": "Histogram Matching Two Images",
          "ihs_to_rgb": "Ihs To Rgb",
          "min_max_contrast_stretch": "Min Max Contrast Stretch",
          "mosaic": "Mosaic",
          "mosaic_with_feathering": "Mosaic With Feathering",
          "normalized_difference_index": "Normalized Difference Index",
          "panchromatic_sharpening": "Panchromatic Sharpening",
          "percentage_contrast_stretch": "Percentage Contrast Stretch",
          "piecewise_contrast_stretch": "Piecewise Contrast Stretch",
          "resample": "Resample",
          "rgb_to_ihs": "Rgb To Ihs",
          "sigmoidal_contrast_stretch": "Sigmoidal Contrast Stretch",
          "split_colour_composite": "Split Colour Composite",
          "standard_deviation_contrast_stretch": "Standard Deviation Contrast Stretch",
          "true_colour_composite": "True Colour Composite",
          "adaptive_filter": "Adaptive Filter",
          "anisotropic_diffusion_filter": "Anisotropic Diffusion Filter",
          "bilateral_filter": "Bilateral Filter",
          "closing": "Closing",
          "conservative_smoothing_filter": "Conservative Smoothing Filter",
          "diff_of_gaussians_filter": "Diff Of Gaussians Filter",
          "diversity_filter": "Diversity Filter",
          "edge_preserving_mean_filter": "Edge Preserving Mean Filter",
          "emboss_filter": "Emboss Filter",
          "fast_almost_gaussian_filter": "Fast Almost Gaussian Filter",
          "flip_image": "Flip Image",
          "frangi_filter": "Frangi Filter",
          "gabor_filter_bank": "Gabor Filter Bank",
          "gaussian_filter": "Gaussian Filter",
          "glcm_texture": "Glcm Texture",
          "guided_filter": "Guided Filter",
          "high_pass_bilateral_filter": "High Pass Bilateral Filter",
          "high_pass_filter": "High Pass Filter",
          "high_pass_median_filter": "High Pass Median Filter",
          "integral_image_transform": "Integral Image Transform",
          "k_nearest_mean_filter": "K Nearest Mean Filter",
          "kuwahara_filter": "Kuwahara Filter",
          "lee_filter": "Lee Filter",
          "lidar_ground_point_filter": "Lidar Ground Point Filter",
          "line_detection_filter": "Line Detection Filter",
          "line_thinning": "Line Thinning",
          "majority_filter": "Majority Filter",
          "maximum_filter": "Maximum Filter",
          "mean_filter": "Mean Filter",
          "median_filter": "Median Filter",
          "minimum_filter": "Minimum Filter",
          "non_local_means_filter": "Non Local Means Filter",
          "olympic_filter": "Olympic Filter",
          "opening": "Opening",
          "percentile_filter": "Percentile Filter",
          "range_filter": "Range Filter",
          "remove_spurs": "Remove Spurs",
          "savitzky_golay_2d_filter": "Savitzky Golay 2d Filter",
          "scharr_filter": "Scharr Filter",
          "standard_deviation_filter": "Standard Deviation Filter",
          "thicken_raster_line": "Thicken Raster Line",
          "tophat_transform": "Tophat Transform",
          "total_filter": "Total Filter",
          "unsharp_masking": "Unsharp Masking",
          "user_defined_weights_filter": "User Defined Weights Filter",
          "wiener_filter": "Wiener Filter",
          "build_object_hierarchy_multiscale": "Build Object Hierarchy Multiscale",
          "classify_objects_ensemble_pro": "Classify Objects Ensemble Pro",
          "classify_objects_random_forest": "Classify Objects Random Forest",
          "classify_objects_rules_basic": "Classify Objects Rules Basic",
          "classify_objects_rules_hierarchical": "Classify Objects Rules Hierarchical",
          "classify_objects_svm": "Classify Objects Svm",
          "evaluate_object_classification_accuracy": "Evaluate Object Classification Accuracy",
          "evaluate_segmentation_quality_pro": "Evaluate Segmentation Quality Pro",
          "image_segmentation": "Image Segmentation",
          "image_slider": "Image Slider",
          "image_stack_profile": "Image Stack Profile",
          "obia_audit_report_pro": "Obia Audit Report Pro",
          "obia_batch_orchestrator_pro": "Obia Batch Orchestrator Pro",
          "obia_pipeline_basic": "Obia Pipeline Basic",
          "object_class_probability_maps": "Object Class Probability Maps",
          "object_features_context_neighbors": "Object Features Context Neighbors",
          "object_features_shape_basic": "Object Features Shape Basic",
          "object_features_spectral_basic": "Object Features Spectral Basic",
          "object_features_texture_glcm_basic": "Object Features Texture Glcm Basic",
          "object_features_topology_relations": "Object Features Topology Relations",
          "object_uncertainty_diagnostics_pro": "Object Uncertainty Diagnostics Pro",
          "objects_boundary_refinement_pro": "Objects Boundary Refinement Pro",
          "objects_enforce_min_mapping_unit": "Objects Enforce Min Mapping Unit",
          "polygons_to_segments": "Polygons To Segments",
          "propagate_labels_across_hierarchy": "Propagate Labels Across Hierarchy",
          "segment_graph_felzenszwalb": "Segment Graph Felzenszwalb",
          "segment_multiresolution_hierarchical": "Segment Multiresolution Hierarchical",
          "segment_scale_parameter_optimizer": "Segment Scale Parameter Optimizer",
          "segment_slic_superpixels": "Segment Slic Superpixels",
          "segment_watershed_markers": "Segment Watershed Markers",
          "segments_merge_small_regions": "Segments Merge Small Regions",
          "segments_split_low_cohesion": "Segments Split Low Cohesion",
          "segments_to_polygons": "Segments To Polygons",
          "brdf_normalization": "Brdf Normalization",
          "correct_vignetting": "Correct Vignetting",
          "dark_object_subtraction": "Dark Object Subtraction",
          "dn_to_toa_reflectance": "Dn To Toa Reflectance",
          "terrain_corrected_optical_analytics": "Terrain Corrected Optical Analytics",
          "cloude_pottier_decomposition": "Cloude Pottier Decomposition",
          "enhanced_lee_filter": "Enhanced Lee Filter",
          "freeman_durden_decomposition": "Freeman Durden Decomposition",
          "frost_filter": "Frost Filter",
          "gamma_map_filter": "Gamma Map Filter",
          "h_alpha_wisart_classification": "H Alpha Wisart Classification",
          "kuan_filter": "Kuan Filter",
          "refined_lee_filter": "Refined Lee Filter",
          "wisart_iterative_clustering": "Wisart Iterative Clustering",
          "yamaguchi_4component_decomposition": "Yamaguchi 4component Decomposition",
          "continuum_removal": "Continuum Removal",
          "linear_spectral_unmixing": "Linear Spectral Unmixing",
          "minimum_noise_fraction": "Minimum Noise Fraction",
          "spectral_angle_mapper": "Spectral Angle Mapper",
          "spectral_library_matching": "Spectral Library Matching",
          "land_surface_temperature_single_channel": "Land Surface Temperature Single Channel",
          "land_surface_temperature_split_window": "Land Surface Temperature Split Window",
          "ndvi_based_emissivity": "Ndvi Based Emissivity",
          "assess_route": "Assess Route",
          "breakline_mapping": "Breakline Mapping",
          "convergence_index": "Convergence Index",
          "dem_void_filling": "Dem Void Filling",
          "deviation_from_mean_elevation": "Deviation From Mean Elevation",
          "difference_from_mean_elevation": "Difference From Mean Elevation",
          "directional_relief": "Directional Relief",
          "elev_above_pit": "Elev Above Pit",
          "elev_above_pit_dist": "Elev Above Pit Dist",
          "elevation_percentile": "Elevation Percentile",
          "embankment_mapping": "Embankment Mapping",
          "exposure_towards_wind_flux": "Exposure Towards Wind Flux",
          "feature_preserving_smoothing": "Feature Preserving Smoothing",
          "feature_preserving_smoothing_multiscale": "Feature Preserving Smoothing Multiscale",
          "fetch_analysis": "Fetch Analysis",
          "fill_missing_data": "Fill Missing Data",
          "find_ridges": "Find Ridges",
          "hillshade": "Hillshade",
          "hypsometrically_tinted_hillshade": "Hypsometrically Tinted Hillshade",
          "local_hypsometric_analysis": "Local Hypsometric Analysis",
          "low_points_on_headwater_divides": "Low Points On Headwater Divides",
          "map_off_terrain_objects": "Map Off Terrain Objects",
          "max_downslope_elev_change": "Max Downslope Elev Change",
          "max_upslope_elev_change": "Max Upslope Elev Change",
          "min_downslope_elev_change": "Min Downslope Elev Change",
          "multidirectional_hillshade": "Multidirectional Hillshade",
          "num_downslope_neighbours": "Num Downslope Neighbours",
          "num_upslope_neighbours": "Num Upslope Neighbours",
          "profile": "Profile",
          "remove_off_terrain_objects": "Remove Off Terrain Objects",
          "ridge_and_valley_vectors": "Ridge And Valley Vectors",
          "slope_vs_aspect_plot": "Slope Vs Aspect Plot",
          "slope_vs_elev_plot": "Slope Vs Elev Plot",
          "smooth_vegetation_residual": "Smooth Vegetation Residual",
          "surface_area_ratio": "Surface Area Ratio",
          "topographic_hachures": "Topographic Hachures",
          "accumulation_curvature": "Accumulation Curvature",
          "aspect": "Aspect",
          "casorati_curvature": "Casorati Curvature",
          "curvedness": "Curvedness",
          "difference_curvature": "Difference Curvature",
          "gaussian_curvature": "Gaussian Curvature",
          "generating_function": "Generating Function",
          "horizontal_excess_curvature": "Horizontal Excess Curvature",
          "maximal_curvature": "Maximal Curvature",
          "mean_curvature": "Mean Curvature",
          "minimal_curvature": "Minimal Curvature",
          "plan_curvature": "Plan Curvature",
          "principal_curvature_direction": "Principal Curvature Direction",
          "profile_curvature": "Profile Curvature",
          "relative_aspect": "Relative Aspect",
          "ring_curvature": "Ring Curvature",
          "rotor": "Rotor",
          "shape_index": "Shape Index",
          "slope": "Slope",
          "tangential_curvature": "Tangential Curvature",
          "total_curvature": "Total Curvature",
          "unsphericity": "Unsphericity",
          "vertical_excess_curvature": "Vertical Excess Curvature",
          "elev_relative_to_min_max": "Elev Relative To Min Max",
          "geomorphons": "Geomorphons",
          "hypsometric_analysis": "Hypsometric Analysis",
          "multiscale_topographic_position_class": "Multiscale Topographic Position Class",
          "pennock_landform_classification": "Pennock Landform Classification",
          "percent_elev_range": "Percent Elev Range",
          "relative_topographic_position": "Relative Topographic Position",
          "max_anisotropy_dev": "Max Anisotropy Dev",
          "max_anisotropy_dev_signature": "Max Anisotropy Dev Signature",
          "max_difference_from_mean": "Max Difference From Mean",
          "max_elev_dev_signature": "Max Elev Dev Signature",
          "max_elevation_deviation": "Max Elevation Deviation",
          "multiscale_curvatures": "Multiscale Curvatures",
          "multiscale_elevated_index": "Multiscale Elevated Index",
          "multiscale_elevation_percentile": "Multiscale Elevation Percentile",
          "multiscale_low_lying_index": "Multiscale Low Lying Index",
          "multiscale_roughness": "Multiscale Roughness",
          "multiscale_roughness_signature": "Multiscale Roughness Signature",
          "multiscale_std_dev_normals": "Multiscale Std Dev Normals",
          "multiscale_std_dev_normals_signature": "Multiscale Std Dev Normals Signature",
          "multiscale_topographic_position_image": "Multiscale Topographic Position Image",
          "topographic_position_animation": "Topographic Position Animation",
          "average_normal_vector_angular_deviation": "Average Normal Vector Angular Deviation",
          "circular_variance_of_aspect": "Circular Variance Of Aspect",
          "edge_density": "Edge Density",
          "ruggedness_index": "Ruggedness Index",
          "spherical_std_dev_of_normals": "Spherical Std Dev Of Normals",
          "standard_deviation_of_slope": "Standard Deviation Of Slope",
          "average_horizon_distance": "Average Horizon Distance",
          "horizon_angle": "Horizon Angle",
          "horizon_area": "Horizon Area",
          "openness": "Openness",
          "shadow_animation": "Shadow Animation",
          "shadow_image": "Shadow Image",
          "sky_view_factor": "Sky View Factor",
          "skyline_analysis": "Skyline Analysis",
          "time_in_daylight": "Time In Daylight",
          "viewshed": "Viewshed",
          "visibility_index": "Visibility Index",
          "topo_render": "Topo Render",
          "add_surface_information": "Add Surface Information",
          "add_z_information": "Add Z Information",
          "adjust_3d_z": "Adjust 3D Z",
          "adjust_stream_to_raster": "Adjust Stream To Raster",
          "aggregate_points": "Aggregate Points",
          "aggregate_polygons": "Aggregate Polygons",
          "align_features": "Align Features",
          "apportion_polygon": "Apportion Polygon",
          "areal_interpolation": "Areal Interpolation",
          "assign_projection_vector": "Assign Projection Vector",
          "attribute_uncertainty": "Attribute Uncertainty",
          "bivariate_spatial_association": "Bivariate Spatial Association",
          "buffer_3d": "Buffer 3D",
          "build_balanced_zones": "Build Balanced Zones",
          "build_seamlines": "Build Seamlines",
          "calculate_adjacent_fields": "Calculate Adjacent Fields",
          "calculate_central_meridian_and_parallels": "Calculate Central Meridian And Parallels",
          "calculate_composite_index": "Calculate Composite Index",
          "calculate_distance_band": "Calculate Distance Band",
          "calculate_end_time": "Calculate End Time",
          "calculate_grid_convergence_angle": "Calculate Grid Convergence Angle",
          "calculate_missing_z_values": "Calculate Missing Z Values",
          "calculate_motion_statistics": "Calculate Motion Statistics",
          "calculate_polygon_main_angle": "Calculate Polygon Main Angle",
          "calculate_rates": "Calculate Rates",
          "calculate_transformation_errors": "Calculate Transformation Errors",
          "calculate_utm_zone": "Calculate UTM Zone",
          "cartogram": "Cartogram",
          "causal_inference_analysis": "Causal Inference Analysis",
          "cell_records_to_sectors": "Cell Records To Sectors",
          "central_feature": "Central Feature / Linear Directional Mean",
          "change_point_detection": "Change Point Detection",
          "collapse_dual_lines_to_centerline": "Collapse Dual Lines To Centerline",
          "collapse_hydro_polygon": "Collapse Hydro Polygon",
          "collapse_road_detail": "Collapse Road Detail",
          "collect_events": "Collect Events",
          "colocation_analysis": "Colocation Analysis",
          "color_polygons": "Color Polygons",
          "compare_spatial_weights": "Compare Spatial Weights",
          "compute_accuracy_for_object_detection": "Compute Accuracy For Object Detection",
          "construct_sight_lines": "Construct Sight Lines",
          "contiguous_cartogram": "Contiguous Cartogram",
          "contour_list": "Contour List",
          "convert_coordinate_notation": "Convert Coordinate Notation",
          "cost_connectivity": "Cost Connectivity",
          "count_overlapping_features": "Count Overlapping Features",
          "create_accuracy_assessment_points": "Create Accuracy Assessment Points",
          "create_cartographic_partitions": "Create Cartographic Partitions",
          "create_overpass": "Create Overpass",
          "create_routes": "Create Routes",
          "create_spatial_sampling_locations": "Create Spatial Sampling Locations",
          "create_spatially_balanced_points": "Create Spatially Balanced Points",
          "create_underpass": "Create Underpass",
          "cul_de_sac_masks": "Cul-De-Sac Masks",
          "delineate_built_up_areas": "Delineate Built-Up Areas",
          "dendrogram": "Dendrogram",
          "densify_sampling_network": "Densify Sampling Network",
          "detect_bright_ocean_objects": "Detect Bright Ocean Objects",
          "detect_dark_ocean_areas": "Detect Dark Ocean Areas",
          "detect_feature_changes": "Detect Feature Changes",
          "detect_graphic_conflict": "Detect Graphic Conflict",
          "detect_incidents": "Detect Incidents",
          "dice": "Dice",
          "difference_3d": "Difference 3D",
          "dimension_reduction": "Dimension Reduction",
          "directional_distribution": "Directional Distribution",
          "directional_trend": "Directional Trend",
          "disperse_markers": "Disperse Markers",
          "dissolve_route_events": "Dissolve Route Events",
          "edgematch_features": "Edgematch Features",
          "eighty_twenty_analysis": "Eighty Twenty Analysis",
          "eliminate_polygon_part": "Eliminate Polygon Part",
          "eliminate_polygons": "Eliminate Polygons",
          "emerging_hot_spot_analysis": "Emerging Hot Spot Analysis",
          "enclose_multipatch": "Enclose Multipatch",
          "estimate_time_to_event": "Estimate Time To Event",
          "evaluate_bin_sizes": "Evaluate Bin Sizes",
          "evaluate_variable_influence": "Evaluate Variable Influence",
          "exploratory_interpolation": "Exploratory Interpolation",
          "exploratory_regression": "Exploratory Regression",
          "extract_locations_from_text": "Extract Locations From Text",
          "extract_water_sar": "Extract Water (SAR)",
          "extrude_between": "Extrude Between",
          "feature_outline_masks": "Feature Outline Masks",
          "feature_to_line": "Feature To Line",
          "feature_vertices_to_points": "Feature Vertices To Points",
          "features_to_kml": "Features To KML",
          "fence_diagram": "Fence Diagram",
          "fill_missing_values": "Fill Missing Values",
          "find_dwell_locations": "Find Dwell Locations",
          "find_identical": "Find Identical",
          "find_meeting_locations": "Find Meeting Locations",
          "find_space_time_matches": "Find Space Time Matches",
          "flip_line": "Flip Line",
          "forest_based_forecast": "Forest-based Forecast",
          "generalized_linear_regression": "Generalized Linear Regression",
          "generate_breach_lines": "Generate Breach Lines",
          "generate_near_table": "Generate Near Table",
          "generate_network_swm": "Generate Network SWM",
          "generate_od_links": "Generate Origin-Destination Links",
          "generate_points_along_3d_lines": "Generate Points Along 3D Lines",
          "generate_spatial_weights_matrix": "Generate Spatial Weights Matrix",
          "generate_subset_polygons": "Generate Subset Polygons",
          "generate_transects_along_lines": "Generate Transects Along Lines",
          "geodetic_densify": "Geodetic Densify",
          "geographically_weighted_regression": "Geographically Weighted Regression",
          "geotagged_photos_to_points": "GeoTagged Photos To Points",
          "graphic_buffer": "Graphic Buffer",
          "grid_index_features": "Grid Index Features",
          "group_by_proximity": "Group By Proximity",
          "hdbscan": "HDBSCAN Clustering",
          "getis_ord_general_g": "High/Low Clustering (Getis-Ord General G)",
          "hot_spot_analysis_comparison": "Hot Spot Analysis Comparison",
          "identify_narrow_polygons": "Identify Narrow Polygons",
          "incremental_spatial_autocorrelation": "Incremental Spatial Autocorrelation",
          "inside_3d": "Inside 3D",
          "integrate": "Integrate",
          "interpolate_shape": "Interpolate Shape",
          "intersect_3d": "Intersect 3D",
          "intersect_3d_line_with_surface": "Intersect 3D Line With Surface",
          "intersecting_layers_masks": "Intersecting Layers Masks",
          "intervisibility": "Intervisibility",
          "is_closed_3d": "Is Closed 3D",
          "line_of_sight": "Line Of Sight",
          "local_bivariate_relationships": "Local Bivariate Relationships",
          "local_outlier_analysis": "Local Outlier Analysis",
          "locate_lines_along_routes": "Locate Lines Along Routes",
          "median_center": "Median Center",
          "merge_divided_roads": "Merge Divided Roads",
          "merge_lines_by_pseudo_node": "Merge Lines By Pseudo Node",
          "minimum_bounding_volume": "Minimum Bounding Volume",
          "multipatch_footprint": "Multipatch Footprint",
          "multipatch_to_mesh": "Multipatch To Mesh",
          "multiple_ring_buffer": "Multiple Ring Buffer",
          "mgwr": "Multiscale Geographically Weighted Regression",
          "multivariate_clustering": "Multivariate Clustering",
          "near_3d": "Near 3D",
          "neighborhood_summary_statistics": "Neighborhood Summary Statistics",
          "non_maximum_suppression": "Non Maximum Suppression",
          "optics_clustering": "OPTICS Clustering",
          "optimal_corridor_connections": "Optimal Corridor Connections",
          "optimal_path_as_line": "Optimal Path As Line",
          "optimized_hot_spot_analysis": "Optimized Hot Spot Analysis",
          "optimized_outlier_analysis": "Optimized Outlier Analysis",
          "pairwise_comparison_weights": "Pairwise Comparison Weights",
          "pivot_table": "Pivot Table",
          "points_to_line": "Points To Line",
          "points_to_path": "Points To Path",
          "polygon_neighbors": "Polygon Neighbors",
          "polygon_volume": "Polygon Volume",
          "propagate_displacement": "Propagate Displacement",
          "raster_domain": "Raster Domain",
          "raster_to_weighted_points": "Raster To Weighted Points",
          "reclassify_field": "Reclassify Field",
          "reconstruct_tracks": "Reconstruct Tracks",
          "reduce_point_density": "Reduce Point Density",
          "regularize_adjacent_building_footprint": "Regularize Adjacent Building Footprint",
          "regularize_building_footprints": "Regularize Building Footprints",
          "remove_overlap_multiple": "Remove Overlap (Multiple)",
          "render_vector_png": "Render Vector to PNG",
          "repair_geometry": "Repair Geometry",
          "resolve_building_conflicts": "Resolve Building Conflicts",
          "resolve_road_conflicts": "Resolve Road Conflicts",
          "ripleys_k": "Ripley's K",
          "rubbersheet_features": "Rubbersheet Features",
          "semivariogram_sensitivity": "Semivariogram Sensitivity",
          "similarity_search": "Similarity Search",
          "simplify_3d_line": "Simplify 3D Line",
          "simplify_building": "Simplify Building",
          "simplify_by_circular_arcs": "Simplify By Circular Arcs",
          "simplify_by_tangent_segments": "Simplify By Tangent Segments",
          "simplify_shared_edges": "Simplify Shared Edges",
          "smooth_natural_features": "Smooth Natural Features",
          "smooth_shared_edges": "Smooth Shared Edges",
          "snap_tracks": "Snap Tracks",
          "sort_features": "Sort Features",
          "spatial_eigenvector_filtering": "Spatial Eigenvector Filtering (MESF)",
          "spatial_outlier_detection": "Spatial Outlier Detection",
          "spatially_constrained_multivariate_clustering": "Spatially Constrained Multivariate Clustering",
          "split_by_attributes": "Split By Attributes",
          "split_by_features": "Split By Features",
          "split_line_at_point": "Split Line At Point",
          "stack_profile": "Stack Profile",
          "strip_map_index_features": "Strip Map Index Features",
          "subdivide_polygon": "Subdivide Polygon",
          "subset_features": "Subset Features",
          "summarize_nearby": "Summarize Nearby",
          "summarize_percent_change": "Summarize Percent Change",
          "summarize_within": "Summarize Within",
          "summary_statistics": "Summary Statistics",
          "sun_shadow_volume": "Sun Shadow Volume",
          "surface_difference": "Surface Difference",
          "table_to_geometry": "Table To Geometry",
          "tabulate_intersection": "Tabulate Intersection",
          "thin_road_network": "Thin Road Network",
          "tile_grid_polygons": "Tile Grid Polygons",
          "time_series_clustering": "Time Series Clustering",
          "time_series_forecast": "Time Series Forecast",
          "time_series_smoothing": "Time Series Smoothing",
          "trace_proximity_events": "Trace Proximity Events",
          "transform_features": "Transform Features",
          "transform_fields": "Transform Fields",
          "transform_route_events": "Transform Route Events",
          "transpose_fields": "Transpose Fields",
          "trim_line": "Trim Line",
          "union_3d": "Union 3D",
          "validate_flow_direction": "Validate Flow Direction",
          "voxel_isosurface": "Voxel Isosurface",
          "buffer_vector": "Buffer Vector",
          "directional_variogram": "Directional Variogram Analysis",
          "estimate_variogram": "Estimate Variogram",
          "fit_variogram": "Fit Variogram Model",
          "add_field": "Add Field",
          "add_geometry_attributes": "Add Geometry Attributes",
          "attribute_correlation": "Attribute Correlation",
          "attribute_histogram": "Attribute Histogram",
          "attribute_scattergram": "Attribute Scattergram",
          "delete_field": "Delete Field",
          "extract_by_attribute": "Extract By Attribute",
          "field_calculator": "Field Calculator",
          "filter_vector_features_by_area": "Filter Vector Features By Area",
          "list_unique_values": "List Unique Values",
          "rename_field": "Rename Field",
          "centroid_vector": "Centroid Vector",
          "concave_hull": "Concave Hull",
          "densify_features": "Densify Features",
          "eliminate_coincident_points": "Eliminate Coincident Points",
          "extend_vector_lines": "Extend Vector Lines",
          "merge_line_segments": "Merge Line Segments",
          "minimum_bounding_box": "Minimum Bounding Box",
          "minimum_bounding_circle": "Minimum Bounding Circle",
          "minimum_bounding_envelope": "Minimum Bounding Envelope",
          "minimum_convex_hull": "Minimum Convex Hull",
          "polygonize": "Polygonize",
          "representative_point_vector": "Representative Point Vector",
          "simplify_features": "Simplify Features",
          "smooth_vectors": "Smooth Vectors",
          "snap_endnodes": "Snap Endnodes",
          "split_vector_lines": "Split Vector Lines",
          "split_with_lines": "Split With Lines",
          "locate_points_along_routes": "Locate Points Along Routes",
          "points_along_lines": "Points Along Lines",
          "route_calibrate": "Route Calibrate",
          "route_event_lines_from_layer": "Route Event Lines From Layer",
          "route_event_lines_from_table": "Route Event Lines From Table",
          "route_event_merge": "Route Event Merge",
          "route_event_overlay": "Route Event Overlay",
          "route_event_points_from_layer": "Route Event Points From Layer",
          "route_event_points_from_table": "Route Event Points From Table",
          "route_event_split": "Route Event Split",
          "route_measure_qa": "Route Measure Qa",
          "route_recalibrate": "Route Recalibrate",
          "snap_events_to_routes": "Snap Events To Routes",
          "download_osm_vector": "Download Osm Vector",
          "clip": "Clip",
          "difference": "Difference",
          "dissolve": "Dissolve",
          "erase": "Erase",
          "identity": "Identity",
          "intersect": "Intersect",
          "line_intersections": "Line Intersections",
          "line_polygon_clip": "Line Polygon Clip",
          "near": "Near",
          "select_by_location": "Select By Location",
          "spatial_join": "Spatial Join",
          "symmetrical_difference": "Symmetrical Difference",
          "union": "Union",
          "update": "Update",
          "construct_vector_tin": "Construct Vector Tin",
          "contours_from_points": "Contours From Points",
          "contours_from_raster": "Contours From Raster",
          "extract_nodes": "Extract Nodes",
          "extract_raster_values_at_points": "Extract Raster Values At Points",
          "find_lowest_or_highest_points": "Find Lowest Or Highest Points",
          "hexagonal_grid_from_raster_base": "Hexagonal Grid From Raster Base",
          "hexagonal_grid_from_vector_base": "Hexagonal Grid From Vector Base",
          "layer_footprint_raster": "Layer Footprint Raster",
          "layer_footprint_vector": "Layer Footprint Vector",
          "medoid": "Medoid",
          "random_points_in_polygon": "Random Points In Polygon",
          "rectangular_grid_from_raster_base": "Rectangular Grid From Raster Base",
          "rectangular_grid_from_vector_base": "Rectangular Grid From Vector Base",
          "vector_hex_binning": "Vector Hex Binning",
          "voronoi_diagram": "Voronoi Diagram",
          "compactness_ratio": "Compactness Ratio",
          "deviation_from_regional_direction": "Deviation From Regional Direction",
          "elongation_ratio": "Elongation Ratio",
          "hole_proportion": "Hole Proportion",
          "linearity_index": "Linearity Index",
          "narrowness_index_vector": "Narrowness Index Vector",
          "patch_orientation": "Patch Orientation",
          "perimeter_area_ratio": "Perimeter Area Ratio",
          "polygon_area": "Polygon Area",
          "polygon_long_axis": "Polygon Long Axis",
          "polygon_perimeter": "Polygon Perimeter",
          "polygon_short_axis": "Polygon Short Axis",
          "related_circumscribing_circle": "Related Circumscribing Circle",
          "shape_complexity_index_vector": "Shape Complexity Index Vector",
          "envelope_test": "Envelope Test",
          "getis_ord_gi_star": "Getis Ord Gi Star",
          "global_morans_i": "Global Morans I",
          "hotspot_vs_process": "Hotspot Vs Process",
          "inhomogeneous_baseline": "Inhomogeneous Baseline",
          "local_morans_i_lisa": "Local Morans I Lisa",
          "nearest_neighbour_index": "Nearest Neighbour Index",
          "point_pattern_envelope": "Point Pattern Envelope",
          "point_process_residuals": "Point Process Residuals",
          "point_process_residuals_comparison": "Point Process Residuals Comparison",
          "quadrat_count_test": "Quadrat Count Test",
          "ripleys_k_function": "Ripleys K Function",
          "ripleys_k_test": "Ripleys K Test",
          "spatial_error_regression": "Spatial Error Regression",
          "spatial_lag_regression": "Spatial Lag Regression"
        },
        "menuSubcategory": {
          "geolibre_wasm": "GeoLibre (WASM)",
          "geometry_topology": "Geometry & Topology",
          "raster_vector_conversion": "Raster/Vector Conversion",
          "vector_table_i_o": "Vector & Table I/O",
          "depressions_storage": "Depressions & Storage",
          "flow_routing": "Flow Routing",
          "hydrologic_indices": "Hydrologic Indices",
          "streams_longitudinal_analysis": "Streams - Longitudinal Analysis",
          "streams_network_extraction": "Streams - Network Extraction",
          "streams_ordering_metrics": "Streams - Ordering Metrics",
          "watersheds_basins": "Watersheds & Basins",
          "analysis_metrics": "Analysis Metrics",
          "filtering_classification": "Filtering & Classification",
          "i_o_management": "I/O & Management",
          "interpolation_gridding": "Interpolation & Gridding",
          "network_analysis": "Network Analysis",
          "general": "General",
          "distance_cost": "Distance & Cost",
          "local_neighborhood": "Local Neighborhood",
          "overlay_math": "Overlay Math",
          "reclassify_mask": "Reclassify & Mask",
          "spatial_statistics": "Spatial Statistics",
          "change_detection": "Change Detection",
          "classification": "Classification",
          "edge_feature_detection": "Edge & Feature Detection",
          "enhancement_contrast": "Enhancement & Contrast",
          "filters": "Filters",
          "obia": "OBIA",
          "radiometric_correction": "Radiometric Correction",
          "sar": "SAR",
          "spectral_analytics": "Spectral Analytics",
          "thermal_emissivity": "Thermal & Emissivity",
          "derivatives": "Derivatives",
          "landform_indices": "Landform Indices",
          "multiscale_signatures": "Multiscale Signatures",
          "roughness_texture": "Roughness & Texture",
          "visibility": "Visibility",
          "workflow_products": "Workflow Products",
          "attribute_analysis": "Attribute Analysis",
          "geometry_processing": "Geometry Processing",
          "linear_referencing": "Linear Referencing",
          "online_data": "Online Data",
          "overlay_analysis": "Overlay Analysis",
          "sampling_gridding": "Sampling & Gridding",
          "shape_metrics": "Shape Metrics"
        }
      }
    }
  }
}
