hatchet-sdk 0.10.0 → 0.11.1

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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/lib/hatchet/clients/grpc/admin.rb +20 -0
  4. data/lib/hatchet/clients/rest/.openapi-generator/FILES +10 -0
  5. data/lib/hatchet/clients/rest/README.md +16 -0
  6. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/serverless_api.rb +405 -0
  7. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/streams_api.rb +80 -0
  8. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/tenant_api.rb +71 -0
  9. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/rate_limit.rb +14 -4
  10. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_entitlements.rb +367 -0
  11. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_serverless_endpoint_request.rb +411 -0
  12. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint.rb +556 -0
  13. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint_kind.rb +40 -0
  14. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint_list.rb +231 -0
  15. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint_status.rb +271 -0
  16. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_stream_topic.rb +343 -0
  17. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_stream_topic_list.rb +292 -0
  18. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_serverless_endpoint_request.rb +354 -0
  19. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow.rb +14 -4
  20. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest.rb +10 -0
  21. data/lib/hatchet/context.rb +13 -0
  22. data/lib/hatchet/contracts/v1/dispatcher_pb.rb +2 -1
  23. data/lib/hatchet/contracts/workflows/workflows_pb.rb +3 -1
  24. data/lib/hatchet/contracts/workflows/workflows_services_pb.rb +1 -0
  25. data/lib/hatchet/features/rate_limits.rb +13 -0
  26. data/lib/hatchet/version.rb +1 -1
  27. data/lib/hatchet/worker/durable_event_listener.rb +5 -5
  28. data/lib/hatchet/worker/received_satisfied_orders.rb +49 -0
  29. data/lib/hatchet/worker/runner.rb +6 -2
  30. data/lib/hatchet-sdk.rb +1 -0
  31. data/sig/hatchet/clients/grpc/admin.rbs +1 -0
  32. data/sig/hatchet/context.rbs +1 -0
  33. data/sig/hatchet/features/rate_limits.rbs +1 -0
  34. data/sig/hatchet/worker/received_satisfied_orders.rbs +11 -0
  35. metadata +14 -2
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hatchet
4
+ module WorkerRuntime
5
+ # The highest satisfied_order received per (task_external_id, invocation_count). Reported in
6
+ # worker status requests so that after a reconnect the server resumes ordered delivery where
7
+ # this worker left off instead of waiting for orders it already sent.
8
+ #
9
+ # Not thread-safe; the durable event listener guards it with its own lock.
10
+ class ReceivedSatisfiedOrders
11
+ def initialize
12
+ @highest_by_invocation = {}
13
+ end
14
+
15
+ def record(completed)
16
+ return unless completed.has_satisfied_order?
17
+
18
+ invocation = [completed.ref.durable_task_external_id, completed.ref.invocation_count]
19
+ @highest_by_invocation[invocation] = [@highest_by_invocation.fetch(invocation, 0), completed.satisfied_order].max
20
+ end
21
+
22
+ # callback_keys are [task_external_id, invocation_count, branch_id, node_id]
23
+ def to_proto_for(callback_keys)
24
+ invocations = callback_keys.map { |(task_external_id, invocation_count, _, _)| [task_external_id, invocation_count] }
25
+
26
+ invocations.uniq.filter_map do |(durable_task_external_id, invocation_count)|
27
+ highest_received = @highest_by_invocation[[durable_task_external_id, invocation_count]]
28
+ next if highest_received.nil?
29
+
30
+ ::V1::DurableTaskReceivedSatisfiedOrder.new(
31
+ durable_task_external_id: durable_task_external_id,
32
+ invocation_count: invocation_count,
33
+ highest_received_satisfied_order: highest_received,
34
+ )
35
+ end
36
+ end
37
+
38
+ def delete_through(durable_task_external_id, invocation_count)
39
+ @highest_by_invocation.delete_if do |(task_external_id, recorded_invocation_count), _|
40
+ task_external_id == durable_task_external_id && recorded_invocation_count <= invocation_count
41
+ end
42
+ end
43
+
44
+ def clear
45
+ @highest_by_invocation.clear
46
+ end
47
+ end
48
+ end
49
+ end
@@ -467,9 +467,13 @@ module Hatchet
467
467
  end
468
468
 
469
469
  def cleanup_action(action_key)
470
- @contexts_mu.synchronize do
471
- @contexts.delete(action_key)
470
+ ctx = @contexts_mu.synchronize do
472
471
  @task_threads.delete(action_key)
472
+ @contexts.delete(action_key)
473
+ end
474
+
475
+ if @durable_event_listener && ctx.is_a?(DurableContext)
476
+ @durable_event_listener.cleanup_task_state(ctx.step_run_id, ctx.invocation_count || 1)
473
477
  end
474
478
 
475
479
  @eviction_manager&.unregister_run(action_key)
data/lib/hatchet-sdk.rb CHANGED
@@ -67,6 +67,7 @@ module Hatchet
67
67
  require_relative "hatchet/worker/workflow_run_listener"
68
68
  require_relative "hatchet/worker/durable_eviction/cache"
69
69
  require_relative "hatchet/worker/durable_eviction/manager"
70
+ require_relative "hatchet/worker/received_satisfied_orders"
70
71
  require_relative "hatchet/worker/durable_event_listener"
71
72
  require_relative "hatchet/worker/runner"
72
73
 
@@ -28,6 +28,7 @@ module Hatchet
28
28
 
29
29
  def get_run_details: (external_id: String) -> untyped
30
30
  def put_rate_limit: (key: String, limit: Integer, duration: Symbol) -> untyped
31
+ def pause_rate_limit: (key: String, until_time: Time) -> Time
31
32
  def close: () -> void
32
33
  end
33
34
  end
@@ -32,6 +32,7 @@ module Hatchet
32
32
  def cancel: () -> void
33
33
  def refresh_timeout: (Integer | String duration) -> void
34
34
  def release_slot: () -> void
35
+ def pause_rate_limit: (String key, until_time: Time) -> Time
35
36
  def put_stream: (String data) -> void
36
37
  def task_run_errors: () -> Array[TaskRunError]
37
38
  def get_task_run_error: (Task | Symbol | String task_ref) -> TaskRunError?
@@ -3,6 +3,7 @@ module Hatchet
3
3
  class RateLimits
4
4
  def initialize: (Hatchet::Clients::Grpc::Admin admin_grpc, Hatchet::Config config) -> void
5
5
  def put: (key: String, limit: Integer, ?duration: Symbol) -> void
6
+ def pause: (key: String, until_time: Time) -> Time
6
7
  end
7
8
  end
8
9
  end
@@ -0,0 +1,11 @@
1
+ module Hatchet
2
+ module WorkerRuntime
3
+ class ReceivedSatisfiedOrders
4
+ def initialize: () -> void
5
+ def record: (untyped completed) -> void
6
+ def to_proto_for: (Array[[String, Integer, Integer, Integer]] callback_keys) -> Array[untyped]
7
+ def delete_through: (String durable_task_external_id, Integer invocation_count) -> void
8
+ def clear: () -> void
9
+ end
10
+ end
11
+ end
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.10.0
4
+ version: 0.11.1
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-10-09 00:00:00.000000000 Z
11
+ date: 2026-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -218,6 +218,7 @@ files:
218
218
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/metadata_api.rb
219
219
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/observability_api.rb
220
220
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/rate_limits_api.rb
221
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/serverless_api.rb
221
222
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/slack_api.rb
222
223
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/sns_api.rb
223
224
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/step_run_api.rb
@@ -341,6 +342,7 @@ files:
341
342
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_alert_email_group.rb
342
343
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_alert_email_group_list.rb
343
344
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_alerting_settings.rb
345
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_entitlements.rb
344
346
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_environment.rb
345
347
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_invite.rb
346
348
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_invite_list.rb
@@ -378,6 +380,7 @@ files:
378
380
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_cel_debug_response.rb
379
381
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_cel_debug_response_status.rb
380
382
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_filter_request.rb
383
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_serverless_endpoint_request.rb
381
384
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request.rb
382
385
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_api_key.rb
383
386
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_base.rb
@@ -405,7 +408,13 @@ files:
405
408
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_restore_task_response.rb
406
409
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_running_detail_count.rb
407
410
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_running_filter.rb
411
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint.rb
412
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint_kind.rb
413
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint_list.rb
414
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_serverless_endpoint_status.rb
408
415
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_stream_payload_ref.rb
416
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_stream_topic.rb
417
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_stream_topic_list.rb
409
418
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event.rb
410
419
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event_list.rb
411
420
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event_type.rb
@@ -421,6 +430,7 @@ files:
421
430
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_timing_list.rb
422
431
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_trigger_workflow_run_request.rb
423
432
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_filter_request.rb
433
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_serverless_endpoint_request.rb
424
434
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_webhook_request.rb
425
435
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_wait_item.rb
426
436
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_webhook.rb
@@ -534,6 +544,7 @@ files:
534
544
  - lib/hatchet/worker/durable_eviction/cache.rb
535
545
  - lib/hatchet/worker/durable_eviction/manager.rb
536
546
  - lib/hatchet/worker/health_check.rb
547
+ - lib/hatchet/worker/received_satisfied_orders.rb
537
548
  - lib/hatchet/worker/runner.rb
538
549
  - lib/hatchet/worker/workflow_run_listener.rb
539
550
  - lib/hatchet/worker_obj.rb
@@ -583,6 +594,7 @@ files:
583
594
  - sig/hatchet/worker/durable_eviction/cache.rbs
584
595
  - sig/hatchet/worker/durable_eviction/manager.rbs
585
596
  - sig/hatchet/worker/health_check.rbs
597
+ - sig/hatchet/worker/received_satisfied_orders.rbs
586
598
  - sig/hatchet/worker/runner.rbs
587
599
  - sig/hatchet/worker/workflow_run_listener.rbs
588
600
  - sig/hatchet/worker_obj.rbs