From 48f68a6ac0b0d3c2cdd578111dedd158906dc60b Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Mon, 9 Mar 2026 12:09:16 -0700 Subject: [PATCH 1/8] Add request header annotation --- temporal/api/protometa/v1/annotations.proto | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 temporal/api/protometa/v1/annotations.proto diff --git a/temporal/api/protometa/v1/annotations.proto b/temporal/api/protometa/v1/annotations.proto new file mode 100644 index 000000000..483ffd676 --- /dev/null +++ b/temporal/api/protometa/v1/annotations.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package temporal.api.protometa.v1; + +option go_package = "go.temporal.io/api/protometa/v1;protometa"; +option java_package = "io.temporal.api.protometa.v1"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; +option ruby_package = "Temporalio::Api::Protometa::V1"; +option csharp_namespace = "Temporalio.Api.Protometa.V1"; + +import "google/protobuf/descriptor.proto"; + +// RequestHeaderAnnotation allows specifying that field values from a request +// should be propagated as outbound headers. +// +// The value field supports template interpolation where field paths enclosed +// in braces will be replaced with the actual field values from the request. +// For example: +// value: "{workflow_execution.workflow_id}" +// value: "workflow-{workflow_execution.workflow_id}" +// value: "{namespace}/{workflow_execution.workflow_id}" +message RequestHeaderAnnotation { + // The name of the header to set (e.g., "temporal-resource-id") + string header = 1; + + // A template string that may contain field paths in braces. + // Field paths use dot notation to traverse nested messages. + // Example: "{workflow_execution.workflow_id}" + string value = 2; +} + +// Extension to add request-header annotations to RPC methods. +// Multiple headers can be set by repeating this option. +extend google.protobuf.MethodOptions { + repeated RequestHeaderAnnotation request_header = 7234001; +} \ No newline at end of file From aafde54259feb89193fbc7f29611a78508139a21 Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Tue, 10 Mar 2026 11:10:23 -0700 Subject: [PATCH 2/8] Add comprehensive request header annotations for multi-cell routing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements request header routing annotations and resource_id fields for: - Workflow execution APIs (17 endpoints) - workflow:workflow_id - Workflow task APIs (4 endpoints) - workflow:workflow_id - Activity APIs (12 endpoints) - workflow:workflow_id or activity:activity_id - Schedule APIs (6 endpoints) - schedule:schedule_id - Batch operation APIs (3 endpoints) - batch:job_id - Nexus task APIs (2 endpoints) - routingId:server_routing_id - Task queue APIs (3 endpoints) - taskqueue:task_queue_name - Worker APIs (4 endpoints) - worker:worker_grouping_key - Worker deployment APIs (8 endpoints) - deployment:deployment_name Added resource_id fields to request messages that use task tokens and server_routing_id field to PollNexusTaskQueueResponse for proper routing. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../workflowservice/v1/request_response.proto | 31 +++ temporal/api/workflowservice/v1/service.proto | 243 +++++++++++++++++- 2 files changed, 272 insertions(+), 2 deletions(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 4bf3272c6..279e9eced 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -357,6 +357,8 @@ message RespondWorkflowTaskCompletedRequest { // Responses to the `queries` field in the task being responded to map query_results = 8; string namespace = 9; + // Resource ID for routing. Contains the workflow ID from the original task. + string resource_id = 18; // Version info of the worker who processed this task. This message's `build_id` field should // always be set by SDKs. Workers opting into versioning will also set the `use_versioning` // field to true. See message docstrings for more. @@ -418,6 +420,8 @@ message RespondWorkflowTaskFailedRequest { // Worker process' unique binary id string binary_checksum = 5 [deprecated = true]; string namespace = 6; + // Resource ID for routing. Contains the workflow ID from the original task. + string resource_id = 11; // Protocol messages piggybacking on a WFT as a transport repeated temporal.api.protocol.v1.Message messages = 7; // Version info of the worker who processed this task. This message's `build_id` field should @@ -522,6 +526,8 @@ message RecordActivityTaskHeartbeatRequest { // The identity of the worker/client string identity = 3; string namespace = 4; + // Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. + string resource_id = 5; } message RecordActivityTaskHeartbeatResponse { @@ -551,6 +557,8 @@ message RecordActivityTaskHeartbeatByIdRequest { temporal.api.common.v1.Payloads details = 5; // The identity of the worker/client string identity = 6; + // Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. + string resource_id = 7; } message RecordActivityTaskHeartbeatByIdResponse { @@ -574,6 +582,8 @@ message RespondActivityTaskCompletedRequest { // The identity of the worker/client string identity = 3; string namespace = 4; + // Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. + string resource_id = 8; // Version info of the worker who processed this task. This message's `build_id` field should // always be set by SDKs. Workers opting into versioning will also set the `use_versioning` // field to true. See message docstrings for more. @@ -604,6 +614,8 @@ message RespondActivityTaskCompletedByIdRequest { temporal.api.common.v1.Payloads result = 5; // The identity of the worker/client string identity = 6; + // Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. + string resource_id = 7; } message RespondActivityTaskCompletedByIdResponse { @@ -617,6 +629,8 @@ message RespondActivityTaskFailedRequest { // The identity of the worker/client string identity = 3; string namespace = 4; + // Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. + string resource_id = 9; // Additional details to be stored as last activity heartbeat temporal.api.common.v1.Payloads last_heartbeat_details = 5; // Version info of the worker who processed this task. This message's `build_id` field should @@ -654,6 +668,8 @@ message RespondActivityTaskFailedByIdRequest { string identity = 6; // Additional details to be stored as last activity heartbeat temporal.api.common.v1.Payloads last_heartbeat_details = 7; + // Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. + string resource_id = 8; } message RespondActivityTaskFailedByIdResponse { @@ -670,6 +686,8 @@ message RespondActivityTaskCanceledRequest { // The identity of the worker/client string identity = 3; string namespace = 4; + // Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. + string resource_id = 8; // Version info of the worker who processed this task. This message's `build_id` field should // always be set by SDKs. Workers opting into versioning will also set the `use_versioning` // field to true. See message docstrings for more. @@ -702,6 +720,8 @@ message RespondActivityTaskCanceledByIdRequest { string identity = 6; // Worker deployment options that user has set in the worker. temporal.api.deployment.v1.WorkerDeploymentOptions deployment_options = 7; + // Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. + string resource_id = 8; } message RespondActivityTaskCanceledByIdResponse { @@ -1000,6 +1020,8 @@ message RespondQueryTaskCompletedRequest { string error_message = 4; reserved 5; string namespace = 6; + // Resource ID for routing. Contains the workflow ID from the original task. + string resource_id = 9; // The full reason for this query failure. This field is newer than `error_message` and can be // encoded by the SDK's failure converter to support E2E encryption of messages and stack // traces. @@ -1872,6 +1894,8 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; + // Server routing ID for task routing. Workers should pass this value in response requests. + string server_routing_id = 4; } message RespondNexusTaskCompletedRequest { @@ -1882,6 +1906,8 @@ message RespondNexusTaskCompletedRequest { bytes task_token = 3; // Embedded response to be translated into a frontend response. temporal.api.nexus.v1.Response response = 4; + // Server routing ID for task routing. Should match the value from PollNexusTaskQueueResponse. + string server_routing_id = 5; } message RespondNexusTaskCompletedResponse { @@ -1897,6 +1923,8 @@ message RespondNexusTaskFailedRequest { temporal.api.nexus.v1.HandlerError error = 4 [deprecated = true]; // The error the handler failed with. Must contain a NexusHandlerFailureInfo object. temporal.api.failure.v1.Failure failure = 5; + // Server routing ID for task routing. Should match the value from PollNexusTaskQueueResponse. + string server_routing_id = 6; } message RespondNexusTaskFailedResponse { @@ -1915,6 +1943,9 @@ message ExecuteMultiOperationRequest { // Note that additional operation-specific restrictions have to be considered. repeated Operation operations = 2; + // Resource ID for routing. Should match operations[0].start_workflow.workflow_id + string resource_id = 3; + message Operation { oneof operation { // Additional restrictions: diff --git a/temporal/api/workflowservice/v1/service.proto b/temporal/api/workflowservice/v1/service.proto index c67a2717b..3ffcace2e 100644 --- a/temporal/api/workflowservice/v1/service.proto +++ b/temporal/api/workflowservice/v1/service.proto @@ -12,6 +12,7 @@ option csharp_namespace = "Temporalio.Api.WorkflowService.V1"; import "temporal/api/workflowservice/v1/request_response.proto"; import "google/api/annotations.proto"; +import "temporal/api/protometa/v1/annotations.proto"; // WorkflowService API defines how Temporal SDKs and other clients interact with the Temporal server // to create and interact with workflows and activities. @@ -101,6 +102,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_id}" + }; } // ExecuteMultiOperation executes multiple operations within a single workflow. @@ -114,6 +119,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: To be exposed over HTTP in the future. --) rpc ExecuteMultiOperation (ExecuteMultiOperationRequest) returns (ExecuteMultiOperationResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{resource_id}" + }; } // GetWorkflowExecutionHistory returns the history of specified workflow execution. Fails with @@ -125,6 +134,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // GetWorkflowExecutionHistoryReverse returns the history of specified workflow execution in reverse @@ -137,6 +150,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // PollWorkflowTaskQueue is called by workers to make progress on workflows. @@ -161,6 +178,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondWorkflowTaskCompleted (RespondWorkflowTaskCompletedRequest) returns (RespondWorkflowTaskCompletedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{resource_id}" + }; } // RespondWorkflowTaskFailed is called by workers to indicate the processing of a workflow task @@ -176,6 +197,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondWorkflowTaskFailed (RespondWorkflowTaskFailedRequest) returns (RespondWorkflowTaskFailedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{resource_id}" + }; } // PollActivityTaskQueue is called by workers to process activity tasks from a specific task @@ -218,6 +243,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // See `RecordActivityTaskHeartbeat`. This version allows clients to record heartbeats by @@ -245,6 +274,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // RespondActivityTaskCompleted is called by workers when they successfully complete an activity @@ -262,6 +295,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // See `RespondActivityTaskCompleted`. This version allows clients to record completions by @@ -289,6 +326,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // RespondActivityTaskFailed is called by workers when processing an activity task fails. @@ -305,6 +346,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // See `RecordActivityTaskFailed`. This version allows clients to record failures by @@ -332,6 +377,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // RespondActivityTaskFailed is called by workers when processing an activity task fails. @@ -348,6 +397,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // See `RespondActivityTaskCanceled`. This version allows clients to record failures by @@ -375,6 +428,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "{resource_id}" + }; } // RequestCancelWorkflowExecution is called by workers when they want to request cancellation of @@ -392,6 +449,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // SignalWorkflowExecution is used to send a signal to a running workflow execution. @@ -407,6 +468,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // SignalWithStartWorkflowExecution is used to ensure a signal is sent to a workflow, even if @@ -430,6 +495,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_id}" + }; } // ResetWorkflowExecution will reset an existing workflow execution to a specified @@ -446,6 +515,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // TerminateWorkflowExecution terminates an existing workflow execution by recording a @@ -460,6 +533,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // DeleteWorkflowExecution asynchronously deletes a specific Workflow Execution (when @@ -469,7 +546,12 @@ service WorkflowService { // // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: Workflow deletion not exposed to HTTP, users should use cancel or terminate. --) - rpc DeleteWorkflowExecution (DeleteWorkflowExecutionRequest) returns (DeleteWorkflowExecutionResponse) {} + rpc DeleteWorkflowExecution (DeleteWorkflowExecutionRequest) returns (DeleteWorkflowExecutionResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; + } // ListOpenWorkflowExecutions is a visibility API to list the open executions in a specific namespace. // @@ -536,7 +618,12 @@ service WorkflowService { // // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) - rpc RespondQueryTaskCompleted (RespondQueryTaskCompletedRequest) returns (RespondQueryTaskCompletedResponse) {} + rpc RespondQueryTaskCompleted (RespondQueryTaskCompletedRequest) returns (RespondQueryTaskCompletedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{resource_id}" + }; + } // ResetStickyTaskQueue resets the sticky task queue related information in the mutable state of // a given workflow. This is prudent for workers to perform if a workflow has been paged out of @@ -553,6 +640,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc ResetStickyTaskQueue (ResetStickyTaskQueueRequest) returns (ResetStickyTaskQueueResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // ShutdownWorker is used to indicate that the given sticky task @@ -581,6 +672,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // DescribeWorkflowExecution returns information about the specified workflow execution. @@ -591,6 +686,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // DescribeTaskQueue returns the following information about the target task queue, broken down by Build ID: @@ -604,6 +703,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/task-queues/{task_queue.name}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "taskqueue:{task_queue.name}" + }; } // GetClusterInfo returns information about temporal cluster @@ -629,6 +732,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose this low-level API to HTTP. --) rpc ListTaskQueuePartitions(ListTaskQueuePartitionsRequest) returns (ListTaskQueuePartitionsResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "taskqueue:{task_queue.name}" + }; } // Creates a new schedule. @@ -641,6 +748,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "schedule:{schedule_id}" + }; } // Returns the schedule description and current state of an existing schedule. @@ -651,6 +762,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/schedules/{schedule_id}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "schedule:{schedule_id}" + }; } // Changes the configuration or state of an existing schedule. @@ -663,6 +778,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "schedule:{schedule_id}" + }; } // Makes a specific change to a schedule or triggers an immediate action. @@ -675,6 +794,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "schedule:{schedule_id}" + }; } // Lists matching times within a range. @@ -685,6 +808,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "schedule:{schedule_id}" + }; } // Deletes a schedule, removing it from the system. @@ -695,6 +822,10 @@ service WorkflowService { delete: "/api/v1/namespaces/{namespace}/schedules/{schedule_id}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "schedule:{schedule_id}" + }; } // List all schedules in a namespace. @@ -828,6 +959,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_version.deployment_name}" + }; } // Lists worker deployments in the namespace. Optionally can filter based on deployment series @@ -899,6 +1034,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_name}" + }; } // Describes a Worker Deployment. @@ -910,6 +1049,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_name}" + }; } // Deletes records of (an old) Deployment. A deployment can only be deleted if @@ -922,6 +1065,10 @@ service WorkflowService { delete: "/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_name}" + }; } @@ -939,6 +1086,10 @@ service WorkflowService { delete: "/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_version.deployment_name}" + }; } // Set/unset the Ramping Version of a Worker Deployment and its ramp percentage. Can be used for @@ -953,6 +1104,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_name}" + }; } // Lists all Worker Deployments that are tracked in the Namespace. @@ -977,6 +1132,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_version.deployment_name}" + }; } // Set/unset the ManagerIdentity of a Worker Deployment. @@ -990,6 +1149,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "deployment:{deployment_name}" + }; } // Invokes the specified Update function on user Workflow code. @@ -1002,6 +1165,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // Polls a Workflow Execution for the outcome of a Workflow Update @@ -1012,6 +1179,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We don't expose update polling API to HTTP in favor of a potential future non-blocking form. --) rpc PollWorkflowExecutionUpdate(PollWorkflowExecutionUpdateRequest) returns (PollWorkflowExecutionUpdateResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // StartBatchOperation starts a new batch operation @@ -1024,6 +1195,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "batch:{job_id}" + }; } // StopBatchOperation stops a batch operation @@ -1036,6 +1211,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "batch:{job_id}" + }; } // DescribeBatchOperation returns the information about a batch operation @@ -1046,6 +1225,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/batch-operations/{job_id}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "batch:{job_id}" + }; } // ListBatchOperations returns a list of batch operations @@ -1068,12 +1251,20 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondNexusTaskCompleted(RespondNexusTaskCompletedRequest) returns (RespondNexusTaskCompletedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "routingId:{server_routing_id}" + }; } // RespondNexusTaskFailed is called by workers to fail Nexus tasks received via PollNexusTaskQueue. // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondNexusTaskFailed(RespondNexusTaskFailedRequest) returns (RespondNexusTaskFailedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "routingId:{server_routing_id}" + }; } // UpdateActivityOptions is called by the client to update the options of an activity by its ID or type. @@ -1089,6 +1280,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // UpdateWorkflowExecutionOptions partially updates the WorkflowExecutionOptions of an existing workflow execution. @@ -1101,6 +1296,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_execution.workflow_id}" + }; } // PauseActivity pauses the execution of an activity specified by its ID or type. @@ -1130,6 +1329,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // UnpauseActivity unpauses the execution of an activity specified by its ID or type. @@ -1156,6 +1359,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // ResetActivity resets the execution of an activity specified by its ID or type. @@ -1186,6 +1393,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{execution.workflow_id}" + }; } // Create a new workflow rule. The rules are used to control the workflow execution. @@ -1260,6 +1471,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "worker:{worker_grouping_key}" + }; }; // ListWorkers is a visibility API to list worker status information in a specific namespace. @@ -1285,6 +1500,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "taskqueue:{task_queue}" + }; } // FetchWorkerConfig returns the worker configuration for a specific worker. @@ -1297,6 +1516,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "worker:{worker_grouping_key}" + }; } // UpdateWorkerConfig updates the worker configuration of one or more workers. @@ -1311,6 +1534,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "worker:{worker_grouping_key}" + }; } // DescribeWorker returns information about the specified worker. @@ -1321,6 +1548,10 @@ service WorkflowService { get: "/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "worker:{worker_instance_key}" + }; } // Note: This is an experimental API and the behavior may change in a future release. @@ -1340,6 +1571,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_id}" + }; } // Note: This is an experimental API and the behavior may change in a future release. @@ -1356,6 +1591,10 @@ service WorkflowService { body: "*" } }; + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "workflow:{workflow_id}" + }; } // StartActivityExecution starts a new activity execution. From 0a964b828b49be831c876cfff880206f5bbb39fe Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Tue, 10 Mar 2026 11:54:45 -0700 Subject: [PATCH 3/8] Fix PollWorkflowExecutionUpdate annotation field path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrected the field path from {workflow_execution.workflow_id} to {update_ref.workflow_execution.workflow_id} since PollWorkflowExecutionUpdateRequest uses update_ref field that contains the WorkflowExecution. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- temporal/api/workflowservice/v1/service.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporal/api/workflowservice/v1/service.proto b/temporal/api/workflowservice/v1/service.proto index 3ffcace2e..161866307 100644 --- a/temporal/api/workflowservice/v1/service.proto +++ b/temporal/api/workflowservice/v1/service.proto @@ -1181,7 +1181,7 @@ service WorkflowService { rpc PollWorkflowExecutionUpdate(PollWorkflowExecutionUpdateRequest) returns (PollWorkflowExecutionUpdateResponse) { option (temporal.api.protometa.v1.request_header) = { header: "temporal-resource-id" - value: "workflow:{workflow_execution.workflow_id}" + value: "workflow:{update_ref.workflow_execution.workflow_id}" }; } From 04d2d22940e5e170e35bfb94987dd0e3c8a309b8 Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Tue, 10 Mar 2026 12:06:13 -0700 Subject: [PATCH 4/8] Add resource_id fields to worker API requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added resource_id fields to RecordWorkerHeartbeatRequest, FetchWorkerConfigRequest, and UpdateWorkerConfigRequest for proper routing support. Updated annotations to use {resource_id} instead of {worker_grouping_key} for consistency. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- temporal/api/workflowservice/v1/request_response.proto | 7 +++++++ temporal/api/workflowservice/v1/service.proto | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 279e9eced..c58463ec8 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -2580,6 +2580,9 @@ message RecordWorkerHeartbeatRequest { string identity = 2; repeated temporal.api.worker.v1.WorkerHeartbeat worker_heartbeat = 3; + + // Resource ID for routing. Contains the worker grouping key. + string resource_id = 4; } message RecordWorkerHeartbeatResponse { @@ -2663,6 +2666,8 @@ message FetchWorkerConfigRequest { // Defines which workers should receive this command. // only single worker is supported at this time. temporal.api.common.v1.WorkerSelector selector = 6; + // Resource ID for routing. Contains the worker grouping key. + string resource_id = 7; } message FetchWorkerConfigResponse { @@ -2689,6 +2694,8 @@ message UpdateWorkerConfigRequest { // Defines which workers should receive this command. temporal.api.common.v1.WorkerSelector selector = 6; + // Resource ID for routing. Contains the worker grouping key. + string resource_id = 7; } message UpdateWorkerConfigResponse { diff --git a/temporal/api/workflowservice/v1/service.proto b/temporal/api/workflowservice/v1/service.proto index 161866307..bed35a152 100644 --- a/temporal/api/workflowservice/v1/service.proto +++ b/temporal/api/workflowservice/v1/service.proto @@ -1473,7 +1473,7 @@ service WorkflowService { }; option (temporal.api.protometa.v1.request_header) = { header: "temporal-resource-id" - value: "worker:{worker_grouping_key}" + value: "worker:{resource_id}" }; }; @@ -1518,7 +1518,7 @@ service WorkflowService { }; option (temporal.api.protometa.v1.request_header) = { header: "temporal-resource-id" - value: "worker:{worker_grouping_key}" + value: "worker:{resource_id}" }; } @@ -1536,7 +1536,7 @@ service WorkflowService { }; option (temporal.api.protometa.v1.request_header) = { header: "temporal-resource-id" - value: "worker:{worker_grouping_key}" + value: "worker:{resource_id}" }; } From 3a100d1cf3f5edec0d3af4ffaee19da4e0ac16d1 Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Tue, 10 Mar 2026 12:10:33 -0700 Subject: [PATCH 5/8] Standardize Nexus APIs to use resource_id field pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed server_routing_id fields to resource_id in Nexus request/response messages and updated annotations to use {resource_id} for consistency with other APIs. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../api/workflowservice/v1/request_response.proto | 12 ++++++------ temporal/api/workflowservice/v1/service.proto | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index c58463ec8..5cbb231e8 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -1894,8 +1894,8 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; - // Server routing ID for task routing. Workers should pass this value in response requests. - string server_routing_id = 4; + // Resource ID for routing. Workers should pass this value in response requests. + string resource_id = 4; } message RespondNexusTaskCompletedRequest { @@ -1906,8 +1906,8 @@ message RespondNexusTaskCompletedRequest { bytes task_token = 3; // Embedded response to be translated into a frontend response. temporal.api.nexus.v1.Response response = 4; - // Server routing ID for task routing. Should match the value from PollNexusTaskQueueResponse. - string server_routing_id = 5; + // Resource ID for routing. Should match the value from PollNexusTaskQueueResponse. + string resource_id = 5; } message RespondNexusTaskCompletedResponse { @@ -1923,8 +1923,8 @@ message RespondNexusTaskFailedRequest { temporal.api.nexus.v1.HandlerError error = 4 [deprecated = true]; // The error the handler failed with. Must contain a NexusHandlerFailureInfo object. temporal.api.failure.v1.Failure failure = 5; - // Server routing ID for task routing. Should match the value from PollNexusTaskQueueResponse. - string server_routing_id = 6; + // Resource ID for routing. Should match the value from PollNexusTaskQueueResponse. + string resource_id = 6; } message RespondNexusTaskFailedResponse { diff --git a/temporal/api/workflowservice/v1/service.proto b/temporal/api/workflowservice/v1/service.proto index bed35a152..c4f2fd9c7 100644 --- a/temporal/api/workflowservice/v1/service.proto +++ b/temporal/api/workflowservice/v1/service.proto @@ -1253,7 +1253,7 @@ service WorkflowService { rpc RespondNexusTaskCompleted(RespondNexusTaskCompletedRequest) returns (RespondNexusTaskCompletedResponse) { option (temporal.api.protometa.v1.request_header) = { header: "temporal-resource-id" - value: "routingId:{server_routing_id}" + value: "routingId:{resource_id}" }; } @@ -1263,7 +1263,7 @@ service WorkflowService { rpc RespondNexusTaskFailed(RespondNexusTaskFailedRequest) returns (RespondNexusTaskFailedResponse) { option (temporal.api.protometa.v1.request_header) = { header: "temporal-resource-id" - value: "routingId:{server_routing_id}" + value: "routingId:{resource_id}" }; } From eae3883d00b9b2243df97227172b12946e26aae6 Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Wed, 11 Mar 2026 14:16:52 -0700 Subject: [PATCH 6/8] Update openapi --- openapi/openapiv2.json | 32 ++++++++++++++++++++++++++++++++ openapi/openapiv3.yaml | 24 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index fee4fdf00..877361b87 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -9296,6 +9296,10 @@ "identity": { "type": "string", "title": "The identity of the worker/client" + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the workflow ID or activity ID for standalone activities." } } }, @@ -9313,6 +9317,10 @@ "identity": { "type": "string", "title": "The identity of the worker/client" + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains \"workflow:workflow_id\" or \"activity:activity_id\" for standalone activities." } } }, @@ -9498,6 +9506,10 @@ "type": "string", "title": "The identity of the worker/client" }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the workflow ID or activity ID for standalone activities." + }, "workerVersion": { "$ref": "#/definitions/v1WorkerVersionStamp", "description": "Version info of the worker who processed this task. This message's `build_id` field should\nalways be set by SDKs. Workers opting into versioning will also set the `use_versioning`\nfield to true. See message docstrings for more.\nDeprecated. Use `deployment_options` instead." @@ -9530,6 +9542,10 @@ "deploymentOptions": { "$ref": "#/definitions/v1WorkerDeploymentOptions", "description": "Worker deployment options that user has set in the worker." + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains \"workflow:workflow_id\" or \"activity:activity_id\" for standalone activities." } } }, @@ -9549,6 +9565,10 @@ "type": "string", "title": "The identity of the worker/client" }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the workflow ID or activity ID for standalone activities." + }, "workerVersion": { "$ref": "#/definitions/v1WorkerVersionStamp", "description": "Version info of the worker who processed this task. This message's `build_id` field should\nalways be set by SDKs. Workers opting into versioning will also set the `use_versioning`\nfield to true. See message docstrings for more.\nDeprecated. Use `deployment_options` instead." @@ -9577,6 +9597,10 @@ "identity": { "type": "string", "title": "The identity of the worker/client" + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains \"workflow:workflow_id\" or \"activity:activity_id\" for standalone activities." } } }, @@ -9596,6 +9620,10 @@ "type": "string", "title": "The identity of the worker/client" }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the workflow ID or activity ID for standalone activities." + }, "lastHeartbeatDetails": { "$ref": "#/definitions/v1Payloads", "title": "Additional details to be stored as last activity heartbeat" @@ -9632,6 +9660,10 @@ "lastHeartbeatDetails": { "$ref": "#/definitions/v1Payloads", "title": "Additional details to be stored as last activity heartbeat" + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains \"workflow:workflow_id\" or \"activity:activity_id\" for standalone activities." } } }, diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index e0283c283..4ee162e10 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -11907,6 +11907,9 @@ components: identity: type: string description: The identity of the worker/client + resourceId: + type: string + description: Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. RecordActivityTaskHeartbeatByIdResponse: type: object properties: @@ -11939,6 +11942,9 @@ components: description: The identity of the worker/client namespace: type: string + resourceId: + type: string + description: Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. RecordActivityTaskHeartbeatResponse: type: object properties: @@ -12457,6 +12463,9 @@ components: allOf: - $ref: '#/components/schemas/WorkerDeploymentOptions' description: Worker deployment options that user has set in the worker. + resourceId: + type: string + description: Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. RespondActivityTaskCanceledByIdResponse: type: object properties: {} @@ -12476,6 +12485,9 @@ components: description: The identity of the worker/client namespace: type: string + resourceId: + type: string + description: Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. workerVersion: allOf: - $ref: '#/components/schemas/WorkerVersionStamp' @@ -12522,6 +12534,9 @@ components: identity: type: string description: The identity of the worker/client + resourceId: + type: string + description: Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. RespondActivityTaskCompletedByIdResponse: type: object properties: {} @@ -12541,6 +12556,9 @@ components: description: The identity of the worker/client namespace: type: string + resourceId: + type: string + description: Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. workerVersion: allOf: - $ref: '#/components/schemas/WorkerVersionStamp' @@ -12591,6 +12609,9 @@ components: allOf: - $ref: '#/components/schemas/Payloads' description: Additional details to be stored as last activity heartbeat + resourceId: + type: string + description: Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities. RespondActivityTaskFailedByIdResponse: type: object properties: @@ -12617,6 +12638,9 @@ components: description: The identity of the worker/client namespace: type: string + resourceId: + type: string + description: Resource ID for routing. Contains the workflow ID or activity ID for standalone activities. lastHeartbeatDetails: allOf: - $ref: '#/components/schemas/Payloads' From c2b0bd683a81cd5881519bdea85322aa8c4d7caf Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Thu, 12 Mar 2026 13:27:47 -0700 Subject: [PATCH 7/8] Remove resource_id from RespondQueryTaskCompleted, RespondNexusTask* methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the resource_id field and request header annotations from: - RespondQueryTaskCompleted - RespondNexusTaskCompleted - RespondNexusTaskFailed - PollNexusTaskQueueResponse 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../api/workflowservice/v1/request_response.proto | 8 -------- temporal/api/workflowservice/v1/service.proto | 15 +-------------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 5cbb231e8..6df9eae71 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -1020,8 +1020,6 @@ message RespondQueryTaskCompletedRequest { string error_message = 4; reserved 5; string namespace = 6; - // Resource ID for routing. Contains the workflow ID from the original task. - string resource_id = 9; // The full reason for this query failure. This field is newer than `error_message` and can be // encoded by the SDK's failure converter to support E2E encryption of messages and stack // traces. @@ -1894,8 +1892,6 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; - // Resource ID for routing. Workers should pass this value in response requests. - string resource_id = 4; } message RespondNexusTaskCompletedRequest { @@ -1906,8 +1902,6 @@ message RespondNexusTaskCompletedRequest { bytes task_token = 3; // Embedded response to be translated into a frontend response. temporal.api.nexus.v1.Response response = 4; - // Resource ID for routing. Should match the value from PollNexusTaskQueueResponse. - string resource_id = 5; } message RespondNexusTaskCompletedResponse { @@ -1923,8 +1917,6 @@ message RespondNexusTaskFailedRequest { temporal.api.nexus.v1.HandlerError error = 4 [deprecated = true]; // The error the handler failed with. Must contain a NexusHandlerFailureInfo object. temporal.api.failure.v1.Failure failure = 5; - // Resource ID for routing. Should match the value from PollNexusTaskQueueResponse. - string resource_id = 6; } message RespondNexusTaskFailedResponse { diff --git a/temporal/api/workflowservice/v1/service.proto b/temporal/api/workflowservice/v1/service.proto index c4f2fd9c7..cbd71e2ba 100644 --- a/temporal/api/workflowservice/v1/service.proto +++ b/temporal/api/workflowservice/v1/service.proto @@ -618,12 +618,7 @@ service WorkflowService { // // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) - rpc RespondQueryTaskCompleted (RespondQueryTaskCompletedRequest) returns (RespondQueryTaskCompletedResponse) { - option (temporal.api.protometa.v1.request_header) = { - header: "temporal-resource-id" - value: "workflow:{resource_id}" - }; - } + rpc RespondQueryTaskCompleted (RespondQueryTaskCompletedRequest) returns (RespondQueryTaskCompletedResponse) {} // ResetStickyTaskQueue resets the sticky task queue related information in the mutable state of // a given workflow. This is prudent for workers to perform if a workflow has been paged out of @@ -1251,20 +1246,12 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondNexusTaskCompleted(RespondNexusTaskCompletedRequest) returns (RespondNexusTaskCompletedResponse) { - option (temporal.api.protometa.v1.request_header) = { - header: "temporal-resource-id" - value: "routingId:{resource_id}" - }; } // RespondNexusTaskFailed is called by workers to fail Nexus tasks received via PollNexusTaskQueue. // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondNexusTaskFailed(RespondNexusTaskFailedRequest) returns (RespondNexusTaskFailedResponse) { - option (temporal.api.protometa.v1.request_header) = { - header: "temporal-resource-id" - value: "routingId:{resource_id}" - }; } // UpdateActivityOptions is called by the client to update the options of an activity by its ID or type. From 53c5957fa15b7836b5dd01f97069a083b16dc86b Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Thu, 12 Mar 2026 16:03:21 -0700 Subject: [PATCH 8/8] Update openapi files --- openapi/openapiv2.json | 12 ++++++++++++ openapi/openapiv3.yaml | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index 4c81e35b9..411449204 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -9183,6 +9183,10 @@ "selector": { "$ref": "#/definitions/v1WorkerSelector", "description": "Defines which workers should receive this command.\nonly single worker is supported at this time." + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the worker grouping key." } } }, @@ -9337,6 +9341,10 @@ "type": "object", "$ref": "#/definitions/v1WorkerHeartbeat" } + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the worker grouping key." } } }, @@ -10448,6 +10456,10 @@ "selector": { "$ref": "#/definitions/v1WorkerSelector", "description": "Defines which workers should receive this command." + }, + "resourceId": { + "type": "string", + "description": "Resource ID for routing. Contains the worker grouping key." } } }, diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index 333e65fec..9e6d7662d 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -9843,6 +9843,9 @@ components: description: |- Defines which workers should receive this command. only single worker is supported at this time. + resourceId: + type: string + description: Resource ID for routing. Contains the worker grouping key. FetchWorkerConfigResponse: type: object properties: @@ -11978,6 +11981,9 @@ components: type: array items: $ref: '#/components/schemas/WorkerHeartbeat' + resourceId: + type: string + description: Resource ID for routing. Contains the worker grouping key. RecordWorkerHeartbeatResponse: type: object properties: {} @@ -14857,6 +14863,9 @@ components: allOf: - $ref: '#/components/schemas/WorkerSelector' description: Defines which workers should receive this command. + resourceId: + type: string + description: Resource ID for routing. Contains the worker grouping key. UpdateWorkerConfigResponse: type: object properties: