Skip to content

v2.5.0

Choose a tag to compare

@github-actions github-actions released this 22 Jun 00:16

Highlights

  • Added Gaussian Splat support (SPLAT, SPZ formats) with automatic detection, indexing, build pipeline, LOD streaming, and a full browser viewer with camera management and tour mode.
  • Added a Processing Platform task substrate with a dedicated REST API (/orgs/{org}/ds/{ds}/tasks) supporting async long-running jobs, progress tracking, and downloadable artifacts.
  • Added LDAP/Active Directory authentication with optional group-based admin role mapping.

Added / Changed

  • Added GaussianSplat entry type (type ID 15) with detection for .splat, .spz, and .ply files; build pipeline produces model.spz, model.rad (LOD), and georef.json artifacts.
  • Added GET /tasks/tools, POST /tasks, GET /tasks, GET /tasks/{id}, GET /tasks/{id}/log, GET /tasks/{id}/result, DELETE /tasks/{id}, POST /tasks/{id}/retry endpoints for the Processing Platform task substrate.
  • Added POST /tasks/clear endpoint to permanently remove concluded task records and their artifacts for a dataset.
  • Added admin task dashboard at GET /sys/tasks for listing tasks across all users and datasets.
  • Added bulk-download tool: packages a file selection or whole dataset as a ZIP archive produced asynchronously, served via GET /tasks/{id}/result.
  • Added raster-export tool: exports a raster entry to GeoTIFF with visualization params using a block-windowed, memory-bounded implementation with incremental progress and cooperative cancellation.
  • Added align-raster tool: aligns a source GeoTIFF to a reference GeoTIFF; result is indexed in the dataset in place.
  • Added merge-multispectral tool as a heavy task with progress reporting.
  • Added rescan-index tool: rescans the dataset index, clears build cache, invalidates caches, and rebuilds derivatives as a heavy task.
  • Added archive-extract tool: extracts compressed archives (ZIP, tar.gz, 7z, RAR, and more) into the dataset index, with quota, disk-space, and zip-slip guards.
  • Added photogrammetry tool: submits images to a configured NodeODM node, streams progress, and returns the result bundle as a downloadable artifact.
  • Added build tool wrapping the existing build pipeline, enabling it to participate in the task substrate with progress logging and deduplication.
  • Added LDAP authentication provider (LdapLoginManager) with service-account search, direct-bind (UserDnFormat) path, admin group mapping, LDAP injection protection, and LdapHealthCheck.
  • Added ProcessingPlatformSettings configuration section with concurrency limits, quotas, deduplication, artifact TTL, async download threshold, and NodeODM node list.
  • Added IArchiveExtractor / IArchiveReadSession ports and SharpCompressArchiveExtractor adapter (zip, tar.gz, tgz, 7z, RAR, single-file gz/bz2/xz).
  • Added ZipArchiveBuilder service shared by the legacy streaming download path and the bulk-download tool.
  • Added LogRingBuffer ring buffer for per-task log tail persistence to JobIndex.LogTailJson.
  • Added TaskTools and TaskStates catalogs to the /system/features response so clients derive the task state machine and tool metadata from the server.
  • Added BulkDownloadAsyncThresholdBytes to /system/features so clients can route bulk downloads to the async path.
  • Added id field to UserDetailDto.
  • Added ValidateAlignRaster API endpoint (POST /objects/align/validate).
  • Added DDBAlignRaster, DDBValidateAlignRaster, and DDBExportRaster2 (block-windowed with progress callback) P/Invoke bindings; added DdbCanceledException for cooperative cancellation.
  • Added HangfireJobRetentionDays setting (default 2 days) to reduce Hangfire table churn; failed jobs are kept for diagnostics regardless.
  • Added BuildLogCaptureFilter Hangfire server filter to persist build logs to JobIndex.LogTailJson.
  • Added BuildRetrySchedulerFilter: event-driven replacement for per-minute build polling; self-schedules retries with exponential backoff after a build completes.
  • Changed SyncJobIndexStatesCron default from */5 * * * * to 0 * * * * (hourly).
  • Changed ProcessPendingBuildsCron default from * * * * * (every minute) to 0 */6 * * * (every 6 hours); day-to-day retries are now event-driven.
  • Extended JobIndex model with Processing Platform columns: ToolId, ToolVersion, ProgressPercent, PhaseMessage, ArtifactSizeBytes, ArtifactSha256, ErrorType, RequestHash, ParentJobId, WorkflowExecutionId, LogTailJson, ProgressUpdatedAtUtc.
  • Extended IndexPayload with ToolId, ToolVersion, RequestHash, ParentJobId, and WorkflowExecutionId fields (backward-compatible defaults).
  • Added Hangfire tasks queue; server now processes both tasks and default queues.
  • Updated UserManagement feature flag to derive from the active identity provider's capabilities rather than ExternalAuthUrl.
  • Skipped local default admin creation when an external identity provider (LDAP or Remote) is active.
  • Updated Docker image to Node.js 24 and added libldap2, libldap-common, libsasl2-2 runtime dependencies.
  • [CI] Updated CI workflows and Dockerfile from Node.js 22 to Node.js 24.
  • Updated CONTRIBUTING.md with full development setup, architecture overview, coding standards, testing guidelines, and PR guide.
  • [DroneDB] Updated to v1.10.0 (from v1.8.1).
  • [Hub] Added full Gaussian Splat viewer with LOD streaming, camera presets, auto-orbit, tour mode, view settings, and keyboard/touch navigation controls.
  • [Hub] Added georaster split-view comparison with draggable handles for side-by-side multi-raster visualization.
  • [Hub] Added per-raster opacity sliders and layer reorder panel for multi-raster map views.
  • [Hub] Added measurement groups with custom names and colors for organizing map measurements.
  • [Hub] Added Align GeoTIFF dialog with reference picker, alignment mode, output name validation, and live task progress tracking.
  • [Hub] Added Extract Archive dialog with destination folder picker, overwrite control, archive deletion option, and progress bar.
  • [Hub] Added admin task dashboard for listing and managing tasks across all users and datasets.
  • [Hub] Added per-dataset task history panel with task log viewer and reusable task table component.
  • [Hub] Added build confirmation dialog when rebuilding already-ready files, warning about side effects.
  • [Hub] Added archive file type icons and improved treeview selection visibility.
  • [Hub] Switched plant health GeoTIFF export to use the async raster-export heavy task instead of synchronous generation.
  • [Hub] Added ErrorBoundary component and VirtualScroller component for improved error handling and performance.
  • [Hub] Added ESLint and Vitest for code quality and unit testing.
  • [Hub] Updated Potree library with DXF generation and height profile fixes.

