From 2017771db02236d7cded336dbddfaf28b2c1fa8b Mon Sep 17 00:00:00 2001 From: Lukas Bindreiter Date: Mon, 12 Oct 2026 15:11:59 +0200 Subject: [PATCH] Workflow presentation classes and additonal STAC metadata --- apis/datasets/stac/v1/asset.proto | 2 ++ apis/datasets/stac/v1/asset_metadata.proto | 23 ++++++++++++++++- apis/workflows/v1/storage_location.proto | 23 +++++++++++++++-- apis/workflows/v1/workflows.proto | 29 ++++++++++++++++++++-- 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/apis/datasets/stac/v1/asset.proto b/apis/datasets/stac/v1/asset.proto index bf7a008..976f33a 100644 --- a/apis/datasets/stac/v1/asset.proto +++ b/apis/datasets/stac/v1/asset.proto @@ -131,6 +131,7 @@ message Band { repeated ClassificationClass classes = 8; // SAR 1.3.2 permits frequency, center-frequency, and bandwidth metadata on Band Objects. SARProperties sar = 9; + repeated ClassificationBitField bitfields = 10; } // Asset contains the canonical STAC 1.1 Asset Object fields used by the supported Items. Inheritable metadata applies @@ -172,6 +173,7 @@ message Asset { SARProperties sar = 21; SatelliteProperties satellite = 22; ProductProperties product = 23; + repeated ClassificationBitField bitfields = 24; } // Assets contains the shared profile tables and assets of one STAC Item. Asset locations reference access_profiles by diff --git a/apis/datasets/stac/v1/asset_metadata.proto b/apis/datasets/stac/v1/asset_metadata.proto index 6989598..d1e7334 100644 --- a/apis/datasets/stac/v1/asset_metadata.proto +++ b/apis/datasets/stac/v1/asset_metadata.proto @@ -66,7 +66,7 @@ message RasterProperties { double spatial_resolution = 4 [features.field_presence = EXPLICIT]; } -// ClassificationClass contains all Classification 2.0 class fields. Bit-field definitions are intentionally deferred. +// ClassificationClass contains all Classification 2.0 class fields. message ClassificationClass { int64 value = 1 [ features.field_presence = EXPLICIT, @@ -94,6 +94,27 @@ message ClassificationClass { uint64 count = 8 [features.field_presence = EXPLICIT]; } +// ClassificationBitField describes classes encoded in a contiguous range of bits, following Classification 2.0. +// Offset zero denotes the least significant bit; class values apply after extracting this bit range. +message ClassificationBitField { + uint32 offset = 1 [ + features.field_presence = EXPLICIT, + (buf.validate.field).required = true + ]; + uint32 length = 2 [ + features.field_presence = EXPLICIT, + (buf.validate.field).required = true, + (buf.validate.field).uint32.gte = 1 + ]; + repeated ClassificationClass classes = 3 [(buf.validate.field).repeated.min_items = 1]; + string name = 4 [ + features.field_presence = EXPLICIT, + (buf.validate.field).string.pattern = "^[0-9A-Za-z-_]+$" + ]; + string description = 5 [features.field_presence = EXPLICIT]; + repeated string roles = 6 [(buf.validate.field).repeated.unique = true]; +} + // Projection contains the Projection 2.0 fields used by the supported Items. message Projection { // Explicit presence distinguishes a missing code from a value. A STAC JSON null is treated as missing. diff --git a/apis/workflows/v1/storage_location.proto b/apis/workflows/v1/storage_location.proto index d4cb5c4..18c562b 100644 --- a/apis/workflows/v1/storage_location.proto +++ b/apis/workflows/v1/storage_location.proto @@ -157,11 +157,12 @@ enum StorageSubscriptionType { // Azure Event Grid delivering notifications from an Azure Blob Storage container. STORAGE_SUBSCRIPTION_TYPE_AZURE_EVENT_GRID = 3; // Storage notifications sent by the Tilebox CLI. Typically for local storage locations. No delivery configuration is required. - // POST JSON containing object_path and optional RFC3339 event_time to /v1/storage-notifications/tilebox-cli/. + // Use StorageLocationService.NotifyObjectCreated, or POST JSON containing object_path and optional RFC3339 event_time + // to /v1/storage-notifications/tilebox-cli/. // object_path is relative to the directory root and uses slash separators, without dot or parent components. // Authenticate with Authorization: Bearer ; the organization must manage the storage location. // The standalone on-orbit runtime does not require authentication. - // Successful deliveries return 204 after jobs and history are committed. Retries can create duplicate jobs. + // Successful HTTP deliveries return 204 after jobs and history are committed. Retries can create duplicate jobs. STORAGE_SUBSCRIPTION_TYPE_TILEBOX_CLI = 4; } @@ -274,6 +275,20 @@ message ListStorageSubscriptionsRequest { tilebox.v1.ID storage_location_id = 1 [(buf.validate.field).required = true]; } +// NotifyObjectCreatedRequest sends a file-ready event to a TILEBOX_CLI subscription. +message NotifyObjectCreatedRequest { + // Subscription through which to deliver the event. It must have type TILEBOX_CLI. + tilebox.v1.ID storage_subscription_id = 1 [(buf.validate.field).required = true]; + // Path relative to the location root, using slash separators without dot or parent components. Must not include + // a leading slash. For example, "subdir/file.txt" or "file.txt". + string object_path = 2 [(buf.validate.field).string = { + min_bytes: 1 + max_bytes: 4096 + }]; + // Time the object was observed, absent when unavailable. + google.protobuf.Timestamp event_time = 3; +} + // StorageSubscriptions contains notification subscriptions for a storage location. message StorageSubscriptions { repeated StorageSubscription subscriptions = 1; @@ -360,4 +375,8 @@ service StorageLocationService { rpc DeleteStorageSubscription(tilebox.v1.ID) returns (google.protobuf.Empty); // ListStorageSubscriptionEvents lists received object notifications and the jobs they triggered. rpc ListStorageSubscriptionEvents(ListStorageSubscriptionEventsRequest) returns (StorageSubscriptionEvents); + + // NotifyObjectCreated delivers a storage event of a local storage location. Typically called by the Tilebox CLI + // during the `tilebox storage-location watch` command. The subscription must be of type TILEBOX_CLI. + rpc NotifyObjectCreated(NotifyObjectCreatedRequest) returns (google.protobuf.Empty); } diff --git a/apis/workflows/v1/workflows.proto b/apis/workflows/v1/workflows.proto index 2b4e668..b14d448 100644 --- a/apis/workflows/v1/workflows.proto +++ b/apis/workflows/v1/workflows.proto @@ -198,8 +198,18 @@ message ListPublicWorkflowsResponse { // CreateWorkflowRequest creates a new workflow, with a name and an optional description. // A workflow slug will be generated based on the name. message CreateWorkflowRequest { - string name = 1 [(buf.validate.field).string.min_len = 1]; - string description = 2; + string name = 1 [ + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 100 + ]; + // short text summary of the workflow to create + string summary = 3 [(buf.validate.field).string.max_len = 50000]; + + // optional longer description of the workflow to create, in markdown format + string description = 2 [ + features.field_presence = EXPLICIT, + (buf.validate.field).string.max_len = 1000000 + ]; } // Workflow represents a logical grouping for a set of tasks. It can have multiple releases, each comprising a different @@ -209,8 +219,23 @@ message Workflow { // The owner-local slug, or namespace:slug for workflows owned by another namespace. string slug = 2; string name = 3; + // short text summary of the workflow + string summary = 6; + // optional longer description of the workflow, in markdown format string description = 4; repeated WorkflowRelease releases = 5; + // additional presentation metadata for public workflows, to display in the public workflow gallery. + WorkflowPresentation presentation = 7; +} + +// WorkflowPresentation is an extended metadata message for a workflow, providing additional presentation properties +// for a public workflow. +message WorkflowPresentation { + string image_url = 1; + string image_alt = 2; + repeated string imagery_type = 3; // e.g. "optical", "radar", "hyperspectral", "thermal", "atmosphere" + repeated string use_case = 4; // e.g. "mosaic", "change-detection", "object-detection" + repeated string dataset_label = 5; // e.g. "Sentinel-2 L2A ยท 10 m" } // WorkflowRelease represents an immutable release of a workflow, which includes a set of tasks and an artifact.