hatchet-sdk 0.3.1 → 0.5.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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -3
  3. data/CHANGELOG.md +12 -0
  4. data/lib/hatchet/clients/grpc/admin.rb +107 -0
  5. data/lib/hatchet/clients/rest/.openapi-generator/FILES +24 -0
  6. data/lib/hatchet/clients/rest/README.md +31 -1
  7. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/durable_tasks_api.rb +113 -0
  8. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/feature_flags_api.rb +107 -0
  9. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/log_api.rb +156 -52
  10. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/observability_api.rb +114 -0
  11. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/rate_limits_api.rb +78 -0
  12. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/task_api.rb +71 -0
  13. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/tenant_api.rb +3 -0
  14. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/worker_api.rb +9 -0
  15. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/workflow_api.rb +170 -0
  16. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/workflow_runs_api.rb +94 -0
  17. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api_model_base.rb +88 -0
  18. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/api_meta.rb +44 -4
  19. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/feature_flag_evaluation_result.rb +238 -0
  20. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/feature_flag_id.rb +41 -0
  21. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_span.rb +525 -0
  22. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_span_kind.rb +44 -0
  23. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_span_list.rb +242 -0
  24. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_status_code.rb +41 -0
  25. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/task_status_stat.rb +13 -4
  26. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant.rb +24 -4
  27. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_member.rb +14 -4
  28. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/trigger_run_result.rb +256 -0
  29. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_additional_metadata_operator.rb +40 -0
  30. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_branch_durable_task_request.rb +310 -0
  31. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_branch_durable_task_response.rb +310 -0
  32. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_api_key.rb +14 -4
  33. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_base.rb +14 -4
  34. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_basic_auth.rb +14 -4
  35. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_hmac.rb +14 -4
  36. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_event_log_entry.rb +470 -0
  37. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_event_log_kind.rb +41 -0
  38. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_wait_condition.rb +286 -0
  39. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_wait_condition_kind.rb +41 -0
  40. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_log_line.rb +49 -1
  41. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_logs_point_metric.rb +341 -0
  42. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_logs_point_metrics.rb +222 -0
  43. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_restore_task_response.rb +237 -0
  44. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_running_detail_count.rb +265 -0
  45. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_running_filter.rb +41 -0
  46. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event_type.rb +3 -1
  47. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_run_metric.rb +13 -4
  48. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_summary.rb +34 -4
  49. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_timing.rb +11 -1
  50. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_trigger_workflow_run_request.rb +14 -4
  51. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_webhook_request.rb +14 -4
  52. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_wait_item.rb +280 -0
  53. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_webhook.rb +14 -4
  54. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker.rb +1 -13
  55. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker_status.rb +41 -0
  56. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_idempotency.rb +265 -0
  57. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_task.rb +393 -0
  58. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_task_desired_worker_label.rb +288 -0
  59. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_task_rate_limit.rb +271 -0
  60. data/lib/hatchet/clients/rest/lib/hatchet-sdk-rest.rb +24 -0
  61. data/lib/hatchet/contracts/v1/workflows_pb.rb +5 -1
  62. data/lib/hatchet/exceptions.rb +28 -0
  63. data/lib/hatchet/idempotency.rb +61 -0
  64. data/lib/hatchet/version.rb +1 -1
  65. data/lib/hatchet/workflow.rb +8 -0
  66. data/lib/hatchet-sdk.rb +66 -74
  67. data/sig/hatchet/idempotency.rbs +17 -0
  68. metadata +47 -2
@@ -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\"\xac\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\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_schema\"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*\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\"\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"
13
13
 
14
14
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
15
15
  pool.add_serialized_file(descriptor_data)
@@ -25,6 +25,9 @@ module V1
25
25
  BranchDurableTaskRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.BranchDurableTaskRequest").msgclass
26
26
  BranchDurableTaskResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.BranchDurableTaskResponse").msgclass
27
27
  CreateWorkflowVersionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.CreateWorkflowVersionRequest").msgclass
28
+ IdempotencyConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.IdempotencyConfig").msgclass
29
+ IdempotencyCollisionError = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.IdempotencyCollisionError").msgclass
30
+ BulkTriggerIdempotencyCollisionError = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.BulkTriggerIdempotencyCollisionError").msgclass
28
31
  DefaultFilter = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.DefaultFilter").msgclass
29
32
  Concurrency = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.Concurrency").msgclass
30
33
  CreateTaskOpts = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.CreateTaskOpts").msgclass
@@ -36,5 +39,6 @@ module V1
36
39
  StickyStrategy = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.StickyStrategy").enummodule
37
40
  RateLimitDuration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.RateLimitDuration").enummodule
38
41
  RunStatus = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.RunStatus").enummodule
42
+ IdempotencyMethod = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.IdempotencyMethod").enummodule
39
43
  ConcurrencyLimitStrategy = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.ConcurrencyLimitStrategy").enummodule
40
44
  end
@@ -24,6 +24,34 @@ module Hatchet
24
24
  end
25
25
  end
26
26
 
27
+ # Raised when an idempotency key collision occurs.
28
+ # Contains the ID of the existing run that claimed the key.
29
+ class IdempotencyCollisionError < Error
30
+ # @return [String] The external ID of the existing workflow run
31
+ attr_reader :existing_run_external_id
32
+
33
+ def initialize(existing_run_external_id)
34
+ @existing_run_external_id = existing_run_external_id
35
+ super("idempotency key collision: existing run #{existing_run_external_id} already exists")
36
+ end
37
+ end
38
+
39
+ # Raised when one or more runs in a bulk trigger collide on idempotency keys.
40
+ # Contains the IDs of successfully triggered runs and the individual collision errors.
41
+ class BulkTriggerIdempotencyCollisionError < Error
42
+ # @return [Array<String>] External IDs of successfully triggered workflow runs
43
+ attr_reader :successful_workflow_run_external_ids
44
+
45
+ # @return [Array<IdempotencyCollisionError>] The individual collision errors
46
+ attr_reader :collisions
47
+
48
+ def initialize(successful_workflow_run_external_ids:, collisions:)
49
+ @successful_workflow_run_external_ids = successful_workflow_run_external_ids
50
+ @collisions = collisions
51
+ super("idempotency key collision in bulk trigger: #{collisions.length} collision(s)")
52
+ end
53
+ end
54
+
27
55
  # Represents an error from a failed task run
28
56
  class TaskRunError < Error
29
57
  # @return [String] The external ID of the failed task run
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hatchet
4
+ # TTL-based idempotency: prevents duplicate runs within a sliding time window.
5
+ #
6
+ # @example
7
+ # Hatchet::TTLBasedIdempotencyConfig.new(expression: "input.id", ttl_ms: 60_000)
8
+ class TTLBasedIdempotencyConfig
9
+ # @return [String] CEL expression evaluated against workflow input
10
+ attr_reader :expression
11
+
12
+ # @return [Integer] How long the idempotency key lives, in milliseconds
13
+ attr_reader :ttl_ms
14
+
15
+ # @param expression [String] CEL expression to derive the idempotency key
16
+ # @param ttl_ms [Integer] TTL for the idempotency key in milliseconds
17
+ def initialize(expression:, ttl_ms:)
18
+ @expression = expression
19
+ @ttl_ms = ttl_ms
20
+ end
21
+
22
+ # @return [V1::IdempotencyConfig]
23
+ def to_proto
24
+ ::V1::IdempotencyConfig.new(
25
+ expression: @expression,
26
+ ttl_ms: @ttl_ms,
27
+ method: ::V1::IdempotencyMethod::TTL,
28
+ )
29
+ end
30
+ end
31
+
32
+ # Status-based idempotency: keeps the idempotency key alive until the associated run
33
+ # reaches a terminal status. +fallback_ttl_ms+ caps how long the key can live before
34
+ # it's evicted, even if the run has not reached a terminal status.
35
+ #
36
+ # @example
37
+ # Hatchet::StatusBasedIdempotencyConfig.new(expression: "input.id", fallback_ttl_ms: 10_000)
38
+ class StatusBasedIdempotencyConfig
39
+ # @return [String] CEL expression evaluated against workflow input
40
+ attr_reader :expression
41
+
42
+ # @return [Integer] Fallback TTL in milliseconds; the longest the key can live
43
+ attr_reader :fallback_ttl_ms
44
+
45
+ # @param expression [String] CEL expression to derive the idempotency key
46
+ # @param fallback_ttl_ms [Integer] Fallback TTL for the idempotency key in milliseconds
47
+ def initialize(expression:, fallback_ttl_ms:)
48
+ @expression = expression
49
+ @fallback_ttl_ms = fallback_ttl_ms
50
+ end
51
+
52
+ # @return [V1::IdempotencyConfig]
53
+ def to_proto
54
+ ::V1::IdempotencyConfig.new(
55
+ expression: @expression,
56
+ ttl_ms: @fallback_ttl_ms,
57
+ method: ::V1::IdempotencyMethod::STATUS,
58
+ )
59
+ end
60
+ end
61
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hatchet
4
- VERSION = "0.3.1"
4
+ VERSION = "0.5.0"
5
5
  end
@@ -46,6 +46,9 @@ module Hatchet
46
46
  # @return [Task, nil] The on_success task
47
47
  attr_reader :on_success
48
48
 
49
+ # @return [Hatchet::TTLBasedIdempotencyConfig, Hatchet::StatusBasedIdempotencyConfig, nil] Idempotency configuration
50
+ attr_reader :idempotency
51
+
49
52
  # @return [String, nil] The workflow ID writer (set after registration)
50
53
  attr_writer :id
51
54
 
@@ -57,6 +60,7 @@ module Hatchet
57
60
  # @param task_defaults [Hash, nil] Default task settings
58
61
  # @param default_filters [Array<DefaultFilter>] Default filters
59
62
  # @param sticky [Symbol, nil] Sticky strategy
63
+ # @param idempotency [Hatchet::TTLBasedIdempotencyConfig, Hatchet::StatusBasedIdempotencyConfig, nil] Idempotency configuration
60
64
  # @param client [Hatchet::Client, nil] The client
61
65
  def initialize(
62
66
  name:,
@@ -67,6 +71,7 @@ module Hatchet
67
71
  task_defaults: nil,
68
72
  default_filters: [],
69
73
  sticky: nil,
74
+ idempotency: nil,
70
75
  client: nil
71
76
  )
72
77
  @name = name
@@ -78,6 +83,7 @@ module Hatchet
78
83
  @task_defaults = task_defaults
79
84
  @default_filters = default_filters
80
85
  @sticky = sticky
86
+ @idempotency = idempotency
81
87
  @client = client
82
88
  @on_failure = nil
83
89
  @on_success = nil
@@ -208,6 +214,8 @@ module Hatchet
208
214
  args[:default_priority] = @default_priority if @default_priority
209
215
  args[:default_filters] = filter_protos unless filter_protos.empty?
210
216
 
217
+ args[:idempotency] = @idempotency.to_proto if @idempotency
218
+
211
219
  ::V1::CreateWorkflowVersionRequest.new(**args)
212
220
  end
213
221
 
data/lib/hatchet-sdk.rb CHANGED
@@ -3,80 +3,72 @@
3
3
  require_relative "hatchet/version"
4
4
  require_relative "hatchet/config"
5
5
 
6
- # Define base error class before loading submodules that depend on it
7
- module Hatchet
8
- # Base error class for all Hatchet-related errors
9
- class Error < StandardError; end
10
- end
11
-
12
- require_relative "hatchet/clients"
13
- require_relative "hatchet/features/events"
14
- require_relative "hatchet/features/runs"
15
- require_relative "hatchet/features/tenant"
16
- require_relative "hatchet/features/logs"
17
- require_relative "hatchet/features/workers"
18
- require_relative "hatchet/features/cel"
19
- require_relative "hatchet/features/workflows"
20
- require_relative "hatchet/features/filters"
21
- require_relative "hatchet/features/metrics"
22
- require_relative "hatchet/features/rate_limits"
23
- require_relative "hatchet/features/cron"
24
- require_relative "hatchet/features/scheduled"
25
-
26
- # Core classes
27
- require_relative "hatchet/exceptions"
28
- require_relative "hatchet/engine_version"
29
- require_relative "hatchet/eviction_policy"
30
- require_relative "hatchet/concurrency"
31
- require_relative "hatchet/conditions"
32
- require_relative "hatchet/condition_converter"
33
- require_relative "hatchet/rate_limit"
34
- require_relative "hatchet/labels"
35
- require_relative "hatchet/trigger_options"
36
- require_relative "hatchet/default_filter"
37
- require_relative "hatchet/workflow_run"
38
- require_relative "hatchet/context"
39
- require_relative "hatchet/durable_context"
40
- require_relative "hatchet/task"
41
- require_relative "hatchet/workflow"
42
- require_relative "hatchet/context_vars"
43
- require_relative "hatchet/worker_obj"
44
-
45
- # gRPC connection and client infrastructure
46
- require_relative "hatchet/connection"
47
-
48
- # Generated protobuf contracts (add contracts directory to load path for internal requires)
49
- $LOAD_PATH.unshift(File.join(__dir__, "hatchet", "contracts")) unless $LOAD_PATH.include?(File.join(__dir__, "hatchet", "contracts"))
50
- require_relative "hatchet/contracts/dispatcher/dispatcher_pb"
51
- require_relative "hatchet/contracts/dispatcher/dispatcher_services_pb"
52
- require_relative "hatchet/contracts/events/events_pb"
53
- require_relative "hatchet/contracts/events/events_services_pb"
54
- require_relative "hatchet/contracts/workflows/workflows_pb"
55
- require_relative "hatchet/contracts/workflows/workflows_services_pb"
56
- require_relative "hatchet/contracts/v1/shared/condition_pb"
57
- require_relative "hatchet/contracts/v1/shared/trigger_pb"
58
- require_relative "hatchet/contracts/v1/dispatcher_pb"
59
- require_relative "hatchet/contracts/v1/dispatcher_services_pb"
60
- require_relative "hatchet/contracts/v1/workflows_pb"
61
- require_relative "hatchet/contracts/v1/workflows_services_pb"
62
-
63
- # gRPC client wrappers
64
- require_relative "hatchet/clients/grpc/dispatcher"
65
- require_relative "hatchet/clients/grpc/admin"
66
- require_relative "hatchet/clients/grpc/event_client"
67
-
68
- # Worker runtime
69
- require_relative "hatchet/worker/action_listener"
70
- require_relative "hatchet/worker/workflow_run_listener"
71
- require_relative "hatchet/worker/durable_eviction/cache"
72
- require_relative "hatchet/worker/durable_eviction/manager"
73
- require_relative "hatchet/worker/durable_event_listener"
74
- require_relative "hatchet/worker/runner"
75
-
76
6
  # Ruby SDK for Hatchet workflow engine
77
7
  #
78
8
  # @see https://docs.hatchet.run for Hatchet documentation
79
9
  module Hatchet
10
+ class Error < StandardError; end
11
+
12
+ require_relative "hatchet/clients"
13
+ require_relative "hatchet/features/events"
14
+ require_relative "hatchet/features/runs"
15
+ require_relative "hatchet/features/tenant"
16
+ require_relative "hatchet/features/logs"
17
+ require_relative "hatchet/features/workers"
18
+ require_relative "hatchet/features/cel"
19
+ require_relative "hatchet/features/workflows"
20
+ require_relative "hatchet/features/filters"
21
+ require_relative "hatchet/features/metrics"
22
+ require_relative "hatchet/features/rate_limits"
23
+ require_relative "hatchet/features/cron"
24
+ require_relative "hatchet/features/scheduled"
25
+
26
+ require_relative "hatchet/exceptions"
27
+ require_relative "hatchet/engine_version"
28
+ require_relative "hatchet/eviction_policy"
29
+ require_relative "hatchet/concurrency"
30
+ require_relative "hatchet/idempotency"
31
+ require_relative "hatchet/conditions"
32
+ require_relative "hatchet/condition_converter"
33
+ require_relative "hatchet/rate_limit"
34
+ require_relative "hatchet/labels"
35
+ require_relative "hatchet/trigger_options"
36
+ require_relative "hatchet/default_filter"
37
+ require_relative "hatchet/workflow_run"
38
+ require_relative "hatchet/context"
39
+ require_relative "hatchet/durable_context"
40
+ require_relative "hatchet/task"
41
+ require_relative "hatchet/workflow"
42
+ require_relative "hatchet/context_vars"
43
+ require_relative "hatchet/worker_obj"
44
+
45
+ require_relative "hatchet/connection"
46
+
47
+ $LOAD_PATH.unshift(File.join(__dir__, "hatchet", "contracts")) unless $LOAD_PATH.include?(File.join(__dir__, "hatchet", "contracts"))
48
+ require_relative "hatchet/contracts/dispatcher/dispatcher_pb"
49
+ require_relative "hatchet/contracts/dispatcher/dispatcher_services_pb"
50
+ require_relative "hatchet/contracts/events/events_pb"
51
+ require_relative "hatchet/contracts/events/events_services_pb"
52
+ require_relative "hatchet/contracts/workflows/workflows_pb"
53
+ require_relative "hatchet/contracts/workflows/workflows_services_pb"
54
+ require_relative "hatchet/contracts/v1/shared/condition_pb"
55
+ require_relative "hatchet/contracts/v1/shared/trigger_pb"
56
+ require_relative "hatchet/contracts/v1/dispatcher_pb"
57
+ require_relative "hatchet/contracts/v1/dispatcher_services_pb"
58
+ require_relative "hatchet/contracts/v1/workflows_pb"
59
+ require_relative "hatchet/contracts/v1/workflows_services_pb"
60
+
61
+ require_relative "hatchet/clients/grpc/dispatcher"
62
+ require_relative "hatchet/clients/grpc/admin"
63
+ require_relative "hatchet/clients/grpc/event_client"
64
+
65
+ require_relative "hatchet/worker/action_listener"
66
+ require_relative "hatchet/worker/workflow_run_listener"
67
+ require_relative "hatchet/worker/durable_eviction/cache"
68
+ require_relative "hatchet/worker/durable_eviction/manager"
69
+ require_relative "hatchet/worker/durable_event_listener"
70
+ require_relative "hatchet/worker/runner"
71
+
80
72
  # The main client for interacting with Hatchet services.
81
73
  #
82
74
  # @example Basic usage with API token
@@ -195,7 +187,7 @@ module Hatchet
195
187
  # Create a new workflow definition
196
188
  #
197
189
  # @param name [String] Workflow name
198
- # @param opts [Hash] Workflow options
190
+ # @param opts [Hash] Workflow options (on_events:, concurrency:, idempotency:, etc.)
199
191
  # @return [Hatchet::Workflow]
200
192
  #
201
193
  # @example
@@ -208,17 +200,17 @@ module Hatchet
208
200
  # Create a standalone task (auto-wraps in a single-task workflow)
209
201
  #
210
202
  # @param name [String] Task name
211
- # @param opts [Hash] Task options
203
+ # @param opts [Hash] Task options (on_events:, idempotency:, retries:, etc.)
212
204
  # @yield [input, ctx] The task execution block
213
205
  # @return [Hatchet::Task]
214
206
  #
215
207
  # @example
216
208
  # my_task = hatchet.task(name: "my_task") { |input, ctx| { "result" => "done" } }
217
209
  def task(name:, **opts, &block)
218
- # Create a workflow wrapper for standalone tasks
219
210
  wf = Workflow.new(name: name, client: self,
220
211
  on_events: opts.delete(:on_events) || [],
221
- default_filters: opts.delete(:default_filters) || [],)
212
+ default_filters: opts.delete(:default_filters) || [],
213
+ idempotency: opts.delete(:idempotency),)
222
214
  wf.task(name, **opts, &block)
223
215
  end
224
216
 
@@ -0,0 +1,17 @@
1
+ module Hatchet
2
+ class TTLBasedIdempotencyConfig
3
+ attr_reader expression: String
4
+ attr_reader ttl_ms: Integer
5
+
6
+ def initialize: (expression: String, ttl_ms: Integer) -> void
7
+ def to_proto: () -> untyped
8
+ end
9
+
10
+ class StatusBasedIdempotencyConfig
11
+ attr_reader expression: String
12
+ attr_reader fallback_ttl_ms: Integer
13
+
14
+ def initialize: (expression: String, fallback_ttl_ms: Integer) -> void
15
+ def to_proto: () -> untyped
16
+ end
17
+ 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.3.1
4
+ version: 0.5.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-06-12 00:00:00.000000000 Z
11
+ date: 2026-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: googleapis-common-protos-types
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: google-protobuf
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -193,12 +207,15 @@ files:
193
207
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/api_token_api.rb
194
208
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/cel_api.rb
195
209
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/default_api.rb
210
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/durable_tasks_api.rb
196
211
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/event_api.rb
212
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/feature_flags_api.rb
197
213
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/filter_api.rb
198
214
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/github_api.rb
199
215
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/healthcheck_api.rb
200
216
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/log_api.rb
201
217
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/metadata_api.rb
218
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/observability_api.rb
202
219
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/rate_limits_api.rb
203
220
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/slack_api.rb
204
221
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/sns_api.rb
@@ -213,6 +230,7 @@ files:
213
230
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api/workflow_runs_api.rb
214
231
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api_client.rb
215
232
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api_error.rb
233
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/api_model_base.rb
216
234
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/configuration.rb
217
235
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/accept_invite_request.rb
218
236
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/api_error.rb
@@ -251,6 +269,8 @@ files:
251
269
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/event_update_cancel200_response.rb
252
270
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/event_workflow_run_summary.rb
253
271
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/events.rb
272
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/feature_flag_evaluation_result.rb
273
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/feature_flag_id.rb
254
274
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/get_step_run_diff_response.rb
255
275
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/info_get_version200_response.rb
256
276
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/job.rb
@@ -265,6 +285,10 @@ files:
265
285
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/log_line_list.rb
266
286
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/log_line_order_by_direction.rb
267
287
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/log_line_order_by_field.rb
288
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_span.rb
289
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_span_kind.rb
290
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_span_list.rb
291
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/otel_status_code.rb
268
292
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/pagination_response.rb
269
293
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/pull_request.rb
270
294
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/pull_request_state.rb
@@ -325,6 +349,7 @@ files:
325
349
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_resource_policy.rb
326
350
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_step_run_queue_metrics.rb
327
351
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/tenant_version.rb
352
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/trigger_run_result.rb
328
353
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/trigger_workflow_run_request.rb
329
354
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/update_cron_workflow_trigger_request.rb
330
355
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/update_scheduled_workflow_run_request.rb
@@ -339,6 +364,9 @@ files:
339
364
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/user_register_request.rb
340
365
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/user_tenant_memberships_list.rb
341
366
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/user_tenant_public.rb
367
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_additional_metadata_operator.rb
368
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_branch_durable_task_request.rb
369
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_branch_durable_task_response.rb
342
370
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_cancel_task_request.rb
343
371
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_cancelled_tasks.rb
344
372
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_cel_debug_request.rb
@@ -351,6 +379,10 @@ files:
351
379
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_basic_auth.rb
352
380
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_create_webhook_request_hmac.rb
353
381
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_dag_children.rb
382
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_event_log_entry.rb
383
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_event_log_kind.rb
384
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_wait_condition.rb
385
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_durable_wait_condition_kind.rb
354
386
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_event.rb
355
387
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_event_list.rb
356
388
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_event_triggered_run.rb
@@ -361,8 +393,13 @@ files:
361
393
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_log_line_level.rb
362
394
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_log_line_list.rb
363
395
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_log_line_order_by_direction.rb
396
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_logs_point_metric.rb
397
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_logs_point_metrics.rb
364
398
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_replay_task_request.rb
365
399
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_replayed_tasks.rb
400
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_restore_task_response.rb
401
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_running_detail_count.rb
402
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_running_filter.rb
366
403
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event.rb
367
404
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event_list.rb
368
405
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_task_event_type.rb
@@ -379,6 +416,7 @@ files:
379
416
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_trigger_workflow_run_request.rb
380
417
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_filter_request.rb
381
418
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_update_webhook_request.rb
419
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_wait_item.rb
382
420
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_webhook.rb
383
421
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_webhook_api_key_auth.rb
384
422
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/v1_webhook_auth_type.rb
@@ -408,6 +446,7 @@ files:
408
446
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker_runtime_info.rb
409
447
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker_runtime_sdks.rb
410
448
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker_slot_config.rb
449
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker_status.rb
411
450
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/worker_type.rb
412
451
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow.rb
413
452
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_concurrency.rb
@@ -432,7 +471,11 @@ files:
432
471
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_update_request.rb
433
472
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version.rb
434
473
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_definition.rb
474
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_idempotency.rb
435
475
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_meta.rb
476
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_task.rb
477
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_task_desired_worker_label.rb
478
+ - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_version_task_rate_limit.rb
436
479
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/models/workflow_workers_count.rb
437
480
  - lib/hatchet/clients/rest/lib/hatchet-sdk-rest/version.rb
438
481
  - lib/hatchet/clients/rest/spec/spec_helper.rb
@@ -472,6 +515,7 @@ files:
472
515
  - lib/hatchet/features/tenant.rb
473
516
  - lib/hatchet/features/workers.rb
474
517
  - lib/hatchet/features/workflows.rb
518
+ - lib/hatchet/idempotency.rb
475
519
  - lib/hatchet/labels.rb
476
520
  - lib/hatchet/rate_limit.rb
477
521
  - lib/hatchet/task.rb
@@ -519,6 +563,7 @@ files:
519
563
  - sig/hatchet/features/tenant.rbs
520
564
  - sig/hatchet/features/workers.rbs
521
565
  - sig/hatchet/features/workflows.rbs
566
+ - sig/hatchet/idempotency.rbs
522
567
  - sig/hatchet/labels.rbs
523
568
  - sig/hatchet/rate_limit.rbs
524
569
  - sig/hatchet/task.rbs