hatchet-sdk 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c22db69846163b6dc74e019c6203f468bff28ff9892e66462d0b9d89a091411
4
- data.tar.gz: e547b5f3c1ec2c6e85a50dc7abad12764d072bfd1e5c128c283e8716f388138e
3
+ metadata.gz: ff2dd555f1014c00180a93c1aafae9460a8351f8c1886e95352509bca192d9d8
4
+ data.tar.gz: e29f29b01b65e6832d102677256a9611adcaad4a3292af670af8a21620b9f7ed
5
5
  SHA512:
6
- metadata.gz: 6631058a61424005ca3c1afc2fe3512d61214d00b54d6e7a91ce4ca93bf214da98c79cbf64c45beeaa5609e925b7b9d448c433b02090df427d77b8395fec2f5f
7
- data.tar.gz: 3ff1030bf8722a314c230515c8ef426a84c355bc6a7bebd9b000a16b2ec0a7d0ed7a67a5f1eef449624c4f56b156f85d6a02b86c9979db8ff2a3bce567111eb6
6
+ metadata.gz: e74daa0f99b13ab549bda5fed63a128ba790bb9f21f31b3b795724c62c9d392588d15bcdf13e6e93ba87a3161ad85c75794d1e2a2cca83f3341dcf598f79041e
7
+ data.tar.gz: cfb10290a951b5539e34b013a547648c3907a66e13186f81b76d9ec3c96f47b8d0520a5e3cad2b3c3a2bb8c09b4636e86a902a68851a2f05a7704840ec09774c
data/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to Hatchet's Ruby SDK will be documented in this changelog.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.0] - 2026-07-23
9
+
10
+ ### Changed
11
+
12
+ - Adds beta `batch_task` methods to both tasks and workflows, allowing for dynamic batching based on either time or batch size.
13
+
14
+
8
15
  ## [0.5.0] - 2026-07-22
9
16
 
10
17
  ### Added
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hatchet
4
+ # Configures a task as a batch task: concurrent runs are buffered and dispatched together
5
+ # as a single execution once max_size is reached, max_interval_ms elapses, or (if
6
+ # group_key is set) once group_max_runs concurrent batches per group are exceeded.
7
+ #
8
+ # When batch is set on a task, the task's block receives a single Hash argument mapping
9
+ # each buffered run's task-run external id to that run's input, instead of a single input
10
+ # value. Unless broadcast_output is true, the block must return a Hash with the exact same
11
+ # key set, mapping each id to that run's output.
12
+ #
13
+ # @example
14
+ # Hatchet::BatchTaskConfig.new(max_size: 3, max_interval_ms: 200, group_key: "input.group")
15
+ class BatchTaskConfig
16
+ # @return [Integer] Maximum number of items buffered before the batch is flushed
17
+ attr_reader :max_size
18
+
19
+ # @return [Integer, nil] Maximum time to wait before flushing a partially-filled batch, in milliseconds
20
+ attr_reader :max_interval_ms
21
+
22
+ # @return [String, nil] CEL expression evaluated against each item's input to partition items into independent batches
23
+ attr_reader :group_key
24
+
25
+ # @return [Integer, nil] Maximum number of concurrent batches per group
26
+ attr_reader :group_max_runs
27
+
28
+ # @return [Boolean] When true, the block returns a single value broadcast to every member of the batch
29
+ attr_reader :broadcast_output
30
+
31
+ # @param max_size [Integer] Maximum items per batch. Must be positive.
32
+ # @param max_interval_ms [Integer, nil] Time before batch flushes, in milliseconds. Must be positive when provided.
33
+ # @param group_key [String, nil] CEL expression to partition batches, e.g. "input.group"
34
+ # @param group_max_runs [Integer, nil] Concurrent batches per group. Must be positive when provided.
35
+ # @param broadcast_output [Boolean] Whether the block's return value is broadcast to every batch member
36
+ def initialize(max_size:, max_interval_ms: nil, group_key: nil, group_max_runs: nil, broadcast_output: false)
37
+ raise ArgumentError, "max_size must be positive" unless max_size.positive?
38
+ raise ArgumentError, "max_interval_ms must be positive when provided" if !max_interval_ms.nil? && !max_interval_ms.positive?
39
+ raise ArgumentError, "group_max_runs must be positive when provided" if !group_max_runs.nil? && !group_max_runs.positive?
40
+
41
+ @max_size = max_size
42
+ @max_interval_ms = max_interval_ms
43
+ @group_key = group_key
44
+ @group_max_runs = group_max_runs
45
+ @broadcast_output = broadcast_output
46
+ end
47
+
48
+ # @return [V1::TaskBatchConfig]
49
+ def to_proto
50
+ args = { batch_max_size: @max_size, broadcast_output: @broadcast_output }
51
+ args[:batch_max_interval_ms] = @max_interval_ms if @max_interval_ms
52
+ args[:batch_group_key] = @group_key if @group_key
53
+ args[:batch_group_max_runs] = @group_max_runs if @group_max_runs
54
+
55
+ ::V1::TaskBatchConfig.new(**args)
56
+ end
57
+ end
58
+ end
@@ -167,6 +167,48 @@ module Hatchet
167
167
  @stub.send_step_action_event(request, metadata: @config.auth_metadata)
168
168
  end
169
169
 
170
+ # Send a batch action event (completion/failure/started) covering one or more
171
+ # members of a batch task's execution back to the dispatcher.
172
+ #
173
+ # @param action [AssignedAction] The assigned START_BATCH action
174
+ # @param event_type [Symbol] Protobuf enum value (e.g., :STEP_EVENT_TYPE_COMPLETED)
175
+ # @param items [Array<Hash>] Per-member items, each with :task_run_external_id, and
176
+ # optionally :event_payload, :retry_count, :should_not_retry
177
+ # @return [ActionEventResponse]
178
+ def send_batch_action_event(action:, event_type:, items:)
179
+ ensure_connected!
180
+
181
+ now = Time.now
182
+ timestamp = Google::Protobuf::Timestamp.new(
183
+ seconds: now.to_i,
184
+ nanos: now.nsec,
185
+ )
186
+
187
+ item_protos = items.map do |item|
188
+ item_args = {
189
+ task_run_external_id: item[:task_run_external_id],
190
+ event_payload: item[:event_payload] || "{}",
191
+ }
192
+ item_args[:retry_count] = item[:retry_count] unless item[:retry_count].nil?
193
+ item_args[:should_not_retry] = item[:should_not_retry] unless item[:should_not_retry].nil?
194
+
195
+ ::BatchActionEventItem.new(**item_args)
196
+ end
197
+
198
+ event_args = {
199
+ worker_id: @worker_id || "",
200
+ job_id: action.job_id,
201
+ action_id: action.action_id,
202
+ event_timestamp: timestamp,
203
+ event_type: event_type,
204
+ items: item_protos,
205
+ }
206
+ event_args[:batch_id] = action.batchId if action.respond_to?(:batchId) && action.batchId && !action.batchId.empty?
207
+
208
+ request = ::BatchActionEvent.new(**event_args)
209
+ @stub.send_batch_action_event(request, metadata: @config.auth_metadata)
210
+ end
211
+
170
212
  # Refresh the timeout for a running task.
171
213
  #
172
214
  # @param step_run_id [String] The task run external ID
@@ -97,6 +97,7 @@ module HatchetSdkRest
97
97
  # @option opts [Integer] :offset The number to skip
98
98
  # @option opts [Integer] :limit The number to limit by
99
99
  # @option opts [Array<WorkerStatus>] :statuses Filter by worker status
100
+ # @option opts [Array<String>] :labels Filter by worker labels
100
101
  # @return [WorkerList]
101
102
  def worker_list(tenant, opts = {})
102
103
  data, _status_code, _headers = worker_list_with_http_info(tenant, opts)
@@ -110,6 +111,7 @@ module HatchetSdkRest
110
111
  # @option opts [Integer] :offset The number to skip
111
112
  # @option opts [Integer] :limit The number to limit by
112
113
  # @option opts [Array<WorkerStatus>] :statuses Filter by worker status
114
+ # @option opts [Array<String>] :labels Filter by worker labels
113
115
  # @return [Array<(WorkerList, Integer, Hash)>] WorkerList data, response status code and response headers
114
116
  def worker_list_with_http_info(tenant, opts = {})
115
117
  if @api_client.config.debugging
@@ -135,6 +137,7 @@ module HatchetSdkRest
135
137
  query_params[:'offset'] = opts[:'offset'] if !opts[:'offset'].nil?
136
138
  query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
137
139
  query_params[:'statuses'] = @api_client.build_collection_param(opts[:'statuses'], :multi) if !opts[:'statuses'].nil?
140
+ query_params[:'labels'] = @api_client.build_collection_param(opts[:'labels'], :multi) if !opts[:'labels'].nil?
138
141
 
139
142
  # header parameters
140
143
  header_params = opts[:header_params] || {}
@@ -35,12 +35,14 @@ module HatchetSdkRest
35
35
  CREATED = "CREATED".freeze
36
36
  QUEUED = "QUEUED".freeze
37
37
  SKIPPED = "SKIPPED".freeze
38
+ WAITING_FOR_BATCH = "WAITING_FOR_BATCH".freeze
39
+ BATCH_FLUSHED = "BATCH_FLUSHED".freeze
38
40
  COULD_NOT_SEND_TO_WORKER = "COULD_NOT_SEND_TO_WORKER".freeze
39
41
  DURABLE_EVICTED = "DURABLE_EVICTED".freeze
40
42
  DURABLE_RESTORING = "DURABLE_RESTORING".freeze
41
43
 
42
44
  def self.all_vars
43
- @all_vars ||= [REQUEUED_NO_WORKER, REQUEUED_RATE_LIMIT, SCHEDULING_TIMED_OUT, ASSIGNED, STARTED, FINISHED, FAILED, RETRYING, CANCELLED, TIMED_OUT, REASSIGNED, SLOT_RELEASED, TIMEOUT_REFRESHED, RETRIED_BY_USER, SENT_TO_WORKER, RATE_LIMIT_ERROR, ACKNOWLEDGED, CREATED, QUEUED, SKIPPED, COULD_NOT_SEND_TO_WORKER, DURABLE_EVICTED, DURABLE_RESTORING].freeze
45
+ @all_vars ||= [REQUEUED_NO_WORKER, REQUEUED_RATE_LIMIT, SCHEDULING_TIMED_OUT, ASSIGNED, STARTED, FINISHED, FAILED, RETRYING, CANCELLED, TIMED_OUT, REASSIGNED, SLOT_RELEASED, TIMEOUT_REFRESHED, RETRIED_BY_USER, SENT_TO_WORKER, RATE_LIMIT_ERROR, ACKNOWLEDGED, CREATED, QUEUED, SKIPPED, WAITING_FOR_BATCH, BATCH_FLUSHED, COULD_NOT_SEND_TO_WORKER, DURABLE_EVICTED, DURABLE_RESTORING].freeze
44
46
  end
45
47
 
46
48
  # Builds the enum from string
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "json"
4
+
3
5
  module Hatchet
4
6
  # Context object passed to task execution blocks.
5
7
  #
@@ -128,10 +130,28 @@ module Hatchet
128
130
  @client&.logger&.info(msg) || puts(msg)
129
131
  end
130
132
 
131
- # Cancel the current workflow run
133
+ # Cancel the current workflow run.
134
+ #
135
+ # Batch tasks share one context across every buffered member, so there is no single
136
+ # task run to cancel; instead this sends a batch CANCELLED event covering every
137
+ # member of the batch.
132
138
  def cancel
133
139
  @cancelled = true
134
140
  @exit_flag = true
141
+
142
+ if batch_action?
143
+ begin
144
+ @dispatcher_client&.send_batch_action_event(
145
+ action: @action,
146
+ event_type: :STEP_EVENT_TYPE_CANCELLED,
147
+ items: batch_member_ids.map { |id| { task_run_external_id: id } },
148
+ )
149
+ rescue StandardError
150
+ nil
151
+ end
152
+ return
153
+ end
154
+
135
155
  return unless @client && @workflow_run_id
136
156
 
137
157
  begin
@@ -204,5 +224,21 @@ module Hatchet
204
224
  def worker
205
225
  @worker_context
206
226
  end
227
+
228
+ private
229
+
230
+ def batch_action?
231
+ @action.respond_to?(:action_type) && @action.action_type == :START_BATCH
232
+ end
233
+
234
+ def batch_member_ids
235
+ raw = @action.respond_to?(:action_payload) ? @action.action_payload : nil
236
+ return [] if raw.nil? || raw.to_s.empty?
237
+
238
+ parsed = JSON.parse(raw)
239
+ parsed.is_a?(Hash) ? parsed.keys : []
240
+ rescue JSON::ParserError
241
+ []
242
+ end
207
243
  end
208
244
  end
@@ -7,7 +7,7 @@ require 'google/protobuf'
7
7
  require 'google/protobuf/timestamp_pb'
8
8
 
9
9
 
10
- descriptor_data = "\n\x1b\x64ispatcher/dispatcher.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"Z\n\x0cWorkerLabels\x12\x16\n\tstr_value\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tint_value\x18\x02 \x01(\x05H\x01\x88\x01\x01\x42\x0c\n\n_str_valueB\x0c\n\n_int_value\"\xcc\x01\n\x0bRuntimeInfo\x12\x18\n\x0bsdk_version\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x08language\x18\x02 \x01(\x0e\x32\x05.SDKSH\x01\x88\x01\x01\x12\x1d\n\x10language_version\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x02os\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x12\n\x05\x65xtra\x18\x05 \x01(\tH\x04\x88\x01\x01\x42\x0e\n\x0c_sdk_versionB\x0b\n\t_languageB\x13\n\x11_language_versionB\x05\n\x03_osB\x08\n\x06_extra\"\xb1\x03\n\x15WorkerRegisterRequest\x12\x13\n\x0bworker_name\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x63tions\x18\x02 \x03(\t\x12\x10\n\x08services\x18\x03 \x03(\t\x12\x12\n\x05slots\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12\x32\n\x06labels\x18\x05 \x03(\x0b\x32\".WorkerRegisterRequest.LabelsEntry\x12\x17\n\nwebhook_id\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\'\n\x0cruntime_info\x18\x07 \x01(\x0b\x32\x0c.RuntimeInfoH\x02\x88\x01\x01\x12;\n\x0bslot_config\x18\t \x03(\x0b\x32&.WorkerRegisterRequest.SlotConfigEntry\x1a<\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1c\n\x05value\x18\x02 \x01(\x0b\x32\r.WorkerLabels:\x02\x38\x01\x1a\x31\n\x0fSlotConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x08\n\x06_slotsB\r\n\x0b_webhook_idB\x0f\n\r_runtime_info\"S\n\x16WorkerRegisterResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\x12\x13\n\x0bworker_name\x18\x03 \x01(\t\"\xa4\x01\n\x19UpsertWorkerLabelsRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x36\n\x06labels\x18\x02 \x03(\x0b\x32&.UpsertWorkerLabelsRequest.LabelsEntry\x1a<\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1c\n\x05value\x18\x02 \x01(\x0b\x32\r.WorkerLabels:\x02\x38\x01\"B\n\x1aUpsertWorkerLabelsResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\"\xee\x06\n\x0e\x41ssignedAction\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x17\n\x0fworkflow_run_id\x18\x02 \x01(\t\x12\x1c\n\x14get_group_key_run_id\x18\x03 \x01(\t\x12\x0e\n\x06job_id\x18\x04 \x01(\t\x12\x10\n\x08job_name\x18\x05 \x01(\t\x12\x12\n\njob_run_id\x18\x06 \x01(\t\x12\x0f\n\x07task_id\x18\x07 \x01(\t\x12\x1c\n\x14task_run_external_id\x18\x08 \x01(\t\x12\x11\n\taction_id\x18\t \x01(\t\x12 \n\x0b\x61\x63tion_type\x18\n \x01(\x0e\x32\x0b.ActionType\x12\x16\n\x0e\x61\x63tion_payload\x18\x0b \x01(\t\x12\x11\n\ttask_name\x18\x0c \x01(\t\x12\x13\n\x0bretry_count\x18\r \x01(\x05\x12 \n\x13\x61\x64\x64itional_metadata\x18\x0e \x01(\tH\x00\x88\x01\x01\x12!\n\x14\x63hild_workflow_index\x18\x0f \x01(\x05H\x01\x88\x01\x01\x12\x1f\n\x12\x63hild_workflow_key\x18\x10 \x01(\tH\x02\x88\x01\x01\x12#\n\x16parent_workflow_run_id\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x10\n\x08priority\x18\x12 \x01(\x05\x12\x18\n\x0bworkflow_id\x18\x13 \x01(\tH\x04\x88\x01\x01\x12 \n\x13workflow_version_id\x18\x14 \x01(\tH\x05\x88\x01\x01\x12*\n\x1d\x64urable_task_invocation_count\x18\x15 \x01(\x05H\x06\x88\x01\x01\x12)\n\x1ctriggering_event_external_id\x18\x16 \x01(\tH\x07\x88\x01\x01\x12!\n\x14triggering_event_key\x18\x17 \x01(\tH\x08\x88\x01\x01\x42\x16\n\x14_additional_metadataB\x17\n\x15_child_workflow_indexB\x15\n\x13_child_workflow_keyB\x19\n\x17_parent_workflow_run_idB\x0e\n\x0c_workflow_idB\x16\n\x14_workflow_version_idB \n\x1e_durable_task_invocation_countB\x1f\n\x1d_triggering_event_external_idB\x17\n\x15_triggering_event_key\"(\n\x13WorkerListenRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\"-\n\x18WorkerUnsubscribeRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\"A\n\x19WorkerUnsubscribeResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\"\xec\x01\n\x13GroupKeyActionEvent\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x17\n\x0fworkflow_run_id\x18\x02 \x01(\t\x12\x1c\n\x14get_group_key_run_id\x18\x03 \x01(\t\x12\x11\n\taction_id\x18\x04 \x01(\t\x12\x33\n\x0f\x65vent_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\nevent_type\x18\x06 \x01(\x0e\x32\x18.GroupKeyActionEventType\x12\x15\n\revent_payload\x18\x07 \x01(\t\"\xde\x02\n\x0fStepActionEvent\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x12\n\njob_run_id\x18\x03 \x01(\t\x12\x0f\n\x07task_id\x18\x04 \x01(\t\x12\x1c\n\x14task_run_external_id\x18\x05 \x01(\t\x12\x11\n\taction_id\x18\x06 \x01(\t\x12\x33\n\x0f\x65vent_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12(\n\nevent_type\x18\x08 \x01(\x0e\x32\x14.StepActionEventType\x12\x15\n\revent_payload\x18\t \x01(\t\x12\x18\n\x0bretry_count\x18\n \x01(\x05H\x00\x88\x01\x01\x12\x1d\n\x10should_not_retry\x18\x0b \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_retry_countB\x13\n\x11_should_not_retry\";\n\x13\x41\x63tionEventResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\"\xcc\x01\n SubscribeToWorkflowEventsRequest\x12\x1c\n\x0fworkflow_run_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12 \n\x13\x61\x64\x64itional_meta_key\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\"\n\x15\x61\x64\x64itional_meta_value\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x12\n\x10_workflow_run_idB\x16\n\x14_additional_meta_keyB\x18\n\x16_additional_meta_value\"9\n\x1eSubscribeToWorkflowRunsRequest\x12\x17\n\x0fworkflow_run_id\x18\x01 \x01(\t\"\xe7\x02\n\rWorkflowEvent\x12\x17\n\x0fworkflow_run_id\x18\x01 \x01(\t\x12$\n\rresource_type\x18\x02 \x01(\x0e\x32\r.ResourceType\x12&\n\nevent_type\x18\x03 \x01(\x0e\x32\x12.ResourceEventType\x12\x13\n\x0bresource_id\x18\x04 \x01(\t\x12\x33\n\x0f\x65vent_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\revent_payload\x18\x06 \x01(\t\x12\x0e\n\x06hangup\x18\x07 \x01(\x08\x12\x19\n\x0ctask_retries\x18\x08 \x01(\x05H\x00\x88\x01\x01\x12\x18\n\x0bretry_count\x18\t \x01(\x05H\x01\x88\x01\x01\x12\x18\n\x0b\x65vent_index\x18\n \x01(\x03H\x02\x88\x01\x01\x42\x0f\n\r_task_retriesB\x0e\n\x0c_retry_countB\x0e\n\x0c_event_index\"\xac\x01\n\x10WorkflowRunEvent\x12\x17\n\x0fworkflow_run_id\x18\x01 \x01(\t\x12)\n\nevent_type\x18\x02 \x01(\x0e\x32\x15.WorkflowRunEventType\x12\x33\n\x0f\x65vent_timestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x07results\x18\x04 \x03(\x0b\x32\x0e.StepRunResult\"\x92\x01\n\rStepRunResult\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x11\n\ttask_name\x18\x02 \x01(\t\x12\x12\n\njob_run_id\x18\x03 \x01(\t\x12\x12\n\x05\x65rror\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06output\x18\x05 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_errorB\t\n\x07_output\"c\n\rOverridesData\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x17\n\x0f\x63\x61ller_filename\x18\x04 \x01(\t\"\x17\n\x15OverridesDataResponse\"W\n\x10HeartbeatRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x30\n\x0cheartbeat_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x13\n\x11HeartbeatResponse\"S\n\x15RefreshTimeoutRequest\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x1c\n\x14increment_timeout_by\x18\x02 \x01(\t\"H\n\x16RefreshTimeoutResponse\x12.\n\ntimeout_at\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"2\n\x12ReleaseSlotRequest\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\"\x15\n\x13ReleaseSlotResponse\"9\n\x19RestoreEvictedTaskRequest\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\".\n\x1aRestoreEvictedTaskResponse\x12\x10\n\x08requeued\x18\x01 \x01(\x08\"\x13\n\x11GetVersionRequest\"%\n\x12GetVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t*A\n\x04SDKS\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x06\n\x02GO\x10\x01\x12\n\n\x06PYTHON\x10\x02\x12\x0e\n\nTYPESCRIPT\x10\x03\x12\x08\n\x04RUBY\x10\x04*N\n\nActionType\x12\x12\n\x0eSTART_STEP_RUN\x10\x00\x12\x13\n\x0f\x43\x41NCEL_STEP_RUN\x10\x01\x12\x17\n\x13START_GET_GROUP_KEY\x10\x02*\xa2\x01\n\x17GroupKeyActionEventType\x12 \n\x1cGROUP_KEY_EVENT_TYPE_UNKNOWN\x10\x00\x12 \n\x1cGROUP_KEY_EVENT_TYPE_STARTED\x10\x01\x12\"\n\x1eGROUP_KEY_EVENT_TYPE_COMPLETED\x10\x02\x12\x1f\n\x1bGROUP_KEY_EVENT_TYPE_FAILED\x10\x03*\xac\x01\n\x13StepActionEventType\x12\x1b\n\x17STEP_EVENT_TYPE_UNKNOWN\x10\x00\x12\x1b\n\x17STEP_EVENT_TYPE_STARTED\x10\x01\x12\x1d\n\x19STEP_EVENT_TYPE_COMPLETED\x10\x02\x12\x1a\n\x16STEP_EVENT_TYPE_FAILED\x10\x03\x12 \n\x1cSTEP_EVENT_TYPE_ACKNOWLEDGED\x10\x04*e\n\x0cResourceType\x12\x19\n\x15RESOURCE_TYPE_UNKNOWN\x10\x00\x12\x1a\n\x16RESOURCE_TYPE_STEP_RUN\x10\x01\x12\x1e\n\x1aRESOURCE_TYPE_WORKFLOW_RUN\x10\x02*\xfe\x01\n\x11ResourceEventType\x12\x1f\n\x1bRESOURCE_EVENT_TYPE_UNKNOWN\x10\x00\x12\x1f\n\x1bRESOURCE_EVENT_TYPE_STARTED\x10\x01\x12!\n\x1dRESOURCE_EVENT_TYPE_COMPLETED\x10\x02\x12\x1e\n\x1aRESOURCE_EVENT_TYPE_FAILED\x10\x03\x12!\n\x1dRESOURCE_EVENT_TYPE_CANCELLED\x10\x04\x12!\n\x1dRESOURCE_EVENT_TYPE_TIMED_OUT\x10\x05\x12\x1e\n\x1aRESOURCE_EVENT_TYPE_STREAM\x10\x06*<\n\x14WorkflowRunEventType\x12$\n WORKFLOW_RUN_EVENT_TYPE_FINISHED\x10\x00\x32\x82\x08\n\nDispatcher\x12=\n\x08Register\x12\x16.WorkerRegisterRequest\x1a\x17.WorkerRegisterResponse\"\x00\x12\x33\n\x06Listen\x12\x14.WorkerListenRequest\x1a\x0f.AssignedAction\"\x00\x30\x01\x12\x35\n\x08ListenV2\x12\x14.WorkerListenRequest\x1a\x0f.AssignedAction\"\x00\x30\x01\x12\x34\n\tHeartbeat\x12\x11.HeartbeatRequest\x1a\x12.HeartbeatResponse\"\x00\x12R\n\x19SubscribeToWorkflowEvents\x12!.SubscribeToWorkflowEventsRequest\x1a\x0e.WorkflowEvent\"\x00\x30\x01\x12S\n\x17SubscribeToWorkflowRuns\x12\x1f.SubscribeToWorkflowRunsRequest\x1a\x11.WorkflowRunEvent\"\x00(\x01\x30\x01\x12?\n\x13SendStepActionEvent\x12\x10.StepActionEvent\x1a\x14.ActionEventResponse\"\x00\x12G\n\x17SendGroupKeyActionEvent\x12\x14.GroupKeyActionEvent\x1a\x14.ActionEventResponse\"\x00\x12<\n\x10PutOverridesData\x12\x0e.OverridesData\x1a\x16.OverridesDataResponse\"\x00\x12\x46\n\x0bUnsubscribe\x12\x19.WorkerUnsubscribeRequest\x1a\x1a.WorkerUnsubscribeResponse\"\x00\x12\x43\n\x0eRefreshTimeout\x12\x16.RefreshTimeoutRequest\x1a\x17.RefreshTimeoutResponse\"\x00\x12:\n\x0bReleaseSlot\x12\x13.ReleaseSlotRequest\x1a\x14.ReleaseSlotResponse\"\x00\x12O\n\x12RestoreEvictedTask\x12\x1a.RestoreEvictedTaskRequest\x1a\x1b.RestoreEvictedTaskResponse\"\x00\x12O\n\x12UpsertWorkerLabels\x12\x1a.UpsertWorkerLabelsRequest\x1a\x1b.UpsertWorkerLabelsResponse\"\x00\x12\x37\n\nGetVersion\x12\x12.GetVersionRequest\x1a\x13.GetVersionResponse\"\x00\x42GZEgithub.com/hatchet-dev/hatchet/internal/services/dispatcher/contractsb\x06proto3"
10
+ descriptor_data = "\n\x1b\x64ispatcher/dispatcher.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"Z\n\x0cWorkerLabels\x12\x16\n\tstr_value\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tint_value\x18\x02 \x01(\x05H\x01\x88\x01\x01\x42\x0c\n\n_str_valueB\x0c\n\n_int_value\"\xcc\x01\n\x0bRuntimeInfo\x12\x18\n\x0bsdk_version\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x08language\x18\x02 \x01(\x0e\x32\x05.SDKSH\x01\x88\x01\x01\x12\x1d\n\x10language_version\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x02os\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x12\n\x05\x65xtra\x18\x05 \x01(\tH\x04\x88\x01\x01\x42\x0e\n\x0c_sdk_versionB\x0b\n\t_languageB\x13\n\x11_language_versionB\x05\n\x03_osB\x08\n\x06_extra\"\xb1\x03\n\x15WorkerRegisterRequest\x12\x13\n\x0bworker_name\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x63tions\x18\x02 \x03(\t\x12\x10\n\x08services\x18\x03 \x03(\t\x12\x12\n\x05slots\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12\x32\n\x06labels\x18\x05 \x03(\x0b\x32\".WorkerRegisterRequest.LabelsEntry\x12\x17\n\nwebhook_id\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\'\n\x0cruntime_info\x18\x07 \x01(\x0b\x32\x0c.RuntimeInfoH\x02\x88\x01\x01\x12;\n\x0bslot_config\x18\t \x03(\x0b\x32&.WorkerRegisterRequest.SlotConfigEntry\x1a<\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1c\n\x05value\x18\x02 \x01(\x0b\x32\r.WorkerLabels:\x02\x38\x01\x1a\x31\n\x0fSlotConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x08\n\x06_slotsB\r\n\x0b_webhook_idB\x0f\n\r_runtime_info\"S\n\x16WorkerRegisterResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\x12\x13\n\x0bworker_name\x18\x03 \x01(\t\"\xa4\x01\n\x19UpsertWorkerLabelsRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x36\n\x06labels\x18\x02 \x03(\x0b\x32&.UpsertWorkerLabelsRequest.LabelsEntry\x1a<\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1c\n\x05value\x18\x02 \x01(\x0b\x32\r.WorkerLabels:\x02\x38\x01\"B\n\x1aUpsertWorkerLabelsResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\"\xcc\x08\n\x0e\x41ssignedAction\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x17\n\x0fworkflow_run_id\x18\x02 \x01(\t\x12\x1c\n\x14get_group_key_run_id\x18\x03 \x01(\t\x12\x0e\n\x06job_id\x18\x04 \x01(\t\x12\x10\n\x08job_name\x18\x05 \x01(\t\x12\x12\n\njob_run_id\x18\x06 \x01(\t\x12\x0f\n\x07task_id\x18\x07 \x01(\t\x12\x1c\n\x14task_run_external_id\x18\x08 \x01(\t\x12\x11\n\taction_id\x18\t \x01(\t\x12 \n\x0b\x61\x63tion_type\x18\n \x01(\x0e\x32\x0b.ActionType\x12\x16\n\x0e\x61\x63tion_payload\x18\x0b \x01(\t\x12\x11\n\ttask_name\x18\x0c \x01(\t\x12\x13\n\x0bretry_count\x18\r \x01(\x05\x12 \n\x13\x61\x64\x64itional_metadata\x18\x0e \x01(\tH\x00\x88\x01\x01\x12!\n\x14\x63hild_workflow_index\x18\x0f \x01(\x05H\x01\x88\x01\x01\x12\x1f\n\x12\x63hild_workflow_key\x18\x10 \x01(\tH\x02\x88\x01\x01\x12#\n\x16parent_workflow_run_id\x18\x11 \x01(\tH\x03\x88\x01\x01\x12\x10\n\x08priority\x18\x12 \x01(\x05\x12\x18\n\x0bworkflow_id\x18\x13 \x01(\tH\x04\x88\x01\x01\x12 \n\x13workflow_version_id\x18\x14 \x01(\tH\x05\x88\x01\x01\x12*\n\x1d\x64urable_task_invocation_count\x18\x15 \x01(\x05H\x06\x88\x01\x01\x12)\n\x1ctriggering_event_external_id\x18\x16 \x01(\tH\x07\x88\x01\x01\x12!\n\x14triggering_event_key\x18\x17 \x01(\tH\x08\x88\x01\x01\x12\x14\n\x07\x62\x61tchId\x18\x18 \x01(\tH\t\x88\x01\x01\x12\x16\n\tbatchSize\x18\x19 \x01(\x05H\n\x88\x01\x01\x12\x17\n\nbatchIndex\x18\x1a \x01(\x05H\x0b\x88\x01\x01\x12\x32\n\x11\x62\x61tchStartPayload\x18\x1b \x01(\x0b\x32\x12.BatchStartPayloadH\x0c\x88\x01\x01\x12\x15\n\x08\x62\x61tchKey\x18\x1c \x01(\tH\r\x88\x01\x01\x42\x16\n\x14_additional_metadataB\x17\n\x15_child_workflow_indexB\x15\n\x13_child_workflow_keyB\x19\n\x17_parent_workflow_run_idB\x0e\n\x0c_workflow_idB\x16\n\x14_workflow_version_idB \n\x1e_durable_task_invocation_countB\x1f\n\x1d_triggering_event_external_idB\x17\n\x15_triggering_event_keyB\n\n\x08_batchIdB\x0c\n\n_batchSizeB\r\n\x0b_batchIndexB\x14\n\x12_batchStartPayloadB\x0b\n\t_batchKey\"q\n\x11\x42\x61tchStartPayload\x12\x15\n\rtriggerReason\x18\x01 \x01(\t\x12/\n\x0btriggerTime\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0c\x65xpectedSize\x18\x03 \x01(\x05\"(\n\x13WorkerListenRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\"-\n\x18WorkerUnsubscribeRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\"A\n\x19WorkerUnsubscribeResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\"\xec\x01\n\x13GroupKeyActionEvent\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x17\n\x0fworkflow_run_id\x18\x02 \x01(\t\x12\x1c\n\x14get_group_key_run_id\x18\x03 \x01(\t\x12\x11\n\taction_id\x18\x04 \x01(\t\x12\x33\n\x0f\x65vent_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\nevent_type\x18\x06 \x01(\x0e\x32\x18.GroupKeyActionEventType\x12\x15\n\revent_payload\x18\x07 \x01(\t\"\xde\x02\n\x0fStepActionEvent\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x12\n\njob_run_id\x18\x03 \x01(\t\x12\x0f\n\x07task_id\x18\x04 \x01(\t\x12\x1c\n\x14task_run_external_id\x18\x05 \x01(\t\x12\x11\n\taction_id\x18\x06 \x01(\t\x12\x33\n\x0f\x65vent_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12(\n\nevent_type\x18\x08 \x01(\x0e\x32\x14.StepActionEventType\x12\x15\n\revent_payload\x18\t \x01(\t\x12\x18\n\x0bretry_count\x18\n \x01(\x05H\x00\x88\x01\x01\x12\x1d\n\x10should_not_retry\x18\x0b \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_retry_countB\x13\n\x11_should_not_retry\"\xa9\x01\n\x14\x42\x61tchActionEventItem\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x15\n\revent_payload\x18\x02 \x01(\t\x12\x18\n\x0bretry_count\x18\x03 \x01(\x05H\x00\x88\x01\x01\x12\x1d\n\x10should_not_retry\x18\x04 \x01(\x08H\x01\x88\x01\x01\x42\x0e\n\x0c_retry_countB\x13\n\x11_should_not_retry\"\xf1\x01\n\x10\x42\x61tchActionEvent\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x11\n\taction_id\x18\x03 \x01(\t\x12\x15\n\x08\x62\x61tch_id\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x33\n\x0f\x65vent_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12(\n\nevent_type\x18\x06 \x01(\x0e\x32\x14.StepActionEventType\x12$\n\x05items\x18\x07 \x03(\x0b\x32\x15.BatchActionEventItemB\x0b\n\t_batch_id\";\n\x13\x41\x63tionEventResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\"\xcc\x01\n SubscribeToWorkflowEventsRequest\x12\x1c\n\x0fworkflow_run_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12 \n\x13\x61\x64\x64itional_meta_key\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\"\n\x15\x61\x64\x64itional_meta_value\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x12\n\x10_workflow_run_idB\x16\n\x14_additional_meta_keyB\x18\n\x16_additional_meta_value\"9\n\x1eSubscribeToWorkflowRunsRequest\x12\x17\n\x0fworkflow_run_id\x18\x01 \x01(\t\"\xe7\x02\n\rWorkflowEvent\x12\x17\n\x0fworkflow_run_id\x18\x01 \x01(\t\x12$\n\rresource_type\x18\x02 \x01(\x0e\x32\r.ResourceType\x12&\n\nevent_type\x18\x03 \x01(\x0e\x32\x12.ResourceEventType\x12\x13\n\x0bresource_id\x18\x04 \x01(\t\x12\x33\n\x0f\x65vent_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\revent_payload\x18\x06 \x01(\t\x12\x0e\n\x06hangup\x18\x07 \x01(\x08\x12\x19\n\x0ctask_retries\x18\x08 \x01(\x05H\x00\x88\x01\x01\x12\x18\n\x0bretry_count\x18\t \x01(\x05H\x01\x88\x01\x01\x12\x18\n\x0b\x65vent_index\x18\n \x01(\x03H\x02\x88\x01\x01\x42\x0f\n\r_task_retriesB\x0e\n\x0c_retry_countB\x0e\n\x0c_event_index\"\xac\x01\n\x10WorkflowRunEvent\x12\x17\n\x0fworkflow_run_id\x18\x01 \x01(\t\x12)\n\nevent_type\x18\x02 \x01(\x0e\x32\x15.WorkflowRunEventType\x12\x33\n\x0f\x65vent_timestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x07results\x18\x04 \x03(\x0b\x32\x0e.StepRunResult\"\x92\x01\n\rStepRunResult\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x11\n\ttask_name\x18\x02 \x01(\t\x12\x12\n\njob_run_id\x18\x03 \x01(\t\x12\x12\n\x05\x65rror\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06output\x18\x05 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_errorB\t\n\x07_output\"c\n\rOverridesData\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x17\n\x0f\x63\x61ller_filename\x18\x04 \x01(\t\"\x17\n\x15OverridesDataResponse\"W\n\x10HeartbeatRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x30\n\x0cheartbeat_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x13\n\x11HeartbeatResponse\"S\n\x15RefreshTimeoutRequest\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\x12\x1c\n\x14increment_timeout_by\x18\x02 \x01(\t\"H\n\x16RefreshTimeoutResponse\x12.\n\ntimeout_at\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"2\n\x12ReleaseSlotRequest\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\"\x15\n\x13ReleaseSlotResponse\"9\n\x19RestoreEvictedTaskRequest\x12\x1c\n\x14task_run_external_id\x18\x01 \x01(\t\".\n\x1aRestoreEvictedTaskResponse\x12\x10\n\x08requeued\x18\x01 \x01(\x08\"\x13\n\x11GetVersionRequest\"%\n\x12GetVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t*A\n\x04SDKS\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x06\n\x02GO\x10\x01\x12\n\n\x06PYTHON\x10\x02\x12\x0e\n\nTYPESCRIPT\x10\x03\x12\x08\n\x04RUBY\x10\x04*_\n\nActionType\x12\x12\n\x0eSTART_STEP_RUN\x10\x00\x12\x13\n\x0f\x43\x41NCEL_STEP_RUN\x10\x01\x12\x17\n\x13START_GET_GROUP_KEY\x10\x02\x12\x0f\n\x0bSTART_BATCH\x10\x03*\xa2\x01\n\x17GroupKeyActionEventType\x12 \n\x1cGROUP_KEY_EVENT_TYPE_UNKNOWN\x10\x00\x12 \n\x1cGROUP_KEY_EVENT_TYPE_STARTED\x10\x01\x12\"\n\x1eGROUP_KEY_EVENT_TYPE_COMPLETED\x10\x02\x12\x1f\n\x1bGROUP_KEY_EVENT_TYPE_FAILED\x10\x03*\xcb\x01\n\x13StepActionEventType\x12\x1b\n\x17STEP_EVENT_TYPE_UNKNOWN\x10\x00\x12\x1b\n\x17STEP_EVENT_TYPE_STARTED\x10\x01\x12\x1d\n\x19STEP_EVENT_TYPE_COMPLETED\x10\x02\x12\x1a\n\x16STEP_EVENT_TYPE_FAILED\x10\x03\x12 \n\x1cSTEP_EVENT_TYPE_ACKNOWLEDGED\x10\x04\x12\x1d\n\x19STEP_EVENT_TYPE_CANCELLED\x10\x05*e\n\x0cResourceType\x12\x19\n\x15RESOURCE_TYPE_UNKNOWN\x10\x00\x12\x1a\n\x16RESOURCE_TYPE_STEP_RUN\x10\x01\x12\x1e\n\x1aRESOURCE_TYPE_WORKFLOW_RUN\x10\x02*\xfe\x01\n\x11ResourceEventType\x12\x1f\n\x1bRESOURCE_EVENT_TYPE_UNKNOWN\x10\x00\x12\x1f\n\x1bRESOURCE_EVENT_TYPE_STARTED\x10\x01\x12!\n\x1dRESOURCE_EVENT_TYPE_COMPLETED\x10\x02\x12\x1e\n\x1aRESOURCE_EVENT_TYPE_FAILED\x10\x03\x12!\n\x1dRESOURCE_EVENT_TYPE_CANCELLED\x10\x04\x12!\n\x1dRESOURCE_EVENT_TYPE_TIMED_OUT\x10\x05\x12\x1e\n\x1aRESOURCE_EVENT_TYPE_STREAM\x10\x06*<\n\x14WorkflowRunEventType\x12$\n WORKFLOW_RUN_EVENT_TYPE_FINISHED\x10\x00\x32\xc5\x08\n\nDispatcher\x12=\n\x08Register\x12\x16.WorkerRegisterRequest\x1a\x17.WorkerRegisterResponse\"\x00\x12\x33\n\x06Listen\x12\x14.WorkerListenRequest\x1a\x0f.AssignedAction\"\x00\x30\x01\x12\x35\n\x08ListenV2\x12\x14.WorkerListenRequest\x1a\x0f.AssignedAction\"\x00\x30\x01\x12\x34\n\tHeartbeat\x12\x11.HeartbeatRequest\x1a\x12.HeartbeatResponse\"\x00\x12R\n\x19SubscribeToWorkflowEvents\x12!.SubscribeToWorkflowEventsRequest\x1a\x0e.WorkflowEvent\"\x00\x30\x01\x12S\n\x17SubscribeToWorkflowRuns\x12\x1f.SubscribeToWorkflowRunsRequest\x1a\x11.WorkflowRunEvent\"\x00(\x01\x30\x01\x12?\n\x13SendStepActionEvent\x12\x10.StepActionEvent\x1a\x14.ActionEventResponse\"\x00\x12\x41\n\x14SendBatchActionEvent\x12\x11.BatchActionEvent\x1a\x14.ActionEventResponse\"\x00\x12G\n\x17SendGroupKeyActionEvent\x12\x14.GroupKeyActionEvent\x1a\x14.ActionEventResponse\"\x00\x12<\n\x10PutOverridesData\x12\x0e.OverridesData\x1a\x16.OverridesDataResponse\"\x00\x12\x46\n\x0bUnsubscribe\x12\x19.WorkerUnsubscribeRequest\x1a\x1a.WorkerUnsubscribeResponse\"\x00\x12\x43\n\x0eRefreshTimeout\x12\x16.RefreshTimeoutRequest\x1a\x17.RefreshTimeoutResponse\"\x00\x12:\n\x0bReleaseSlot\x12\x13.ReleaseSlotRequest\x1a\x14.ReleaseSlotResponse\"\x00\x12O\n\x12RestoreEvictedTask\x12\x1a.RestoreEvictedTaskRequest\x1a\x1b.RestoreEvictedTaskResponse\"\x00\x12O\n\x12UpsertWorkerLabels\x12\x1a.UpsertWorkerLabelsRequest\x1a\x1b.UpsertWorkerLabelsResponse\"\x00\x12\x37\n\nGetVersion\x12\x12.GetVersionRequest\x1a\x13.GetVersionResponse\"\x00\x42GZEgithub.com/hatchet-dev/hatchet/internal/services/dispatcher/contractsb\x06proto3"
11
11
 
12
12
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
13
13
  pool.add_serialized_file(descriptor_data)
@@ -19,11 +19,14 @@ WorkerRegisterResponse = ::Google::Protobuf::DescriptorPool.generated_pool.looku
19
19
  UpsertWorkerLabelsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("UpsertWorkerLabelsRequest").msgclass
20
20
  UpsertWorkerLabelsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("UpsertWorkerLabelsResponse").msgclass
21
21
  AssignedAction = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("AssignedAction").msgclass
22
+ BatchStartPayload = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("BatchStartPayload").msgclass
22
23
  WorkerListenRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("WorkerListenRequest").msgclass
23
24
  WorkerUnsubscribeRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("WorkerUnsubscribeRequest").msgclass
24
25
  WorkerUnsubscribeResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("WorkerUnsubscribeResponse").msgclass
25
26
  GroupKeyActionEvent = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("GroupKeyActionEvent").msgclass
26
27
  StepActionEvent = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("StepActionEvent").msgclass
28
+ BatchActionEventItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("BatchActionEventItem").msgclass
29
+ BatchActionEvent = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("BatchActionEvent").msgclass
27
30
  ActionEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ActionEventResponse").msgclass
28
31
  SubscribeToWorkflowEventsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("SubscribeToWorkflowEventsRequest").msgclass
29
32
  SubscribeToWorkflowRunsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("SubscribeToWorkflowRunsRequest").msgclass
@@ -23,6 +23,9 @@ module Dispatcher
23
23
  rpc :SubscribeToWorkflowEvents, ::SubscribeToWorkflowEventsRequest, stream(::WorkflowEvent)
24
24
  rpc :SubscribeToWorkflowRuns, stream(::SubscribeToWorkflowRunsRequest), stream(::WorkflowRunEvent)
25
25
  rpc :SendStepActionEvent, ::StepActionEvent, ::ActionEventResponse
26
+ # SendBatchActionEvent reports a single lifecycle event (STARTED, FAILED, or CANCELLED)
27
+ # for every task in a batch in one call, instead of one SendStepActionEvent call per task.
28
+ rpc :SendBatchActionEvent, ::BatchActionEvent, ::ActionEventResponse
26
29
  rpc :SendGroupKeyActionEvent, ::GroupKeyActionEvent, ::ActionEventResponse
27
30
  rpc :PutOverridesData, ::OverridesData, ::OverridesDataResponse
28
31
  rpc :Unsubscribe, ::WorkerUnsubscribeRequest, ::WorkerUnsubscribeResponse
@@ -9,7 +9,7 @@ require 'v1/shared/condition_pb'
9
9
  require 'v1/shared/trigger_pb'
10
10
 
11
11
 
12
- descriptor_data = "\n\x12v1/workflows.proto\x12\x02v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x19v1/shared/condition.proto\x1a\x17v1/shared/trigger.proto\"[\n\x12\x43\x61ncelTasksRequest\x12\x14\n\x0c\x65xternal_ids\x18\x01 \x03(\t\x12$\n\x06\x66ilter\x18\x02 \x01(\x0b\x32\x0f.v1.TasksFilterH\x00\x88\x01\x01\x42\t\n\x07_filter\"[\n\x12ReplayTasksRequest\x12\x14\n\x0c\x65xternal_ids\x18\x01 \x03(\t\x12$\n\x06\x66ilter\x18\x02 \x01(\x0b\x32\x0f.v1.TasksFilterH\x00\x88\x01\x01\x42\t\n\x07_filter\"\xb7\x01\n\x0bTasksFilter\x12\x10\n\x08statuses\x18\x01 \x03(\t\x12)\n\x05since\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\x05until\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x88\x01\x01\x12\x14\n\x0cworkflow_ids\x18\x04 \x03(\t\x12\x1b\n\x13\x61\x64\x64itional_metadata\x18\x05 \x03(\tB\x08\n\x06_until\".\n\x13\x43\x61ncelTasksResponse\x12\x17\n\x0f\x63\x61ncelled_tasks\x18\x01 \x03(\t\"-\n\x13ReplayTasksResponse\x12\x16\n\x0ereplayed_tasks\x18\x01 \x03(\t\"\xae\x02\n\x19TriggerWorkflowRunRequest\x12\x15\n\rworkflow_name\x18\x01 \x01(\t\x12\r\n\x05input\x18\x02 \x01(\x0c\x12\x1b\n\x13\x61\x64\x64itional_metadata\x18\x03 \x01(\x0c\x12\x15\n\x08priority\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12U\n\x15\x64\x65sired_worker_labels\x18\x05 \x03(\x0b\x32\x36.v1.TriggerWorkflowRunRequest.DesiredWorkerLabelsEntry\x1aS\n\x18\x44\x65siredWorkerLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.v1.DesiredWorkerLabels:\x02\x38\x01\x42\x0b\n\t_priority\"1\n\x1aTriggerWorkflowRunResponse\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\"X\n\x18\x42ranchDurableTaskRequest\x12\x18\n\x10task_external_id\x18\x01 \x01(\t\x12\x0f\n\x07node_id\x18\x02 \x01(\x03\x12\x11\n\tbranch_id\x18\x03 \x01(\x03\"Y\n\x19\x42ranchDurableTaskResponse\x12\x18\n\x10task_external_id\x18\x01 \x01(\t\x12\x0f\n\x07node_id\x18\x02 \x01(\x03\x12\x11\n\tbranch_id\x18\x03 \x01(\x03\"\xed\x04\n\x1c\x43reateWorkflowVersionRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x16\n\x0e\x65vent_triggers\x18\x04 \x03(\t\x12\x15\n\rcron_triggers\x18\x05 \x03(\t\x12!\n\x05tasks\x18\x06 \x03(\x0b\x32\x12.v1.CreateTaskOpts\x12$\n\x0b\x63oncurrency\x18\x07 \x01(\x0b\x32\x0f.v1.Concurrency\x12\x17\n\ncron_input\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x30\n\x0fon_failure_task\x18\t \x01(\x0b\x32\x12.v1.CreateTaskOptsH\x01\x88\x01\x01\x12\'\n\x06sticky\x18\n \x01(\x0e\x32\x12.v1.StickyStrategyH\x02\x88\x01\x01\x12\x1d\n\x10\x64\x65\x66\x61ult_priority\x18\x0b \x01(\x05H\x03\x88\x01\x01\x12(\n\x0f\x63oncurrency_arr\x18\x0c \x03(\x0b\x32\x0f.v1.Concurrency\x12*\n\x0f\x64\x65\x66\x61ult_filters\x18\r \x03(\x0b\x32\x11.v1.DefaultFilter\x12\x1e\n\x11input_json_schema\x18\x0e \x01(\x0cH\x04\x88\x01\x01\x12/\n\x0bidempotency\x18\x0f \x01(\x0b\x32\x15.v1.IdempotencyConfigH\x05\x88\x01\x01\x42\r\n\x0b_cron_inputB\x12\n\x10_on_failure_taskB\t\n\x07_stickyB\x13\n\x11_default_priorityB\x14\n\x12_input_json_schemaB\x0e\n\x0c_idempotency\"n\n\x11IdempotencyConfig\x12\x12\n\nexpression\x18\x01 \x01(\t\x12\x0e\n\x06ttl_ms\x18\x02 \x01(\x03\x12*\n\x06method\x18\x03 \x01(\x0e\x32\x15.v1.IdempotencyMethodH\x00\x88\x01\x01\x42\t\n\x07_method\"`\n\x19IdempotencyCollisionError\x12 \n\x18\x65xisting_run_external_id\x18\x01 \x01(\t\x12!\n\x19\x63olliding_run_external_id\x18\x02 \x01(\t\"\x87\x01\n$BulkTriggerIdempotencyCollisionError\x12,\n$successful_workflow_run_external_ids\x18\x01 \x03(\t\x12\x31\n\ncollisions\x18\x02 \x03(\x0b\x32\x1d.v1.IdempotencyCollisionError\"T\n\rDefaultFilter\x12\x12\n\nexpression\x18\x01 \x01(\t\x12\r\n\x05scope\x18\x02 \x01(\t\x12\x14\n\x07payload\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\n\n\x08_payload\"\x93\x01\n\x0b\x43oncurrency\x12\x12\n\nexpression\x18\x01 \x01(\t\x12\x15\n\x08max_runs\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x39\n\x0elimit_strategy\x18\x03 \x01(\x0e\x32\x1c.v1.ConcurrencyLimitStrategyH\x01\x88\x01\x01\x42\x0b\n\t_max_runsB\x11\n\x0f_limit_strategy\"\xb7\x05\n\x0e\x43reateTaskOpts\x12\x13\n\x0breadable_id\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x0f\n\x07timeout\x18\x03 \x01(\t\x12\x0e\n\x06inputs\x18\x04 \x01(\t\x12\x0f\n\x07parents\x18\x05 \x03(\t\x12\x0f\n\x07retries\x18\x06 \x01(\x05\x12,\n\x0brate_limits\x18\x07 \x03(\x0b\x32\x17.v1.CreateTaskRateLimit\x12;\n\rworker_labels\x18\x08 \x03(\x0b\x32$.v1.CreateTaskOpts.WorkerLabelsEntry\x12\x1b\n\x0e\x62\x61\x63koff_factor\x18\t \x01(\x02H\x00\x88\x01\x01\x12 \n\x13\x62\x61\x63koff_max_seconds\x18\n \x01(\x05H\x01\x88\x01\x01\x12$\n\x0b\x63oncurrency\x18\x0b \x03(\x0b\x32\x0f.v1.Concurrency\x12+\n\nconditions\x18\x0c \x01(\x0b\x32\x12.v1.TaskConditionsH\x02\x88\x01\x01\x12\x1d\n\x10schedule_timeout\x18\r \x01(\tH\x03\x88\x01\x01\x12\x12\n\nis_durable\x18\x0e \x01(\x08\x12;\n\rslot_requests\x18\x0f \x03(\x0b\x32$.v1.CreateTaskOpts.SlotRequestsEntry\x1aL\n\x11WorkerLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.v1.DesiredWorkerLabels:\x02\x38\x01\x1a\x33\n\x11SlotRequestsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x11\n\x0f_backoff_factorB\x16\n\x14_backoff_max_secondsB\r\n\x0b_conditionsB\x13\n\x11_schedule_timeout\"\xfd\x01\n\x13\x43reateTaskRateLimit\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x12\n\x05units\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08key_expr\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nunits_expr\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x1e\n\x11limit_values_expr\x18\x05 \x01(\tH\x03\x88\x01\x01\x12,\n\x08\x64uration\x18\x06 \x01(\x0e\x32\x15.v1.RateLimitDurationH\x04\x88\x01\x01\x42\x08\n\x06_unitsB\x0b\n\t_key_exprB\r\n\x0b_units_exprB\x14\n\x12_limit_values_exprB\x0b\n\t_duration\"@\n\x1d\x43reateWorkflowVersionResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\"+\n\x14GetRunDetailsRequest\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\"\xaa\x01\n\rTaskRunDetail\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\x12\x1d\n\x06status\x18\x02 \x01(\x0e\x32\r.v1.RunStatus\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06output\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x0breadable_id\x18\x05 \x01(\t\x12\x12\n\nis_evicted\x18\x06 \x01(\x08\x42\x08\n\x06_errorB\t\n\x07_output\"\x84\x02\n\x15GetRunDetailsResponse\x12\r\n\x05input\x18\x01 \x01(\x0c\x12\x1d\n\x06status\x18\x02 \x01(\x0e\x32\r.v1.RunStatus\x12:\n\ttask_runs\x18\x03 \x03(\x0b\x32\'.v1.GetRunDetailsResponse.TaskRunsEntry\x12\x0c\n\x04\x64one\x18\x04 \x01(\x08\x12\x1b\n\x13\x61\x64\x64itional_metadata\x18\x05 \x01(\x0c\x12\x12\n\nis_evicted\x18\x06 \x01(\x08\x1a\x42\n\rTaskRunsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.v1.TaskRunDetail:\x02\x38\x01*$\n\x0eStickyStrategy\x12\x08\n\x04SOFT\x10\x00\x12\x08\n\x04HARD\x10\x01*]\n\x11RateLimitDuration\x12\n\n\x06SECOND\x10\x00\x12\n\n\x06MINUTE\x10\x01\x12\x08\n\x04HOUR\x10\x02\x12\x07\n\x03\x44\x41Y\x10\x03\x12\x08\n\x04WEEK\x10\x04\x12\t\n\x05MONTH\x10\x05\x12\x08\n\x04YEAR\x10\x06*[\n\tRunStatus\x12\n\n\x06QUEUED\x10\x00\x12\x0b\n\x07RUNNING\x10\x01\x12\r\n\tCOMPLETED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\x12\r\n\tCANCELLED\x10\x04\x12\x0b\n\x07\x45VICTED\x10\x05*(\n\x11IdempotencyMethod\x12\x07\n\x03TTL\x10\x00\x12\n\n\x06STATUS\x10\x01*\x7f\n\x18\x43oncurrencyLimitStrategy\x12\x16\n\x12\x43\x41NCEL_IN_PROGRESS\x10\x00\x12\x0f\n\x0b\x44ROP_NEWEST\x10\x01\x12\x10\n\x0cQUEUE_NEWEST\x10\x02\x12\x15\n\x11GROUP_ROUND_ROBIN\x10\x03\x12\x11\n\rCANCEL_NEWEST\x10\x04\x32\xcf\x03\n\x0c\x41\x64minService\x12R\n\x0bPutWorkflow\x12 .v1.CreateWorkflowVersionRequest\x1a!.v1.CreateWorkflowVersionResponse\x12>\n\x0b\x43\x61ncelTasks\x12\x16.v1.CancelTasksRequest\x1a\x17.v1.CancelTasksResponse\x12>\n\x0bReplayTasks\x12\x16.v1.ReplayTasksRequest\x1a\x17.v1.ReplayTasksResponse\x12S\n\x12TriggerWorkflowRun\x12\x1d.v1.TriggerWorkflowRunRequest\x1a\x1e.v1.TriggerWorkflowRunResponse\x12\x44\n\rGetRunDetails\x12\x18.v1.GetRunDetailsRequest\x1a\x19.v1.GetRunDetailsResponse\x12P\n\x11\x42ranchDurableTask\x12\x1c.v1.BranchDurableTaskRequest\x1a\x1d.v1.BranchDurableTaskResponseBBZ@github.com/hatchet-dev/hatchet/internal/services/shared/proto/v1b\x06proto3"
12
+ descriptor_data = "\n\x12v1/workflows.proto\x12\x02v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x19v1/shared/condition.proto\x1a\x17v1/shared/trigger.proto\"[\n\x12\x43\x61ncelTasksRequest\x12\x14\n\x0c\x65xternal_ids\x18\x01 \x03(\t\x12$\n\x06\x66ilter\x18\x02 \x01(\x0b\x32\x0f.v1.TasksFilterH\x00\x88\x01\x01\x42\t\n\x07_filter\"[\n\x12ReplayTasksRequest\x12\x14\n\x0c\x65xternal_ids\x18\x01 \x03(\t\x12$\n\x06\x66ilter\x18\x02 \x01(\x0b\x32\x0f.v1.TasksFilterH\x00\x88\x01\x01\x42\t\n\x07_filter\"\xb7\x01\n\x0bTasksFilter\x12\x10\n\x08statuses\x18\x01 \x03(\t\x12)\n\x05since\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\x05until\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x88\x01\x01\x12\x14\n\x0cworkflow_ids\x18\x04 \x03(\t\x12\x1b\n\x13\x61\x64\x64itional_metadata\x18\x05 \x03(\tB\x08\n\x06_until\".\n\x13\x43\x61ncelTasksResponse\x12\x17\n\x0f\x63\x61ncelled_tasks\x18\x01 \x03(\t\"-\n\x13ReplayTasksResponse\x12\x16\n\x0ereplayed_tasks\x18\x01 \x03(\t\"\xae\x02\n\x19TriggerWorkflowRunRequest\x12\x15\n\rworkflow_name\x18\x01 \x01(\t\x12\r\n\x05input\x18\x02 \x01(\x0c\x12\x1b\n\x13\x61\x64\x64itional_metadata\x18\x03 \x01(\x0c\x12\x15\n\x08priority\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12U\n\x15\x64\x65sired_worker_labels\x18\x05 \x03(\x0b\x32\x36.v1.TriggerWorkflowRunRequest.DesiredWorkerLabelsEntry\x1aS\n\x18\x44\x65siredWorkerLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.v1.DesiredWorkerLabels:\x02\x38\x01\x42\x0b\n\t_priority\"1\n\x1aTriggerWorkflowRunResponse\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\"X\n\x18\x42ranchDurableTaskRequest\x12\x18\n\x10task_external_id\x18\x01 \x01(\t\x12\x0f\n\x07node_id\x18\x02 \x01(\x03\x12\x11\n\tbranch_id\x18\x03 \x01(\x03\"Y\n\x19\x42ranchDurableTaskResponse\x12\x18\n\x10task_external_id\x18\x01 \x01(\t\x12\x0f\n\x07node_id\x18\x02 \x01(\x03\x12\x11\n\tbranch_id\x18\x03 \x01(\x03\"\xed\x04\n\x1c\x43reateWorkflowVersionRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x16\n\x0e\x65vent_triggers\x18\x04 \x03(\t\x12\x15\n\rcron_triggers\x18\x05 \x03(\t\x12!\n\x05tasks\x18\x06 \x03(\x0b\x32\x12.v1.CreateTaskOpts\x12$\n\x0b\x63oncurrency\x18\x07 \x01(\x0b\x32\x0f.v1.Concurrency\x12\x17\n\ncron_input\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x30\n\x0fon_failure_task\x18\t \x01(\x0b\x32\x12.v1.CreateTaskOptsH\x01\x88\x01\x01\x12\'\n\x06sticky\x18\n \x01(\x0e\x32\x12.v1.StickyStrategyH\x02\x88\x01\x01\x12\x1d\n\x10\x64\x65\x66\x61ult_priority\x18\x0b \x01(\x05H\x03\x88\x01\x01\x12(\n\x0f\x63oncurrency_arr\x18\x0c \x03(\x0b\x32\x0f.v1.Concurrency\x12*\n\x0f\x64\x65\x66\x61ult_filters\x18\r \x03(\x0b\x32\x11.v1.DefaultFilter\x12\x1e\n\x11input_json_schema\x18\x0e \x01(\x0cH\x04\x88\x01\x01\x12/\n\x0bidempotency\x18\x0f \x01(\x0b\x32\x15.v1.IdempotencyConfigH\x05\x88\x01\x01\x42\r\n\x0b_cron_inputB\x12\n\x10_on_failure_taskB\t\n\x07_stickyB\x13\n\x11_default_priorityB\x14\n\x12_input_json_schemaB\x0e\n\x0c_idempotency\"n\n\x11IdempotencyConfig\x12\x12\n\nexpression\x18\x01 \x01(\t\x12\x0e\n\x06ttl_ms\x18\x02 \x01(\x03\x12*\n\x06method\x18\x03 \x01(\x0e\x32\x15.v1.IdempotencyMethodH\x00\x88\x01\x01\x42\t\n\x07_method\"`\n\x19IdempotencyCollisionError\x12 \n\x18\x65xisting_run_external_id\x18\x01 \x01(\t\x12!\n\x19\x63olliding_run_external_id\x18\x02 \x01(\t\"\x87\x01\n$BulkTriggerIdempotencyCollisionError\x12,\n$successful_workflow_run_external_ids\x18\x01 \x03(\t\x12\x31\n\ncollisions\x18\x02 \x03(\x0b\x32\x1d.v1.IdempotencyCollisionError\"T\n\rDefaultFilter\x12\x12\n\nexpression\x18\x01 \x01(\t\x12\r\n\x05scope\x18\x02 \x01(\t\x12\x14\n\x07payload\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x42\n\n\x08_payload\"\x93\x01\n\x0b\x43oncurrency\x12\x12\n\nexpression\x18\x01 \x01(\t\x12\x15\n\x08max_runs\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x39\n\x0elimit_strategy\x18\x03 \x01(\x0e\x32\x1c.v1.ConcurrencyLimitStrategyH\x01\x88\x01\x01\x42\x0b\n\t_max_runsB\x11\n\x0f_limit_strategy\"\x89\x02\n\x0fTaskBatchConfig\x12\x16\n\x0e\x62\x61tch_max_size\x18\x01 \x01(\x05\x12\"\n\x15\x62\x61tch_max_interval_ms\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x1c\n\x0f\x62\x61tch_group_key\x18\x03 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x62\x61tch_group_max_runs\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x10\x62roadcast_output\x18\x05 \x01(\x08H\x03\x88\x01\x01\x42\x18\n\x16_batch_max_interval_msB\x12\n\x10_batch_group_keyB\x17\n\x15_batch_group_max_runsB\x13\n\x11_broadcast_output\"\xea\x05\n\x0e\x43reateTaskOpts\x12\x13\n\x0breadable_id\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x0f\n\x07timeout\x18\x03 \x01(\t\x12\x0e\n\x06inputs\x18\x04 \x01(\t\x12\x0f\n\x07parents\x18\x05 \x03(\t\x12\x0f\n\x07retries\x18\x06 \x01(\x05\x12,\n\x0brate_limits\x18\x07 \x03(\x0b\x32\x17.v1.CreateTaskRateLimit\x12;\n\rworker_labels\x18\x08 \x03(\x0b\x32$.v1.CreateTaskOpts.WorkerLabelsEntry\x12\x1b\n\x0e\x62\x61\x63koff_factor\x18\t \x01(\x02H\x00\x88\x01\x01\x12 \n\x13\x62\x61\x63koff_max_seconds\x18\n \x01(\x05H\x01\x88\x01\x01\x12$\n\x0b\x63oncurrency\x18\x0b \x03(\x0b\x32\x0f.v1.Concurrency\x12+\n\nconditions\x18\x0c \x01(\x0b\x32\x12.v1.TaskConditionsH\x02\x88\x01\x01\x12\x1d\n\x10schedule_timeout\x18\r \x01(\tH\x03\x88\x01\x01\x12\x12\n\nis_durable\x18\x0e \x01(\x08\x12;\n\rslot_requests\x18\x0f \x03(\x0b\x32$.v1.CreateTaskOpts.SlotRequestsEntry\x12\'\n\x05\x62\x61tch\x18\x10 \x01(\x0b\x32\x13.v1.TaskBatchConfigH\x04\x88\x01\x01\x1aL\n\x11WorkerLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.v1.DesiredWorkerLabels:\x02\x38\x01\x1a\x33\n\x11SlotRequestsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x11\n\x0f_backoff_factorB\x16\n\x14_backoff_max_secondsB\r\n\x0b_conditionsB\x13\n\x11_schedule_timeoutB\x08\n\x06_batch\"\xfd\x01\n\x13\x43reateTaskRateLimit\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x12\n\x05units\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08key_expr\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nunits_expr\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x1e\n\x11limit_values_expr\x18\x05 \x01(\tH\x03\x88\x01\x01\x12,\n\x08\x64uration\x18\x06 \x01(\x0e\x32\x15.v1.RateLimitDurationH\x04\x88\x01\x01\x42\x08\n\x06_unitsB\x0b\n\t_key_exprB\r\n\x0b_units_exprB\x14\n\x12_limit_values_exprB\x0b\n\t_duration\"@\n\x1d\x43reateWorkflowVersionResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\"+\n\x14GetRunDetailsRequest\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\"\xaa\x01\n\rTaskRunDetail\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\x12\x1d\n\x06status\x18\x02 \x01(\x0e\x32\r.v1.RunStatus\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06output\x18\x04 \x01(\x0cH\x01\x88\x01\x01\x12\x13\n\x0breadable_id\x18\x05 \x01(\t\x12\x12\n\nis_evicted\x18\x06 \x01(\x08\x42\x08\n\x06_errorB\t\n\x07_output\"\x84\x02\n\x15GetRunDetailsResponse\x12\r\n\x05input\x18\x01 \x01(\x0c\x12\x1d\n\x06status\x18\x02 \x01(\x0e\x32\r.v1.RunStatus\x12:\n\ttask_runs\x18\x03 \x03(\x0b\x32\'.v1.GetRunDetailsResponse.TaskRunsEntry\x12\x0c\n\x04\x64one\x18\x04 \x01(\x08\x12\x1b\n\x13\x61\x64\x64itional_metadata\x18\x05 \x01(\x0c\x12\x12\n\nis_evicted\x18\x06 \x01(\x08\x1a\x42\n\rTaskRunsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.v1.TaskRunDetail:\x02\x38\x01*$\n\x0eStickyStrategy\x12\x08\n\x04SOFT\x10\x00\x12\x08\n\x04HARD\x10\x01*]\n\x11RateLimitDuration\x12\n\n\x06SECOND\x10\x00\x12\n\n\x06MINUTE\x10\x01\x12\x08\n\x04HOUR\x10\x02\x12\x07\n\x03\x44\x41Y\x10\x03\x12\x08\n\x04WEEK\x10\x04\x12\t\n\x05MONTH\x10\x05\x12\x08\n\x04YEAR\x10\x06*[\n\tRunStatus\x12\n\n\x06QUEUED\x10\x00\x12\x0b\n\x07RUNNING\x10\x01\x12\r\n\tCOMPLETED\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\x12\r\n\tCANCELLED\x10\x04\x12\x0b\n\x07\x45VICTED\x10\x05*(\n\x11IdempotencyMethod\x12\x07\n\x03TTL\x10\x00\x12\n\n\x06STATUS\x10\x01*\x7f\n\x18\x43oncurrencyLimitStrategy\x12\x16\n\x12\x43\x41NCEL_IN_PROGRESS\x10\x00\x12\x0f\n\x0b\x44ROP_NEWEST\x10\x01\x12\x10\n\x0cQUEUE_NEWEST\x10\x02\x12\x15\n\x11GROUP_ROUND_ROBIN\x10\x03\x12\x11\n\rCANCEL_NEWEST\x10\x04\x32\xcf\x03\n\x0c\x41\x64minService\x12R\n\x0bPutWorkflow\x12 .v1.CreateWorkflowVersionRequest\x1a!.v1.CreateWorkflowVersionResponse\x12>\n\x0b\x43\x61ncelTasks\x12\x16.v1.CancelTasksRequest\x1a\x17.v1.CancelTasksResponse\x12>\n\x0bReplayTasks\x12\x16.v1.ReplayTasksRequest\x1a\x17.v1.ReplayTasksResponse\x12S\n\x12TriggerWorkflowRun\x12\x1d.v1.TriggerWorkflowRunRequest\x1a\x1e.v1.TriggerWorkflowRunResponse\x12\x44\n\rGetRunDetails\x12\x18.v1.GetRunDetailsRequest\x1a\x19.v1.GetRunDetailsResponse\x12P\n\x11\x42ranchDurableTask\x12\x1c.v1.BranchDurableTaskRequest\x1a\x1d.v1.BranchDurableTaskResponseBBZ@github.com/hatchet-dev/hatchet/internal/services/shared/proto/v1b\x06proto3"
13
13
 
14
14
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
15
15
  pool.add_serialized_file(descriptor_data)
@@ -30,6 +30,7 @@ module V1
30
30
  BulkTriggerIdempotencyCollisionError = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.BulkTriggerIdempotencyCollisionError").msgclass
31
31
  DefaultFilter = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.DefaultFilter").msgclass
32
32
  Concurrency = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.Concurrency").msgclass
33
+ TaskBatchConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.TaskBatchConfig").msgclass
33
34
  CreateTaskOpts = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.CreateTaskOpts").msgclass
34
35
  CreateTaskRateLimit = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.CreateTaskRateLimit").msgclass
35
36
  CreateWorkflowVersionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.CreateWorkflowVersionResponse").msgclass
data/lib/hatchet/task.rb CHANGED
@@ -68,6 +68,9 @@ module Hatchet
68
68
  # @return [Hatchet::EvictionPolicy, nil] Eviction policy for durable tasks
69
69
  attr_reader :eviction_policy
70
70
 
71
+ # @return [Hatchet::BatchTaskConfig, nil] Batch configuration, if this is a batch task
72
+ attr_reader :batch
73
+
71
74
  # @return [Proc, nil] The task execution block
72
75
  attr_reader :fn
73
76
 
@@ -112,6 +115,7 @@ module Hatchet
112
115
  skip_if: [],
113
116
  durable: false,
114
117
  eviction_policy: nil,
118
+ batch: nil,
115
119
  workflow: nil,
116
120
  client: nil,
117
121
  deps: nil,
@@ -131,6 +135,7 @@ module Hatchet
131
135
  @skip_if = skip_if
132
136
  @durable = durable
133
137
  @eviction_policy = eviction_policy
138
+ @batch = batch
134
139
  @workflow = workflow
135
140
  @client = client
136
141
  @deps = deps
@@ -191,6 +196,14 @@ module Hatchet
191
196
 
192
197
  opts[:is_durable] = @durable
193
198
 
199
+ # Batch tasks buffer many concurrent runs into a single execution; per-item retry
200
+ # semantics don't apply, so retries is always forced to 0, regardless of any retries
201
+ # the caller may have supplied.
202
+ if @batch
203
+ opts[:batch] = @batch.to_proto
204
+ opts[:retries] = 0
205
+ end
206
+
194
207
  ::V1::CreateTaskOpts.new(**opts)
195
208
  end
196
209
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hatchet
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.0"
5
5
  end
@@ -226,6 +226,11 @@ module Hatchet
226
226
  end
227
227
 
228
228
  def execute_task(action)
229
+ if batch_action?(action)
230
+ execute_batch_task(action)
231
+ return
232
+ end
233
+
229
234
  action_key = nil
230
235
  prepare_action_execution(action)
231
236
 
@@ -329,6 +334,114 @@ module Hatchet
329
334
  send_result(action, result)
330
335
  end
331
336
 
337
+ def batch_action?(action)
338
+ action.respond_to?(:action_type) && action.action_type == :START_BATCH
339
+ end
340
+
341
+ # Handles a START_BATCH action: invokes the registered batch task block once with
342
+ # every buffered item, then reports completion/failure back per-member (or, for
343
+ # broadcast batch tasks, the same result for every member) via send_batch_action_event.
344
+ def execute_batch_task(action)
345
+ task_key = action.action_id.downcase
346
+ task = @task_map[task_key]
347
+
348
+ unless task
349
+ @logger.error("No task found for action: #{task_key}")
350
+ return
351
+ end
352
+
353
+ batch_items = parse_batch_items(action)
354
+ send_batch_started(action, batch_items.keys)
355
+
356
+ ctx = build_context(action, task)
357
+
358
+ begin
359
+ result = task.call(batch_items, ctx)
360
+
361
+ # If the handler cancelled the batch (ctx.cancel), a CANCELLED batch event
362
+ # covering every member was already sent from within cancel itself. Don't also
363
+ # send a COMPLETED event for the same members afterward.
364
+ send_batch_result(action, task, batch_items, result) unless ctx.cancelled?
365
+ rescue StandardError => e
366
+ @logger.error("Error in batch task #{action.action_id}: #{e.message}")
367
+ send_batch_failure_for_all(action, batch_items.keys, e)
368
+ end
369
+ ensure
370
+ ContextVars.clear
371
+ end
372
+
373
+ def send_batch_started(action, member_ids)
374
+ items = member_ids.map { |id| { task_run_external_id: id } }
375
+ @dispatcher_client.send_batch_action_event(action: action, event_type: :STEP_EVENT_TYPE_STARTED, items: items)
376
+ rescue StandardError => e
377
+ @logger.warn("Failed to send batch STARTED event: #{e.message}")
378
+ end
379
+
380
+ def send_batch_result(action, task, batch_items, result)
381
+ if task.batch.broadcast_output
382
+ payload = JSON.generate(result.nil? ? {} : result)
383
+ items = batch_items.keys.map { |id| { task_run_external_id: id, event_payload: payload } }
384
+ @dispatcher_client.send_batch_action_event(action: action, event_type: :STEP_EVENT_TYPE_COMPLETED, items: items)
385
+ return
386
+ end
387
+
388
+ unless result.is_a?(Hash)
389
+ send_batch_failure_for_all(
390
+ action, batch_items.keys,
391
+ StandardError.new("batch task handler must return a Hash keyed by batch member id"),
392
+ )
393
+ return
394
+ end
395
+
396
+ missing = batch_items.keys - result.keys
397
+ extra = result.keys - batch_items.keys
398
+
399
+ if !missing.empty? || !extra.empty?
400
+ send_batch_failure_for_all(
401
+ action, batch_items.keys,
402
+ StandardError.new("batch task handler result keys do not match batch member ids (missing=#{missing}, extra=#{extra})"),
403
+ )
404
+ return
405
+ end
406
+
407
+ completed_items = []
408
+ failed_items = []
409
+
410
+ result.each do |id, value|
411
+ completed_items << { task_run_external_id: id, event_payload: JSON.generate(value) }
412
+ rescue StandardError => e
413
+ failed_items << { task_run_external_id: id, event_payload: JSON.generate({ "error" => e.message }) }
414
+ end
415
+
416
+ unless completed_items.empty?
417
+ @dispatcher_client.send_batch_action_event(action: action, event_type: :STEP_EVENT_TYPE_COMPLETED, items: completed_items)
418
+ end
419
+
420
+ return if failed_items.empty?
421
+
422
+ @dispatcher_client.send_batch_action_event(action: action, event_type: :STEP_EVENT_TYPE_FAILED, items: failed_items)
423
+ end
424
+
425
+ def send_batch_failure_for_all(action, member_ids, error)
426
+ payload = JSON.generate({ "error" => error.message })
427
+ items = member_ids.map { |id| { task_run_external_id: id, event_payload: payload, should_not_retry: true } }
428
+ @dispatcher_client.send_batch_action_event(action: action, event_type: :STEP_EVENT_TYPE_FAILED, items: items)
429
+ end
430
+
431
+ def parse_batch_items(action)
432
+ raw = action.respond_to?(:action_payload) ? action.action_payload : nil
433
+ return {} if raw.nil? || raw.to_s.empty?
434
+
435
+ parsed = JSON.parse(raw)
436
+ return {} unless parsed.is_a?(Hash)
437
+
438
+ parsed.each_with_object({}) do |(id, item), acc|
439
+ acc[id] = item.is_a?(Hash) && item["payload"].is_a?(Hash) ? (item["payload"]["input"] || {}) : {}
440
+ end
441
+ rescue JSON::ParserError
442
+ {}
443
+ end
444
+
332
445
  def action_key_for(action)
333
446
  "#{action.task_run_external_id}/#{action.retry_count}"
334
447
  end
@@ -130,6 +130,25 @@ module Hatchet
130
130
  task(name, durable: true, eviction_policy: eviction_policy, **opts, &)
131
131
  end
132
132
 
133
+ # Define a batch task within this workflow.
134
+ #
135
+ # Batch tasks buffer concurrent runs until Hatchet flushes the batch (size reached or
136
+ # flush interval), then invoke the block once with all buffered inputs keyed by each
137
+ # run's task-run external id. The block must return a Hash mapping each id to its
138
+ # output, or use +broadcast_output+ on the batch config to return the same result to
139
+ # all callers. retries is always forced to 0 for batch tasks.
140
+ #
141
+ # Preview: batch tasks are in beta and may change in future releases.
142
+ #
143
+ # @param name [Symbol, String] Task name
144
+ # @param batch [Hatchet::BatchTaskConfig] Batch configuration
145
+ # @param opts [Hash] Other Task options forwarded to {#task}.
146
+ # @yield [inputs, ctx] The batch execution block, receiving a Hash of task-run external id => input
147
+ # @return [Task] The created batch task
148
+ def batch_task(name, batch:, **opts, &)
149
+ task(name, batch: batch, **opts, &)
150
+ end
151
+
133
152
  # Define an on_failure task for this workflow
134
153
  #
135
154
  # @param opts [Hash] Task options
data/lib/hatchet-sdk.rb CHANGED
@@ -31,6 +31,7 @@ module Hatchet
31
31
  require_relative "hatchet/conditions"
32
32
  require_relative "hatchet/condition_converter"
33
33
  require_relative "hatchet/rate_limit"
34
+ require_relative "hatchet/batch"
34
35
  require_relative "hatchet/labels"
35
36
  require_relative "hatchet/trigger_options"
36
37
  require_relative "hatchet/default_filter"
@@ -214,6 +215,30 @@ module Hatchet
214
215
  wf.task(name, **opts, &block)
215
216
  end
216
217
 
218
+ # Create a standalone batch task (auto-wraps in a single-task workflow).
219
+ #
220
+ # Batch tasks buffer concurrent runs until Hatchet flushes the batch (size reached or
221
+ # flush interval), then invoke the block once with all buffered inputs keyed by each
222
+ # run's task-run external id. The block must return a Hash mapping each id to its
223
+ # output, or use +broadcast_output+ on the batch config to return the same result to
224
+ # all callers. retries is always forced to 0 for batch tasks.
225
+ #
226
+ # Preview: batch tasks are in beta and may change in future releases.
227
+ #
228
+ # @param name [String] Task name
229
+ # @param batch [Hatchet::BatchTaskConfig] Batch configuration
230
+ # @param opts [Hash] Task options (on_events:, idempotency:, etc.)
231
+ # @yield [inputs, ctx] The batch execution block, receiving a Hash of task-run external id => input
232
+ # @return [Hatchet::Task]
233
+ #
234
+ # @example
235
+ # batch = hatchet.batch_task(name: "my_batch", batch: Hatchet::BatchTaskConfig.new(max_size: 3)) do |inputs, ctx|
236
+ # inputs.transform_values { |input| { "result" => input["message"].upcase } }
237
+ # end
238
+ def batch_task(name:, batch:, **opts, &block)
239
+ task(name: name, batch: batch, **opts, &block)
240
+ end
241
+
217
242
  # Create a standalone durable task.
218
243
  #
219
244
  # @param name [String] Task name
@@ -0,0 +1,12 @@
1
+ module Hatchet
2
+ class BatchTaskConfig
3
+ attr_reader max_size: Integer
4
+ attr_reader max_interval_ms: Integer?
5
+ attr_reader group_key: String?
6
+ attr_reader group_max_runs: Integer?
7
+ attr_reader broadcast_output: bool
8
+
9
+ def initialize: (max_size: Integer, ?max_interval_ms: Integer?, ?group_key: String?, ?group_max_runs: Integer?, ?broadcast_output: bool) -> void
10
+ def to_proto: () -> untyped
11
+ end
12
+ end
data/sig/hatchet/task.rbs CHANGED
@@ -14,6 +14,7 @@ module Hatchet
14
14
  attr_reader skip_if: Array[untyped]
15
15
  attr_reader durable: bool
16
16
  attr_reader eviction_policy: EvictionPolicy?
17
+ attr_reader batch: BatchTaskConfig?
17
18
  attr_reader fn: Proc?
18
19
  attr_reader workflow: Workflow?
19
20
  attr_reader client: Client?
@@ -34,6 +35,7 @@ module Hatchet
34
35
  ?skip_if: Array[untyped],
35
36
  ?durable: bool,
36
37
  ?eviction_policy: EvictionPolicy?,
38
+ ?batch: BatchTaskConfig?,
37
39
  ?workflow: Workflow?,
38
40
  ?client: Client?,
39
41
  ?deps: Hash[Symbol, Proc]?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hatchet-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - gabriel ruttner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-07-22 00:00:00.000000000 Z
11
+ date: 2026-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -185,6 +185,7 @@ files:
185
185
  - Rakefile.rest
186
186
  - config/openapi_generator_config.json
187
187
  - lib/hatchet-sdk.rb
188
+ - lib/hatchet/batch.rb
188
189
  - lib/hatchet/clients.rb
189
190
  - lib/hatchet/clients/grpc/admin.rb
190
191
  - lib/hatchet/clients/grpc/dispatcher.rb
@@ -534,6 +535,7 @@ files:
534
535
  - lib/rubocop/cop/hatchet/rbs_signature_exists.rb
535
536
  - sig/_dependencies.rbs
536
537
  - sig/hatchet-sdk.rbs
538
+ - sig/hatchet/batch.rbs
537
539
  - sig/hatchet/clients.rbs
538
540
  - sig/hatchet/clients/grpc/admin.rbs
539
541
  - sig/hatchet/clients/grpc/dispatcher.rbs