Fixed

  • Fixed DownloadLimitMiddleware to also enforce the per-user download concurrency limit on GET /tasks/{id}/result (async artifact download).
  • Fixed UserManagerHealthCheck to skip the local user-manager test when an external identity provider is active.
  • Fixed JobExpirationAttribute to preserve failed job records at global retention and only expire short-lived success records.
  • [DroneDB] Fixed potential crash in Registry::downloadDdb caused by an uninitialized length variable when extracting the ZIP response payload.
  • [DroneDB] Fixed STAC thumbnail MIME type incorrectly reported as image/jpeg for WebP thumbnails; corrected to image/webp.
  • [Hub] Fixed treeview selection visibility for selected items in the file explorer.
  • [Hub] Fixed Potree height profile rendering issue.
  • [Hub] Fixed DXF generation in Potree point cloud viewer.

Breaking changes

  • JobIndex schema extended with new Processing Platform columns. A database migration (AddProcessingPlatformColumns) is required before starting v2.5.0.
    • Migration: run dotnet ef database update against the appropriate migration project (Registry.Web.Data.SqliteMigrations or Registry.Web.Data.MySqlMigrations) before launching the new version.
  • Hangfire job expiration behavior changed: failed jobs are now kept at the global retention policy (HangfireJobRetentionDays, default 2 days) and are no longer expired quickly. Succeeded jobs are expired aggressively to reduce database churn.
    • Migration: no action required, but expect the number of retained failed job records to increase. Adjust HangfireJobRetentionDays in appsettings.json if needed.
  • Recurring job schedules changed: SyncJobIndexStatesCron now defaults to hourly (was every 5 minutes) and ProcessPendingBuildsCron defaults to every 6 hours (was every minute). Deployments with explicit cron values in appsettings.json are unaffected.
    • Migration: remove or update SyncJobIndexStatesCron and ProcessPendingBuildsCron from appsettings.json to adopt the new defaults.

Merged PRs

Full Changelog: v2.4.0...v2.5.0