hatchet-sdk 0.47.1__py3-none-any.whl → 1.0.0a1__py3-none-any.whl

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.

Potentially problematic release.


This version of hatchet-sdk might be problematic. Click here for more details.

Files changed (329) hide show
  1. hatchet_sdk/__init__.py +45 -25
  2. hatchet_sdk/client.py +19 -94
  3. hatchet_sdk/clients/admin.py +309 -389
  4. hatchet_sdk/clients/dispatcher/action_listener.py +131 -109
  5. hatchet_sdk/clients/dispatcher/dispatcher.py +39 -37
  6. hatchet_sdk/clients/durable_event_listener.py +327 -0
  7. hatchet_sdk/clients/event_ts.py +23 -10
  8. hatchet_sdk/clients/events.py +96 -99
  9. hatchet_sdk/clients/rest/__init__.py +35 -0
  10. hatchet_sdk/clients/rest/api/__init__.py +2 -0
  11. hatchet_sdk/clients/rest/api/log_api.py +258 -0
  12. hatchet_sdk/clients/rest/api/task_api.py +2200 -0
  13. hatchet_sdk/clients/rest/api/workflow_runs_api.py +1274 -116
  14. hatchet_sdk/clients/rest/api_client.py +1 -1
  15. hatchet_sdk/clients/rest/configuration.py +8 -1
  16. hatchet_sdk/clients/rest/exceptions.py +21 -0
  17. hatchet_sdk/clients/rest/models/__init__.py +33 -0
  18. hatchet_sdk/clients/rest/models/tenant.py +4 -0
  19. hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
  20. hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
  21. hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
  22. hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
  23. hatchet_sdk/clients/rest/models/v1_log_line.py +94 -0
  24. hatchet_sdk/clients/rest/models/v1_log_line_level.py +39 -0
  25. hatchet_sdk/clients/rest/models/v1_log_line_list.py +110 -0
  26. hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
  27. hatchet_sdk/clients/rest/models/v1_task.py +174 -0
  28. hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
  29. hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
  30. hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
  31. hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
  32. hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
  33. hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
  34. hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
  35. hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
  36. hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
  37. hatchet_sdk/clients/rest/models/v1_task_summary.py +228 -0
  38. hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
  39. hatchet_sdk/clients/rest/models/v1_trigger_workflow_run_request.py +95 -0
  40. hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
  41. hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
  42. hatchet_sdk/clients/rest/models/v1_workflow_run_display_name.py +98 -0
  43. hatchet_sdk/clients/rest/models/v1_workflow_run_display_name_list.py +114 -0
  44. hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
  45. hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +104 -0
  46. hatchet_sdk/clients/rest/rest.py +37 -26
  47. hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
  48. hatchet_sdk/clients/rest_client.py +153 -116
  49. hatchet_sdk/clients/run_event_listener.py +65 -60
  50. hatchet_sdk/clients/workflow_listener.py +75 -66
  51. hatchet_sdk/config.py +117 -0
  52. hatchet_sdk/connection.py +27 -13
  53. hatchet_sdk/context/__init__.py +0 -1
  54. hatchet_sdk/context/context.py +118 -280
  55. hatchet_sdk/contracts/dispatcher_pb2_grpc.py +1 -1
  56. hatchet_sdk/contracts/events_pb2.py +2 -2
  57. hatchet_sdk/contracts/events_pb2_grpc.py +1 -1
  58. hatchet_sdk/contracts/v1/dispatcher_pb2.py +36 -0
  59. hatchet_sdk/contracts/v1/dispatcher_pb2.pyi +38 -0
  60. hatchet_sdk/contracts/v1/dispatcher_pb2_grpc.py +145 -0
  61. hatchet_sdk/contracts/v1/shared/condition_pb2.py +39 -0
  62. hatchet_sdk/contracts/v1/shared/condition_pb2.pyi +72 -0
  63. hatchet_sdk/contracts/v1/shared/condition_pb2_grpc.py +29 -0
  64. hatchet_sdk/contracts/v1/workflows_pb2.py +67 -0
  65. hatchet_sdk/contracts/v1/workflows_pb2.pyi +228 -0
  66. hatchet_sdk/contracts/v1/workflows_pb2_grpc.py +234 -0
  67. hatchet_sdk/contracts/workflows_pb2_grpc.py +1 -1
  68. hatchet_sdk/features/cron.py +43 -57
  69. hatchet_sdk/features/scheduled.py +60 -74
  70. hatchet_sdk/hatchet.py +491 -218
  71. hatchet_sdk/labels.py +4 -6
  72. hatchet_sdk/metadata.py +1 -1
  73. hatchet_sdk/opentelemetry/instrumentor.py +17 -18
  74. hatchet_sdk/rate_limit.py +40 -55
  75. hatchet_sdk/runnables/contextvars.py +12 -0
  76. hatchet_sdk/runnables/standalone.py +194 -0
  77. hatchet_sdk/runnables/task.py +144 -0
  78. hatchet_sdk/runnables/types.py +138 -0
  79. hatchet_sdk/runnables/workflow.py +764 -0
  80. hatchet_sdk/token.py +13 -9
  81. hatchet_sdk/utils/aio_utils.py +0 -119
  82. hatchet_sdk/utils/proto_enums.py +47 -0
  83. hatchet_sdk/utils/timedelta_to_expression.py +23 -0
  84. hatchet_sdk/utils/typing.py +10 -2
  85. hatchet_sdk/v0/__init__.py +251 -0
  86. hatchet_sdk/v0/client.py +119 -0
  87. hatchet_sdk/v0/clients/admin.py +541 -0
  88. hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
  89. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
  90. hatchet_sdk/v0/clients/event_ts.py +28 -0
  91. hatchet_sdk/v0/clients/events.py +182 -0
  92. hatchet_sdk/v0/clients/rest/__init__.py +307 -0
  93. hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
  94. hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
  95. hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
  96. hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
  97. hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
  98. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
  99. hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
  100. hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
  101. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
  102. hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
  103. hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
  104. hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
  105. hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
  106. hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
  107. hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
  108. hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
  109. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
  110. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
  111. hatchet_sdk/v0/clients/rest/api_client.py +759 -0
  112. hatchet_sdk/v0/clients/rest/api_response.py +22 -0
  113. hatchet_sdk/v0/clients/rest/configuration.py +611 -0
  114. hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
  115. hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
  116. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
  117. hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
  118. hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
  119. hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
  120. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
  121. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
  122. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
  123. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
  124. hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
  125. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
  126. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
  127. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
  128. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
  129. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
  130. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
  131. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
  132. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
  133. hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
  134. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
  135. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
  136. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
  137. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
  138. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
  139. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
  140. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
  141. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
  142. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
  143. hatchet_sdk/v0/clients/rest/models/event.py +143 -0
  144. hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
  145. hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
  146. hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
  147. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
  148. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
  149. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
  150. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
  151. hatchet_sdk/v0/clients/rest/models/events.py +110 -0
  152. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
  153. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
  154. hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
  155. hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
  156. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
  157. hatchet_sdk/v0/clients/rest/models/job.py +132 -0
  158. hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
  159. hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
  160. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
  161. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
  162. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
  163. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
  164. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
  165. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
  166. hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
  167. hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
  168. hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
  169. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
  170. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
  171. hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
  172. hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
  173. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
  174. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
  175. hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
  176. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
  177. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
  178. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
  179. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
  180. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
  181. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
  182. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
  183. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
  184. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
  185. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
  186. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
  187. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
  188. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
  189. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
  190. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
  191. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
  192. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
  193. hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
  194. hatchet_sdk/v0/clients/rest/models/step.py +123 -0
  195. hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
  196. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
  197. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
  198. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
  199. hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
  200. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
  201. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
  202. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
  203. hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
  204. hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
  205. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
  206. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
  207. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
  208. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
  209. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
  210. hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
  211. hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
  212. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
  213. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
  214. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
  215. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
  216. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
  217. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
  218. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
  219. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
  220. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
  221. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
  222. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
  223. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
  224. hatchet_sdk/v0/clients/rest/models/user.py +126 -0
  225. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
  226. hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
  227. hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
  228. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
  229. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
  230. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
  231. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
  232. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
  233. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
  234. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
  235. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
  236. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
  237. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
  238. hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
  239. hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
  240. hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
  241. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
  242. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
  243. hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
  244. hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
  245. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
  246. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
  247. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
  248. hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
  249. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
  250. hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
  251. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
  252. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
  253. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
  254. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
  255. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
  256. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
  257. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
  258. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
  259. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
  260. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
  261. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
  262. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
  263. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
  264. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
  265. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
  266. hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
  267. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
  268. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
  269. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
  270. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
  271. hatchet_sdk/v0/clients/rest/rest.py +187 -0
  272. hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
  273. hatchet_sdk/v0/clients/rest_client.py +622 -0
  274. hatchet_sdk/v0/clients/run_event_listener.py +260 -0
  275. hatchet_sdk/v0/clients/workflow_listener.py +277 -0
  276. hatchet_sdk/v0/connection.py +63 -0
  277. hatchet_sdk/v0/context/__init__.py +1 -0
  278. hatchet_sdk/v0/context/context.py +446 -0
  279. hatchet_sdk/v0/context/worker_context.py +28 -0
  280. hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
  281. hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
  282. hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
  283. hatchet_sdk/v0/contracts/events_pb2.py +46 -0
  284. hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
  285. hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
  286. hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
  287. hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
  288. hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
  289. hatchet_sdk/v0/features/cron.py +286 -0
  290. hatchet_sdk/v0/features/scheduled.py +248 -0
  291. hatchet_sdk/v0/hatchet.py +310 -0
  292. hatchet_sdk/v0/labels.py +10 -0
  293. hatchet_sdk/v0/logger.py +13 -0
  294. hatchet_sdk/v0/metadata.py +2 -0
  295. hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
  296. hatchet_sdk/v0/rate_limit.py +126 -0
  297. hatchet_sdk/v0/token.py +27 -0
  298. hatchet_sdk/v0/utils/aio_utils.py +137 -0
  299. hatchet_sdk/v0/utils/backoff.py +9 -0
  300. hatchet_sdk/v0/utils/typing.py +12 -0
  301. hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
  302. hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
  303. hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
  304. hatchet_sdk/v0/worker/__init__.py +1 -0
  305. hatchet_sdk/v0/worker/action_listener_process.py +294 -0
  306. hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
  307. hatchet_sdk/v0/worker/runner/runner.py +460 -0
  308. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
  309. hatchet_sdk/v0/worker/worker.py +391 -0
  310. hatchet_sdk/{workflow.py → v0/workflow.py} +4 -4
  311. hatchet_sdk/v0/workflow_run.py +59 -0
  312. hatchet_sdk/waits.py +120 -0
  313. hatchet_sdk/worker/__init__.py +0 -1
  314. hatchet_sdk/worker/action_listener_process.py +80 -55
  315. hatchet_sdk/worker/runner/run_loop_manager.py +46 -34
  316. hatchet_sdk/worker/runner/runner.py +82 -87
  317. hatchet_sdk/worker/runner/utils/capture_logs.py +26 -23
  318. hatchet_sdk/worker/worker.py +172 -149
  319. hatchet_sdk/workflow_run.py +7 -21
  320. {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/METADATA +2 -2
  321. hatchet_sdk-1.0.0a1.dist-info/RECORD +505 -0
  322. {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/entry_points.txt +2 -0
  323. hatchet_sdk/utils/serialization.py +0 -18
  324. hatchet_sdk-0.47.1.dist-info/RECORD +0 -237
  325. /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
  326. /hatchet_sdk/{semver.py → v0/semver.py} +0 -0
  327. /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
  328. /hatchet_sdk/{worker → v0/worker}/runner/utils/error_with_traceback.py +0 -0
  329. {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/WHEEL +0 -0
hatchet_sdk/connection.py CHANGED
@@ -1,26 +1,36 @@
1
1
  import os
2
- from typing import TYPE_CHECKING, Any
2
+ from typing import Literal, cast, overload
3
3
 
4
4
  import grpc
5
5
 
6
- if TYPE_CHECKING:
7
- from hatchet_sdk.loader import ClientConfig
6
+ from hatchet_sdk.config import ClientConfig
8
7
 
9
8
 
10
- def new_conn(config: "ClientConfig", aio=False):
9
+ @overload
10
+ def new_conn(config: ClientConfig, aio: Literal[False]) -> grpc.Channel: ...
11
11
 
12
+
13
+ @overload
14
+ def new_conn(config: ClientConfig, aio: Literal[True]) -> grpc.aio.Channel: ...
15
+
16
+
17
+ def new_conn(config: ClientConfig, aio: bool) -> grpc.Channel | grpc.aio.Channel:
12
18
  credentials: grpc.ChannelCredentials | None = None
13
19
 
14
20
  # load channel credentials
15
- if config.tls_config.tls_strategy == "tls":
16
- root: Any | None = None
21
+ if config.tls_config.strategy == "tls":
22
+ root: bytes | None = None
17
23
 
18
- if config.tls_config.ca_file:
19
- root = open(config.tls_config.ca_file, "rb").read()
24
+ if config.tls_config.root_ca_file:
25
+ root = open(config.tls_config.root_ca_file, "rb").read()
20
26
 
21
27
  credentials = grpc.ssl_channel_credentials(root_certificates=root)
22
- elif config.tls_config.tls_strategy == "mtls":
23
- root = open(config.tls_config.ca_file, "rb").read()
28
+ elif config.tls_config.strategy == "mtls":
29
+ assert config.tls_config.root_ca_file
30
+ assert config.tls_config.key_file
31
+ assert config.tls_config.cert_file
32
+
33
+ root = open(config.tls_config.root_ca_file, "rb").read()
24
34
  private_key = open(config.tls_config.key_file, "rb").read()
25
35
  certificate_chain = open(config.tls_config.cert_file, "rb").read()
26
36
 
@@ -32,7 +42,7 @@ def new_conn(config: "ClientConfig", aio=False):
32
42
 
33
43
  start = grpc if not aio else grpc.aio
34
44
 
35
- channel_options = [
45
+ channel_options: list[tuple[str, str | int]] = [
36
46
  ("grpc.max_send_message_length", config.grpc_max_send_message_length),
37
47
  ("grpc.max_receive_message_length", config.grpc_max_recv_message_length),
38
48
  ("grpc.keepalive_time_ms", 10 * 1000),
@@ -46,7 +56,7 @@ def new_conn(config: "ClientConfig", aio=False):
46
56
  # When steps execute via os.fork, we see `TSI_DATA_CORRUPTED` errors.
47
57
  os.environ["GRPC_ENABLE_FORK_SUPPORT"] = "False"
48
58
 
49
- if config.tls_config.tls_strategy == "none":
59
+ if config.tls_config.strategy == "none":
50
60
  conn = start.insecure_channel(
51
61
  target=config.host_port,
52
62
  options=channel_options,
@@ -61,4 +71,8 @@ def new_conn(config: "ClientConfig", aio=False):
61
71
  credentials=credentials,
62
72
  options=channel_options,
63
73
  )
64
- return conn
74
+
75
+ return cast(
76
+ grpc.Channel | grpc.aio.Channel,
77
+ conn,
78
+ )
@@ -1 +0,0 @@
1
- from .context import Context
@@ -2,42 +2,36 @@ import inspect
2
2
  import json
3
3
  import traceback
4
4
  from concurrent.futures import Future, ThreadPoolExecutor
5
- from typing import Any, Generic, Type, TypeVar, cast, overload
6
- from warnings import warn
5
+ from datetime import timedelta
6
+ from typing import TYPE_CHECKING, Any, cast
7
7
 
8
- from pydantic import BaseModel, StrictStr
8
+ from pydantic import BaseModel
9
9
 
10
+ from hatchet_sdk.clients.admin import AdminClient
11
+ from hatchet_sdk.clients.dispatcher.dispatcher import ( # type: ignore[attr-defined]
12
+ Action,
13
+ DispatcherClient,
14
+ )
15
+ from hatchet_sdk.clients.durable_event_listener import (
16
+ DurableEventListener,
17
+ RegisterDurableEventRequest,
18
+ )
10
19
  from hatchet_sdk.clients.events import EventClient
11
- from hatchet_sdk.clients.rest.tenacity_utils import tenacity_retry
12
20
  from hatchet_sdk.clients.rest_client import RestApi
13
21
  from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
14
22
  from hatchet_sdk.clients.workflow_listener import PooledWorkflowRunListener
15
23
  from hatchet_sdk.context.worker_context import WorkerContext
16
- from hatchet_sdk.contracts.dispatcher_pb2 import OverridesData
17
- from hatchet_sdk.contracts.workflows_pb2 import (
18
- BulkTriggerWorkflowRequest,
19
- TriggerWorkflowRequest,
20
- )
21
- from hatchet_sdk.utils.types import WorkflowValidator
22
- from hatchet_sdk.utils.typing import is_basemodel_subclass
23
- from hatchet_sdk.workflow_run import WorkflowRunRef
24
-
25
- from ..clients.admin import (
26
- AdminClient,
27
- ChildTriggerWorkflowOptions,
28
- ChildWorkflowRunDict,
29
- TriggerWorkflowOptions,
30
- WorkflowRunDict,
31
- )
32
- from ..clients.dispatcher.dispatcher import ( # type: ignore[attr-defined]
33
- Action,
34
- DispatcherClient,
35
- )
36
- from ..logger import logger
24
+ from hatchet_sdk.logger import logger
25
+ from hatchet_sdk.utils.timedelta_to_expression import Duration, timedelta_to_expr
26
+ from hatchet_sdk.utils.typing import JSONSerializableMapping, WorkflowValidator
27
+ from hatchet_sdk.waits import SleepCondition, UserEventCondition
37
28
 
38
- DEFAULT_WORKFLOW_POLLING_INTERVAL = 5 # Seconds
29
+ if TYPE_CHECKING:
30
+ from hatchet_sdk.runnables.task import Task
31
+ from hatchet_sdk.runnables.types import R, TWorkflowInput
39
32
 
40
- T = TypeVar("T", bound=BaseModel)
33
+
34
+ DEFAULT_WORKFLOW_POLLING_INTERVAL = 5 # Seconds
41
35
 
42
36
 
43
37
  def get_caller_file_path() -> str:
@@ -46,43 +40,13 @@ def get_caller_file_path() -> str:
46
40
  return caller_frame.filename
47
41
 
48
42
 
49
- class BaseContext:
43
+ class StepRunError(BaseModel):
44
+ step_id: str
45
+ step_run_action_name: str
46
+ error: str
50
47
 
51
- action: Action
52
- spawn_index: int
53
48
 
54
- def _prepare_workflow_options(
55
- self,
56
- key: str | None = None,
57
- options: ChildTriggerWorkflowOptions | None = None,
58
- worker_id: str | None = None,
59
- ) -> TriggerWorkflowOptions:
60
- workflow_run_id = self.action.workflow_run_id
61
- step_run_id = self.action.step_run_id
62
-
63
- desired_worker_id = None
64
- if options is not None and "sticky" in options and options["sticky"] == True:
65
- desired_worker_id = worker_id
66
-
67
- meta = None
68
- if options is not None and "additional_metadata" in options:
69
- meta = options["additional_metadata"]
70
-
71
- ## TODO: Pydantic here to simplify this
72
- trigger_options: TriggerWorkflowOptions = {
73
- "parent_id": workflow_run_id,
74
- "parent_step_run_id": step_run_id,
75
- "child_key": key,
76
- "child_index": self.spawn_index,
77
- "additional_metadata": meta,
78
- "desired_worker_id": desired_worker_id,
79
- }
80
-
81
- self.spawn_index += 1
82
- return trigger_options
83
-
84
-
85
- class ContextAioImpl(BaseContext):
49
+ class Context:
86
50
  def __init__(
87
51
  self,
88
52
  action: Action,
@@ -90,89 +54,8 @@ class ContextAioImpl(BaseContext):
90
54
  admin_client: AdminClient,
91
55
  event_client: EventClient,
92
56
  rest_client: RestApi,
93
- workflow_listener: PooledWorkflowRunListener,
94
- workflow_run_event_listener: RunEventListenerClient,
95
- worker: WorkerContext,
96
- namespace: str = "",
97
- ):
98
- self.action = action
99
- self.dispatcher_client = dispatcher_client
100
- self.admin_client = admin_client
101
- self.event_client = event_client
102
- self.rest_client = rest_client
103
- self.workflow_listener = workflow_listener
104
- self.workflow_run_event_listener = workflow_run_event_listener
105
- self.namespace = namespace
106
- self.spawn_index = -1
107
- self.worker = worker
108
-
109
- @tenacity_retry
110
- async def spawn_workflow(
111
- self,
112
- workflow_name: str,
113
- input: dict[str, Any] = {},
114
- key: str | None = None,
115
- options: ChildTriggerWorkflowOptions | None = None,
116
- ) -> WorkflowRunRef:
117
- worker_id = self.worker.id()
118
- # if (
119
- # options is not None
120
- # and "sticky" in options
121
- # and options["sticky"] == True
122
- # and not self.worker.has_workflow(workflow_name)
123
- # ):
124
- # raise Exception(
125
- # f"cannot run with sticky: workflow {workflow_name} is not registered on the worker"
126
- # )
127
-
128
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
129
-
130
- return await self.admin_client.aio.run_workflow(
131
- workflow_name, input, trigger_options
132
- )
133
-
134
- @tenacity_retry
135
- async def spawn_workflows(
136
- self, child_workflow_runs: list[ChildWorkflowRunDict]
137
- ) -> list[WorkflowRunRef]:
138
-
139
- if len(child_workflow_runs) == 0:
140
- raise Exception("no child workflows to spawn")
141
-
142
- worker_id = self.worker.id()
143
-
144
- bulk_trigger_workflow_runs: list[WorkflowRunDict] = []
145
- for child_workflow_run in child_workflow_runs:
146
- workflow_name = child_workflow_run["workflow_name"]
147
- input = child_workflow_run["input"]
148
-
149
- key = child_workflow_run.get("key")
150
- options = child_workflow_run.get("options", {})
151
-
152
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
153
-
154
- bulk_trigger_workflow_runs.append(
155
- WorkflowRunDict(
156
- workflow_name=workflow_name, input=input, options=trigger_options
157
- )
158
- )
159
-
160
- return await self.admin_client.aio.run_workflows(bulk_trigger_workflow_runs)
161
-
162
-
163
- class Context(BaseContext):
164
- spawn_index = -1
165
-
166
- worker: WorkerContext
167
-
168
- def __init__(
169
- self,
170
- action: Action,
171
- dispatcher_client: DispatcherClient,
172
- admin_client: AdminClient,
173
- event_client: EventClient,
174
- rest_client: RestApi,
175
- workflow_listener: PooledWorkflowRunListener,
57
+ workflow_listener: PooledWorkflowRunListener | None,
58
+ durable_event_listener: DurableEventListener | None,
176
59
  workflow_run_event_listener: RunEventListenerClient,
177
60
  worker: WorkerContext,
178
61
  namespace: str = "",
@@ -181,44 +64,18 @@ class Context(BaseContext):
181
64
  self.worker = worker
182
65
  self.validator_registry = validator_registry
183
66
 
184
- self.aio = ContextAioImpl(
185
- action,
186
- dispatcher_client,
187
- admin_client,
188
- event_client,
189
- rest_client,
190
- workflow_listener,
191
- workflow_run_event_listener,
192
- worker,
193
- namespace,
194
- )
195
-
196
- # Check the type of action.action_payload before attempting to load it as JSON
197
- if isinstance(action.action_payload, (str, bytes, bytearray)):
198
- try:
199
- self.data = cast(dict[str, Any], json.loads(action.action_payload))
200
- except Exception as e:
201
- logger.error(f"Error parsing action payload: {e}")
202
- # Assign an empty dictionary if parsing fails
203
- self.data: dict[str, Any] = {} # type: ignore[no-redef]
204
- else:
205
- # Directly assign the payload to self.data if it's already a dict
206
- self.data = (
207
- action.action_payload if isinstance(action.action_payload, dict) else {}
208
- )
67
+ self.data = action.action_payload
209
68
 
210
69
  self.action = action
211
70
 
212
- # FIXME: stepRunId is a legacy field, we should remove it
213
- self.stepRunId = action.step_run_id
214
-
215
- self.step_run_id = action.step_run_id
71
+ self.step_run_id: str = action.step_run_id
216
72
  self.exit_flag = False
217
73
  self.dispatcher_client = dispatcher_client
218
74
  self.admin_client = admin_client
219
75
  self.event_client = event_client
220
76
  self.rest_client = rest_client
221
77
  self.workflow_listener = workflow_listener
78
+ self.durable_event_listener = durable_event_listener
222
79
  self.workflow_run_event_listener = workflow_run_event_listener
223
80
  self.namespace = namespace
224
81
 
@@ -227,45 +84,55 @@ class Context(BaseContext):
227
84
  self.logger_thread_pool = ThreadPoolExecutor(max_workers=1)
228
85
  self.stream_event_thread_pool = ThreadPoolExecutor(max_workers=1)
229
86
 
230
- # store each key in the overrides field in a lookup table
231
- # overrides_data is a dictionary of key-value pairs
232
- self.overrides_data = self.data.get("overrides", {})
87
+ self.input = self.data.input
88
+
89
+ def was_skipped(self, task: "Task[TWorkflowInput, R]") -> bool:
90
+ return self.data.parents.get(task.name, {}).get("skipped", False)
91
+
92
+ @property
93
+ def trigger_data(self) -> JSONSerializableMapping:
94
+ return self.data.triggers
95
+
96
+ def task_output(self, task: "Task[TWorkflowInput, R]") -> "R":
97
+ from hatchet_sdk.runnables.types import R
233
98
 
234
- if action.get_group_key_run_id != "":
235
- self.input = self.data
236
- else:
237
- self.input = self.data.get("input", {})
99
+ if self.was_skipped(task):
100
+ raise ValueError("{task.name} was skipped")
101
+
102
+ action_prefix = self.action.action_id.split(":")[0]
238
103
 
239
- def step_output(self, step: str) -> dict[str, Any] | BaseModel:
240
104
  workflow_validator = next(
241
- (v for k, v in self.validator_registry.items() if k.split(":")[-1] == step),
105
+ (
106
+ v
107
+ for k, v in self.validator_registry.items()
108
+ if k == f"{action_prefix}:{task.name}"
109
+ ),
242
110
  None,
243
111
  )
244
112
 
245
113
  try:
246
- parent_step_data = cast(dict[str, Any], self.data["parents"][step])
114
+ parent_step_data = cast(R, self.data.parents[task.name])
247
115
  except KeyError:
248
- raise ValueError(f"Step output for '{step}' not found")
116
+ raise ValueError(f"Step output for '{task.name}' not found")
249
117
 
250
- if workflow_validator and (v := workflow_validator.step_output):
251
- return v.model_validate(parent_step_data)
118
+ if (
119
+ parent_step_data
120
+ and workflow_validator
121
+ and (v := workflow_validator.step_output)
122
+ ):
123
+ return cast(R, v.model_validate(parent_step_data))
252
124
 
253
125
  return parent_step_data
254
126
 
255
- def triggered_by_event(self) -> bool:
256
- return cast(str, self.data.get("triggered_by", "")) == "event"
257
-
258
- def workflow_input(self) -> dict[str, Any] | T:
259
- if (r := self.validator_registry.get(self.action.action_id)) and (
260
- i := r.workflow_input
261
- ):
262
- return cast(
263
- T,
264
- i.model_validate(self.input),
265
- )
127
+ @property
128
+ def was_triggered_by_event(self) -> bool:
129
+ return self.data.triggered_by == "event"
266
130
 
131
+ @property
132
+ def workflow_input(self) -> JSONSerializableMapping:
267
133
  return self.input
268
134
 
135
+ @property
269
136
  def workflow_run_id(self) -> str:
270
137
  return self.action.workflow_run_id
271
138
 
@@ -277,39 +144,18 @@ class Context(BaseContext):
277
144
  def done(self) -> bool:
278
145
  return self.exit_flag
279
146
 
280
- def playground(self, name: str, default: str | None = None) -> str | None:
281
- # if the key exists in the overrides_data field, return the value
282
- if name in self.overrides_data:
283
- warn(
284
- "Use of `overrides_data` is deprecated.",
285
- DeprecationWarning,
286
- stacklevel=1,
287
- )
288
- return str(self.overrides_data[name])
289
-
290
- caller_file = get_caller_file_path()
291
-
292
- self.dispatcher_client.put_overrides_data(
293
- OverridesData(
294
- stepRunId=self.stepRunId,
295
- path=name,
296
- value=json.dumps(default),
297
- callerFilename=caller_file,
298
- )
299
- )
300
-
301
- return default
302
-
303
147
  def _log(self, line: str) -> tuple[bool, Exception | None]:
304
148
  try:
305
- self.event_client.log(message=line, step_run_id=self.stepRunId)
149
+ self.event_client.log(message=line, step_run_id=self.step_run_id)
306
150
  return True, None
307
151
  except Exception as e:
308
152
  # we don't want to raise an exception here, as it will kill the log thread
309
153
  return False, e
310
154
 
311
- def log(self, line: Any, raise_on_error: bool = False) -> None:
312
- if self.stepRunId == "":
155
+ def log(
156
+ self, line: str | JSONSerializableMapping, raise_on_error: bool = False
157
+ ) -> None:
158
+ if self.step_run_id == "":
313
159
  return
314
160
 
315
161
  if not isinstance(line, str):
@@ -339,45 +185,54 @@ class Context(BaseContext):
339
185
  future.add_done_callback(handle_result)
340
186
 
341
187
  def release_slot(self) -> None:
342
- return self.dispatcher_client.release_slot(self.stepRunId)
188
+ return self.dispatcher_client.release_slot(self.step_run_id)
343
189
 
344
190
  def _put_stream(self, data: str | bytes) -> None:
345
191
  try:
346
- self.event_client.stream(data=data, step_run_id=self.stepRunId)
192
+ self.event_client.stream(data=data, step_run_id=self.step_run_id)
347
193
  except Exception as e:
348
194
  logger.error(f"Error putting stream event: {e}")
349
195
 
350
196
  def put_stream(self, data: str | bytes) -> None:
351
- if self.stepRunId == "":
197
+ if self.step_run_id == "":
352
198
  return
353
199
 
354
200
  self.stream_event_thread_pool.submit(self._put_stream, data)
355
201
 
356
- def refresh_timeout(self, increment_by: str) -> None:
202
+ def refresh_timeout(self, increment_by: str | timedelta) -> None:
203
+ if isinstance(increment_by, timedelta):
204
+ increment_by = timedelta_to_expr(increment_by)
205
+
357
206
  try:
358
207
  return self.dispatcher_client.refresh_timeout(
359
- step_run_id=self.stepRunId, increment_by=increment_by
208
+ step_run_id=self.step_run_id, increment_by=increment_by
360
209
  )
361
210
  except Exception as e:
362
211
  logger.error(f"Error refreshing timeout: {e}")
363
212
 
213
+ @property
364
214
  def retry_count(self) -> int:
365
215
  return self.action.retry_count
366
216
 
367
- def additional_metadata(self) -> dict[str, Any] | None:
217
+ @property
218
+ def additional_metadata(self) -> JSONSerializableMapping | None:
368
219
  return self.action.additional_metadata
369
220
 
221
+ @property
370
222
  def child_index(self) -> int | None:
371
223
  return self.action.child_workflow_index
372
224
 
225
+ @property
373
226
  def child_key(self) -> str | None:
374
227
  return self.action.child_workflow_key
375
228
 
229
+ @property
376
230
  def parent_workflow_run_id(self) -> str | None:
377
231
  return self.action.parent_workflow_run_id
378
232
 
379
- def step_run_errors(self) -> dict[str, str]:
380
- errors = cast(dict[str, str], self.data.get("step_run_errors", {}))
233
+ @property
234
+ def task_run_errors(self) -> dict[str, str]:
235
+ errors = self.data.step_run_errors
381
236
 
382
237
  if not errors:
383
238
  logger.error(
@@ -386,61 +241,44 @@ class Context(BaseContext):
386
241
 
387
242
  return errors
388
243
 
389
- def fetch_run_failures(self) -> list[dict[str, StrictStr]]:
390
- data = self.rest_client.workflow_run_get(self.action.workflow_run_id)
391
- other_job_runs = [
392
- run for run in (data.job_runs or []) if run.job_id != self.action.job_id
393
- ]
394
- # TODO: Parse Step Runs using a Pydantic Model rather than a hand crafted dictionary
395
- return [
396
- {
397
- "step_id": step_run.step_id,
398
- "step_run_action_name": step_run.step.action,
399
- "error": step_run.error,
400
- }
401
- for job_run in other_job_runs
402
- if job_run.step_runs
403
- for step_run in job_run.step_runs
404
- if step_run.error and step_run.step
405
- ]
406
-
407
- @tenacity_retry
408
- def spawn_workflow(
244
+ def fetch_task_run_error(
409
245
  self,
410
- workflow_name: str,
411
- input: dict[str, Any] = {},
412
- key: str | None = None,
413
- options: ChildTriggerWorkflowOptions | None = None,
414
- ) -> WorkflowRunRef:
415
- worker_id = self.worker.id()
416
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
246
+ task: "Task[TWorkflowInput, R]",
247
+ ) -> str | None:
248
+ errors = self.data.step_run_errors
417
249
 
418
- return self.admin_client.run_workflow(workflow_name, input, trigger_options)
250
+ return errors.get(task.name)
419
251
 
420
- @tenacity_retry
421
- def spawn_workflows(
422
- self, child_workflow_runs: list[ChildWorkflowRunDict]
423
- ) -> list[WorkflowRunRef]:
424
252
 
425
- if len(child_workflow_runs) == 0:
426
- raise Exception("no child workflows to spawn")
253
+ class DurableContext(Context):
254
+ async def aio_wait_for(
255
+ self, signal_key: str, *conditions: SleepCondition | UserEventCondition
256
+ ) -> dict[str, Any]:
257
+ if self.durable_event_listener is None:
258
+ raise ValueError("Durable event listener is not available")
427
259
 
428
- worker_id = self.worker.id()
260
+ task_id = self.step_run_id
429
261
 
430
- bulk_trigger_workflow_runs: list[WorkflowRunDict] = []
431
- for child_workflow_run in child_workflow_runs:
432
- workflow_name = child_workflow_run["workflow_name"]
433
- input = child_workflow_run["input"]
262
+ request = RegisterDurableEventRequest(
263
+ task_id=task_id,
264
+ signal_key=signal_key,
265
+ conditions=list(conditions),
266
+ )
434
267
 
435
- key = child_workflow_run.get("key")
436
- options = child_workflow_run.get("options", {})
268
+ self.durable_event_listener.register_durable_event(request)
437
269
 
438
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
270
+ return await self.durable_event_listener.result(
271
+ task_id,
272
+ signal_key,
273
+ )
439
274
 
440
- bulk_trigger_workflow_runs.append(
441
- WorkflowRunDict(
442
- workflow_name=workflow_name, input=input, options=trigger_options
443
- )
444
- )
275
+ async def aio_sleep_for(self, duration: Duration) -> dict[str, Any]:
276
+ """
277
+ Lightweight wrapper for durable sleep. Allows for shorthand usage of `ctx.aio_wait_for` when specifying a sleep condition.
445
278
 
446
- return self.admin_client.run_workflows(bulk_trigger_workflow_runs)
279
+ For more complicated conditions, use `ctx.aio_wait_for` directly.
280
+ """
281
+
282
+ return await self.aio_wait_for(
283
+ f"sleep:{timedelta_to_expr(duration)}", SleepCondition(duration=duration)
284
+ )
@@ -3,7 +3,7 @@
3
3
  import grpc
4
4
  import warnings
5
5
 
6
- from . import dispatcher_pb2 as dispatcher__pb2
6
+ from hatchet_sdk.contracts import dispatcher_pb2 as dispatcher__pb2
7
7
 
8
8
  GRPC_GENERATED_VERSION = '1.64.1'
9
9
  GRPC_VERSION = grpc.__version__
@@ -15,14 +15,14 @@ _sym_db = _symbol_database.Default()
15
15
  from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
16
16
 
17
17
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x65vents.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb4\x01\n\x05\x45vent\x12\x10\n\x08tenantId\x18\x01 \x01(\t\x12\x0f\n\x07\x65ventId\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x0f\n\x07payload\x18\x04 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\" \n\x06\x45vents\x12\x16\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x06.Event\"\x92\x01\n\rPutLogRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\t\x12\x12\n\x05level\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08metadata\x18\x05 \x01(\tB\x08\n\x06_level\"\x10\n\x0ePutLogResponse\"|\n\x15PutStreamEventRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x10\n\x08metadata\x18\x05 \x01(\t\"\x18\n\x16PutStreamEventResponse\"9\n\x14\x42ulkPushEventRequest\x12!\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x11.PushEventRequest\"\x9c\x01\n\x10PushEventRequest\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\"%\n\x12ReplayEventRequest\x12\x0f\n\x07\x65ventId\x18\x01 \x01(\t2\x88\x02\n\rEventsService\x12#\n\x04Push\x12\x11.PushEventRequest\x1a\x06.Event\"\x00\x12,\n\x08\x42ulkPush\x12\x15.BulkPushEventRequest\x1a\x07.Events\"\x00\x12\x32\n\x11ReplaySingleEvent\x12\x13.ReplayEventRequest\x1a\x06.Event\"\x00\x12+\n\x06PutLog\x12\x0e.PutLogRequest\x1a\x0f.PutLogResponse\"\x00\x12\x43\n\x0ePutStreamEvent\x12\x16.PutStreamEventRequest\x1a\x17.PutStreamEventResponse\"\x00\x42GZEgithub.com/hatchet-dev/hatchet/internal/services/dispatcher/contractsb\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x65vents.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb4\x01\n\x05\x45vent\x12\x10\n\x08tenantId\x18\x01 \x01(\t\x12\x0f\n\x07\x65ventId\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x0f\n\x07payload\x18\x04 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\" \n\x06\x45vents\x12\x16\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x06.Event\"\x92\x01\n\rPutLogRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\t\x12\x12\n\x05level\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08metadata\x18\x05 \x01(\tB\x08\n\x06_level\"\x10\n\x0ePutLogResponse\"|\n\x15PutStreamEventRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x10\n\x08metadata\x18\x05 \x01(\t\"\x18\n\x16PutStreamEventResponse\"9\n\x14\x42ulkPushEventRequest\x12!\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x11.PushEventRequest\"\x9c\x01\n\x10PushEventRequest\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\"%\n\x12ReplayEventRequest\x12\x0f\n\x07\x65ventId\x18\x01 \x01(\t2\x88\x02\n\rEventsService\x12#\n\x04Push\x12\x11.PushEventRequest\x1a\x06.Event\"\x00\x12,\n\x08\x42ulkPush\x12\x15.BulkPushEventRequest\x1a\x07.Events\"\x00\x12\x32\n\x11ReplaySingleEvent\x12\x13.ReplayEventRequest\x1a\x06.Event\"\x00\x12+\n\x06PutLog\x12\x0e.PutLogRequest\x1a\x0f.PutLogResponse\"\x00\x12\x43\n\x0ePutStreamEvent\x12\x16.PutStreamEventRequest\x1a\x17.PutStreamEventResponse\"\x00\x42\x45ZCgithub.com/hatchet-dev/hatchet/internal/services/ingestor/contractsb\x06proto3')
19
19
 
20
20
  _globals = globals()
21
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
22
22
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'events_pb2', _globals)
23
23
  if not _descriptor._USE_C_DESCRIPTORS:
24
24
  _globals['DESCRIPTOR']._loaded_options = None
25
- _globals['DESCRIPTOR']._serialized_options = b'ZEgithub.com/hatchet-dev/hatchet/internal/services/dispatcher/contracts'
25
+ _globals['DESCRIPTOR']._serialized_options = b'ZCgithub.com/hatchet-dev/hatchet/internal/services/ingestor/contracts'
26
26
  _globals['_EVENT']._serialized_start=50
27
27
  _globals['_EVENT']._serialized_end=230
28
28
  _globals['_EVENTS']._serialized_start=232
@@ -3,7 +3,7 @@
3
3
  import grpc
4
4
  import warnings
5
5
 
6
- from . import events_pb2 as events__pb2
6
+ from hatchet_sdk.contracts import events_pb2 as events__pb2
7
7
 
8
8
  GRPC_GENERATED_VERSION = '1.64.1'
9
9
  GRPC_VERSION = grpc.__version__