Changelog
TypeScript SDK Changelog
v1.37.0 - 2026-10-07
Added
- Adds
RetryAfterError, which allows for custom retry strategies.
Fixed
- Duration strings now accept fractional units, e.g.
'0.5s', which theDurationtype already allowed but failed to parse at runtime.
v1.36.0 - 2026-10-06
Added
hatchet.streams.publishaccepts payloads up to 64 MiB.- Added
hatchet.streams.topicMetadata(topic, { namespace }), which returns a topic's tenant, message count, latest cursor and last publish time, counting only messages within the tenant's retention.
v1.35.1 - 2026-10-05
Fixed
- A stopping worker keeps its action stream open until its running tasks finish, and only then closes it and unsubscribes from the engine. Since 1.34.1 it closed the stream before waiting for those tasks, so the engine rejected every heartbeat sent in the meantime and the worker logged
Heartbeat rejected: worker stream is not activeevery four seconds until shutdown completed. Task cancellations now also reach tasks that are still running during shutdown.
v1.35.0 - 2026-10-05
Added
- Added
pauseandunpausemethods to the workflows client (hatchet.workflows.pause(workflow, opts)) and to workflow declarations (workflow.pause(opts)).optsrequires aqueueTTLfor how long runs stay queued while the workflow is paused, and optionally takes the behavior (QUEUEorDROP) for cron and scheduled runs triggered while paused, both defaulting toQUEUE. TheWorkflowPauseScheduledCronRunQueueBehaviorenum is now exported from the package root.
v1.34.1 - 2026-10-05
Fixed
- Durable tasks that fan out to thousands of children no longer flood the engine with worker status requests. The durable listener sent one worker status request per awaited child, each listing every pending child, which was quadratic in the fan-out size; it now sends one request per event loop iteration listing only the newly awaited children.
- The periodic worker status request lists only children that have been pending for more than two seconds, is sent every five seconds instead of every second, and is split into requests of at most 10,000 entries so it stays under the gRPC message size limit.
- Re-delivered child completions are matched against pending callbacks without scanning the pending queue.
- Children spawned from a durable task over the gRPC durable listener are sent to the engine in requests of at most 100 children, instead of one request for the whole fan-out.
- Concurrent signals and
worker.stop()now share one shutdown operation, keeping the durable listener open until waiting runs finish eviction. A worker stopped while it is still starting no longer registers a listener or leaves a health server running afterwards. - Concurrent eviction requests for the same task invocation now share their acknowledgement, including timeout and disconnection errors, instead of leaving one caller to time out. The eviction timeout timer is cleared once the acknowledgement arrives.
- A stopping worker keeps sending heartbeats until its running tasks finish, and only then unsubscribes from the engine. It used to stop the heartbeat and unsubscribe before waiting for those tasks, so the engine could treat the worker as dead and reassign tasks that were about to complete.
v1.34.0 - 2026-10-02
Added
- Added
hatchet.streams, a client for durable streams. In preview, and subject to change.
[1.34.0-alpha.2] - 2026-09-25
Added
- The
@hatchet-dev/typescript-sdk/coreentry now exportsHatchetCore(also asHatchet), the application client for runtimes without gRPC: Cloudflare Workers, Vercel Functions, Deno, Bun, browsers and Node. It issues unary Connect calls over the runtime'sfetchthroughcreateFetchTransport(binary protobuf bodies, HTTP/1.1 or HTTP/2 as the runtime negotiates) and is configured from an explicit object only:{ token, serverUrl?, hostPort?, tls?: { strategy: 'none' | 'tls', serverName? }, namespace?, transport?, fetch?, maxReceiveMessageBytes?, maxSendMessageBytes?, retrier?, logger?, logLevel? }. AserverUrlmust be an absolutehttp://orhttps://URL with no username, password, query string or fragment, and its scheme must agree withtls:http://is refused unlesstlsis{ strategy: 'none' }, since the token travels on every call, andhttps://is refused with'none';hostPorttakes its scheme fromtlsas the Node client does. With only atoken, the engine address comes from the token'sgrpc_broadcast_addressclaim; no other claim is needed, and a token without it fails at construction with an error naming the claim and theserverUrl/hostPortfields to set instead. A caller-suppliedtransportowns its base URL, auth and limits, so no address is resolved or validated for it. It ownsrun,runNoWait,runManyandrunManyNoWait(overTriggerWorkflowandBulkTriggerWorkflow, with the Node client's options and namespacing, accepting the declarations from/edge; a bulk trigger that fails after one of its batches was accepted rejects withBulkTriggerPartialError, whoserefsare the runs created so far,failedBatchIndexthe batch that failed andcauseits error, so a caller can keep or cancel those runs instead of retrying the whole request and creating them twice),events.pushandbulkPush,workflows.put,rateLimits.put,runs.get,getDetails,cancelandreplay(GetRunDetails,CancelTasksandReplayTaskson the v1AdminService),logs.putandstreams.put.runManyhonorsreturnExceptionson itsRunManyOptentries the way a declaration'srunManydoes: with it set, a failed run's slot holds anErrorinstead of rejecting the whole wait.logs.putrejects a line over 1,000 characters with aHatchetErrorstating the length, the limit the Node client'sputLogdrops such lines at; since the core call acknowledges the write, it does not drop silently. ItsWorkflowRunRef.result()pollsGetRunDetailswith backoff (250 ms doubling to 5 s, jitter included), takes{ timeoutMs, signal }, and reads outputs and failures the way the Node client'sresult()does: an absent output is{}, a storednullisnull, an output that is not JSON rejects with itsSyntaxError, a run rejects with the tasks' error messages when any task reported one, and a failed or cancelled run whose tasks carry no error resolves with their outputs.runs.getalso returns each task'srawOutput, the stored text, next to the decodedoutput. The REST-backed features of the Node client (crons,schedules,runs.list,workflows.get,events.list) are not on this entry, since the generated REST client depends onaxios. - Added
createFetchTransporttoclients/transport. ItshostPorttakes the gRPC target forms the Node client takes (host:port,dns:///host:port,ipv4:,ipv6:), the bearer token is checked to be header-safe the same way, requests and responses are held to the Node transport's 4 MiB message limits (a request overmaxSendMessageBytesis refused before it is sent and a response overmaxReceiveMessageBytes, counted after HTTP decompression, is cancelled; both reject with aConnectErrorof codeResourceExhausted; a caller-suppliedtransportowns its own limits), and the core client's calls go through the same generated client adapters as the Node client's, soruns.get/getDetailsaccept the per-callsignal,deadlineandmetadataoptions andWorkflowRunRef.result()cancels the poll in flight when its signal fires or itstimeoutMsruns out, passing the remaining time to the call as a Connect timeout. scripts/check-edge-entry.mjsalso rejects packages named with--forbidand SDK modules that use theprocessorBufferglobals,setImmediate, a timer's.unref(),AbortSignal.timeoutorAbortSignal.anywithout feature-detecting them;pnpm check:coreruns it against the core entry in CI, next tocheck:edge. A Go e2e (pkg/testing/e2e/tscore,go test -tags e2e) runs the core client from the built package over HTTP/1.1 against the harness engine.
Changed
runs.getDetailson the Node client issuesGetRunDetailsthrough the Connect transport, the same code path the core client uses; its request and response types are unchanged. The trigger and event requests are built by modules both clients share (clients/admin/trigger-request,clients/event/rpc), with no change to what is sent.util/batchmeasures payloads withTextEncoderinstead ofBuffer, so it runs outside Node.
[1.34.0-alpha.1] - 2026-09-25
Fixed
HatchetClientandHatchetLoggerno longer write log lines when the log level isOFF.
[1.34.0-alpha.0] - 2026-09-22
Added
- Added a package
exportsmap, soimport { HatchetClient } from '@hatchet-dev/typescript-sdk/v1'now resolves under native Node ESM instead of failing withERR_UNSUPPORTED_DIR_IMPORT(fixes #3613; supersedes #3650 by @dhimanAbhi, whose.and./v1entries it folds in). The map lists.,/v1,/edge,/coreand every directory that ships anindex.jsexplicitly, and wildcard entries keep every existing deep import resolving with or without the.jssuffix, including a type import of an explicit.d.tspath.scripts/check-exports.mjs(pnpm check:exports) resolves each documented path from an ESM and a CommonJS scratch module against the built package in CI and compiles a TypeScript consumer of the declarations under thenode16andbundlerresolvers. - Added the
@hatchet-dev/typescript-sdk/coreentry point. It currently exports onlyCORE_ENTRY_VERSION; the application client for runtimes without gRPC is built on it. - Added protobuf-es bindings for the SDK's protos (
src/protoc-es, generated byprotoc-gen-esthroughpnpm run generate-protoc-es) next to thets-protobindings, which remain the SDK's public message types. - Added a Connect
Transportseam inclients/transport:createNodeTransport(config)speaks the gRPC protocol over HTTP/2 through@connectrpc/connect-node, derives its TLS settings fromtls_config(none,tls,mtls,ca_file,cert_file,key_file,server_name) with the same trust precedence as the grpc-js channel (ca_file, else the bundleGRPC_DEFAULT_SSL_ROOTS_FILE_PATHnames, else the platform roots;GRPC_SSL_CIPHER_SUITESapplies when set) and attaches the bearer token to every call. It dials the endpointhost_portnames in the target forms grpc-js accepts (host:port,dns:host:port,dns:///host:port,ipv4:address:port,ipv6:[address]:port); aunix:socket target is refused at the first call with a clear error.HatchetClientOptions.transportinjects a transport into the client.
Changed
- The admin, event and v1 admin clients issue their unary RPCs through the Connect transport. The public client properties (
admin.client,admin.v1Client,events.client, andadmin.workflowsGrpcandadmin.adminGrpcon the v1 client) keep their generatedWorkflowServiceClient,AdminServiceClientandEventsServiceClienttypes: every RPC of each service is served, and thenice-grpccall options (signal,metadata,onHeader,onTrailer) plus an absolutedeadline(Dateor epoch milliseconds) are honored on each call, with an aborted signal rejecting with the sameAbortErroras before. The wire protocol, the request and response types and the status-code classification are unchanged; the streaming clients, the worker and the run listeners stay onnice-grpc. Errors from these calls areConnectErrors:codeis the same numeric gRPC status code, the server's message is inrawMessage, andmessagereads[already_exists] ...where it used to read/WorkflowService/TriggerWorkflow ALREADY_EXISTS: .... EventClientand the legacyAdminClientkeep their positional constructor parameters and take an optionaltransportlast.HatchetClientOptions.credentialsapplies to the streamingnice-grpcchannel only; the unary transport derives its TLS settings fromtls_config.- A token containing characters that cannot travel in an HTTP header (a stray line break in
HATCHET_CLIENT_TOKEN, for example) now fails the first unary call with a fixed message instead of an error that quoted the token.
v1.33.2 - 2026-09-24
Fixed
- Importing the SDK no longer prints the v0 deprecation warnings. The root entry re-exports the v0
workflowandstepmodules, and the SDK itself imported them internally, so every v1 user sawHATCHET_V0_REMOVEDtwice plus a note aboutConcurrencyLimitStrategyon startup. The warning is now emitted once, when a v0 workflow is registered or put to the engine.
v1.33.1 - 2026-09-09
Changed
- Embedded mode now reports first-run progress on stderr: a line when the sidecar download starts (with version and destination) and completes, a notice when a slow release or checksum fetch blocks startup, a startup line before waiting for the engine, and a heartbeat every 30 seconds while the engine is still becoming ready. Warm starts print at most one startup line.
HatchetEmbeddedClient.init()now warns once whenHATCHET_CLIENT_TOKENis set in the environment, since Hatchet clients created with the standard constructor in the same process will not use the embedded engine.
v1.33.0 - 2026-09-08
Added
- Added
/readyzand/livezendpoints to the worker health server, matching Kubernetes' own probe naming convention./readyzreturns 200 only when the worker isHEALTHY;/livezreturns 200 whenever the process can respond, independent of Hatchet connectivity, so a transient upstream disconnect doesn't trigger a container restart./healthis unchanged.
v1.32.0 - 2026-09-08
Added
- Added the
@hatchet-dev/typescript-sdk/edgeentry point: the declaration factories and classes,Context,DurableContext, conditions, durations, errors and the wire types needed to declare and run tasks from a runtime without a Hatchet client (Cloudflare Workers, Vercel Functions). It imports nothing from Node, whichscripts/check-edge-entry.mjsenforces in CI, and ships adeclarations()factory that returnstask,durableTask,workflowandbatchTaskbound to no client. The subpath resolves through the package's file layout, like the existingv1/embeddedsubpath. - Added
workflowToProto(definition, { namespace }), a pure function that builds theCreateWorkflowVersionRequesta workflow registers under, lifted out of the worker together withnormalizeWorkflowDefinitionand the mapping helpers. The worker registers through it. - Added the
ContextRuntimeandDurableTransportinterfaces.ContextandDurableContextnow perform every engine-facing operation through them; a worker supplies adapters over its client and durable listener, and the existing(action, client, worker)constructors keep working. - Added
createActionId(workflowName, taskName)andParentRunContextManager.useStorage(...)so runtimes withoutAsyncLocalStoragecan still declare and serve tasks.
Changed
- Action ids are registered fully lowercased (
<workflow>:<task>), matching the ids the worker keys its registries by. Behaviour on the wire is unchanged: the engine already normalised ids (ParseActionIDlowercases the verb andUpsertActionstoresLOWER(actionId)), and the SDK now sends the normalised form itself. - Memo keys for
ctx.now()are computed with WebCrypto (crypto.subtle.digest) instead ofcrypto.createHash. The bytes are unchanged, so recorded durable event logs keep replaying;globalThis.crypto(Node 20 or newer) is required for durable tasks. bindAbortSignalHandlermoved fromutil/abort-errortoutil/abort-signal, keeping the abort helpers free of Node imports.
v1.31.1 - 2026-09-03
Security
- Bumped
qsto 6.16.0 to address GHSA-4mjr-xmp4-gh2g and GHSA-x5fp-wj9c-mxmx.
v1.31.0 - 2026-09-03
Added
- Added support for tenant-scoped shared concurrency strategies. Declare a
Concurrencyentry withisTenantScoped: trueand aname, and reference the same name from tasks in different workflows so they share a single concurrency limit. Tenant-scoped entries can be mixed with ordinary workflow-scoped entries on the same task. Concurrency.maxRunsnow acceptsnumber | string: a string is a CEL expression over task input computing the max runs for each concurrency group, so different groups (e.g. pricing tiers) can have different limits.
v1.30.1 - 2026-09-01
Fixed
- Fixes another durable callback ordering bug which would cause NonDeterminismErrors to be raised on replay in the case where e.g. children were spawned recursively, concurrently.
v1.30.0 - 2026-08-26
Added
- Added support for
CANCEL_QUEUED_EXCEPT_NEWESTandCANCEL_QUEUED_EXCEPT_OLDESTconcurrency strategies.
v1.29.3 - 2026-08-31
Changed
- The missing-token configuration error now explains how to run Hatchet embedded for local development, via
HatchetEmbeddedClient.init(), with a link to the embedded mode docs.
v1.29.2 - 2026-08-10
Fixed
- Improved error handling around failed heartbeats
v1.29.1 - 2026-08-25
Added
- Added
stopEmbedded()on clients returned byHatchetEmbeddedClient.init()and a standalonestopEmbeddedSidecar()export, which gracefully stop the embedded engine (including its bundled Postgres) and resolve once it has fully exited.
v1.29.0 - 2026-08-24
Added
- Added embedded mode (early beta):
HatchetEmbeddedClient.init()from the@hatchet-dev/typescript-sdk/v1/embeddedentry point downloads and spawns thehatchet-embeddedsidecar (checksum-verified, cached under~/.hatchet/embedded), runs a full Hatchet engine locally with a bundled Postgres by default (passdatabaseUrlto use your own), and returns a client wired to it. The separate entry point keeps embedded support out of production bundles.
v1.28.2 - 2026-08-10
Fixed
- Changed
hatchet.taskconstructor concurrency options handling so that it does not set concurrency options at the workflow level, which would cause slow concurrency strategy handling in the engine
v1.28.1 - 2026-07-30
Fixed
- Fixed heartbeat worker logging to ignore Node watch-mode worker reload messages that don’t match the heartbeat message protocol.
- Improved heartbeat worker and action listener logging to ignore first network error, warn log on second error, and only error log past 3 errors to reduce false alarms due to transient network errors.
v1.28.0 - 2026-07-23
Changed
- Adds beta
batchTaskmethods to both tasks and workflows, allowing for dynamic batching based on either time or batch size.
v1.27.0 - 2026-07-22
Added
- Adds support for terminal status-based idempotency keys, which are released when the task holding the key reaches a terminal state (either completed, cancelled, or having failed and exhausted all retries).
v1.26.2 - 2026-07-21
Added
- Added a
retrierconfig option toClientConfig(and correspondingHATCHET_CLIENT_RETRIER_MAX_ATTEMPTS,HATCHET_CLIENT_RETRIER_INITIAL_INTERVAL,HATCHET_CLIENT_RETRIER_MAX_JITTERenv vars) to control retry behavior for user-facing gRPC calls — event pushes and workflow triggers. Internal engine communications (action events, stream events, workflow registration) are unaffected and continue using hardcoded defaults.
v1.26.1 - 2026-07-20
Added
- Added
ctx.workflowNameV1()to return the current workflow name.
Deprecated
- Deprecated
ctx.workflowName(), which continues to return the task name for backward compatibility. Usectx.workflowNameV1()for the workflow name orctx.taskName()for the task name.
Fixed
- Fixed workflow name values in context log metadata and OpenTelemetry attributes.
v1.26.0 - 2026-07-16
Added
- Adds support for defining idempotency keys on workflows and standalone tasks via an
idempotencyoption, which ensures that they're only run once in a provided time window, based on a CEL expression. Triggers that collide with an existing run throw anIdempotencyCollisionErrorcontaining the existing run's ID.
v1.25.0 - 2026-07-09
Added
- Added
slotCostto task options, so a task that needs more memory or CPU can consume more than one worker slot and a worker runs fewer of them at once. Durable tasks do not accept it, and on older engines it has no effect. See Task Slot Cost.
v1.24.3 - 2026-06-17
Removed
- Removed the unused
_isV1field andisV1getter fromHatchetClient. The getter always returned a hardcoded value and was not referenced anywhere in the codebase.
v1.24.2 - 2026-06-15
Fixed
- Fixed a bug where the durable event listener's request iterator could survive a stream reconnect and drain items from the new queue into the dead stream, causing durable tasks to hang indefinitely after an engine restart. The iterator now captures its queue and abort signal at creation time and terminates cleanly when the connection is replaced.
v1.24.1 - 2026-06-12
Fixed
- Fixed an issue where errors raised by child tasks spawned inside a durable parent task were not propagated back to the parent. The parent can now catch the child's error and handle it gracefully.
v1.24.0 - 2026-06-11
Added
- Added a
getDetailsmethod tohatchet.runsto retrieve task details.
v1.23.1 - 2026-06-09
Added
- Added an
individualRunSpansForBulkRunOpenTelemetry config option. When enabled, a childhatchet.run_workflowspan is created for each item in a bulk run (runWorkflows), nested under the parenthatchet.run_workflowsspan, with each item's traceparent pointing at its own span. Defaults tofalseto preserve the existing span structure.
Fixed
WorkflowsClient.get()now finds the exact workflow name match from list results instead of taking the first result, preventing incorrect workflow ID resolution when a name prefix-match returns multiple workflows.
v1.23.0 - 2026-05-27
Added
- Fixes
cancellation_grace_periodandcancellation_warning_thresholdnot being propagated from client config to Hatchet config. - Adds
grpc_max_recv_message_lengthandgrpc_max_send_message_lengthto client config, also configurable via env vars. Defaults to 4MB.
Fixed
- SDK import deprecation warnings to route via
process.emitWarningwith codeHATCHET_V0_REMOVED. EventClient.BulkPushcall usesoptionsargument as fallback when noinputis present.
v1.22.4 - 2026-05-22
Fixed
- Bumped
@anthropic-ai/claude-agent-sdkto^0.3.148so Claude agent SDK integrations resolve the correct Linux native binary on glibc systems. - Updated the TypeScript Claude agent example to load the ESM-only Claude Agent SDK dynamically.
v1.22.3 - 2026-05-18
Fixed
- Fixed
@openai/agentsimport that was not inside try block and caused errors when installing with Bun.
v1.22.2 - 2026-05-13
Fixed
- Fixed
DurableContext.waitForEventoverload ordering so calls without a payload schema infer the untyped event payload return type.
v1.22.1 - 2026-05-05
Fixed
Moved optional dependencies from optionalDependencies to peerDependencies.
v1.22.0 - 2026-04-28
Added
- Adds
mcpToolmethod to Workflow objects for integration with Claude and OpenAI agent SDKs. Requires Zod v4. - Bumps minimum Zod version to
3.25.0. Zod schemas provided to the SDK must be Zod 4 schemas, but you can still use Zod 3 in your application code.
v1.21.2 - 2026-04-22
Added
- Adds
triggeringEventIdandtriggeringEventKeyto theContext
v1.21.1 - 2026-04-21
Fixed
- Adds an optional
labelon durable event waits, which will propagate through to the dashboard
v1.21.0 - 2026-04-08
Added
- runMany and runManyNoWait APIs for workflows and standalone tasks to support bulk runs with per-run options.
- RunManyOpt input shape containing an input object and an options object.
Changed
- Bulk docs to include runMany and runManyNoWait examples.
v1.20.1 - 2026-04-07
Fixed
- Fixed duplicate child run deduplication when mixing
ctx.runChild()andworkflow.runNoWait()(or deeply nested recursive spawns).Context.spawnIndexandParentRunContextManager.childIndexwere tracked independently, causing both APIs to emit overlappingchildIndexvalues and silently deduplicate children that should have been unique. The two counters now share a single source of truth viaAsyncLocalStorage, andincrementChildIndexmutates the context object in place instead of replacing it withenterWith, which lost updates acrossawaitboundaries.
v1.20.0 - 2026-04-07
Added
- Adds
scopeandlookbackWindowarguments for theDurableContext.waitForEvent, which allows durable tasks to look back in time for events that may have been emitted before the task started.
v1.19.1 - 2026-03-25
Changed
- Event source info (
hatchet__source_workflow_run_id,hatchet__source_step_run_id) is now injected into event metadata at theEventClientlevel, so cross-workflow trace linking works even without the OTel instrumentor enabled.
v1.19.0 - 2026-03-25
Fixed
- Fixed OpenTelemetry version mismatch causing
TypeError: Cannot read properties of undefined (reading 'name')when exporting spans. The SDK now requires OpenTelemetry JS SDK 2.x (@opentelemetry/sdk-trace-base@^2.0.0,@opentelemetry/core@^2.0.0) to match the@opentelemetry/exporter-trace-otlp-grpc@^0.208.0dependency.
Changed
- Updated OpenTelemetry optional dependencies to the unified 2.x release set.
v1.18.0 - 2026-03-18
Added
- OpenTelemetry instrumentation via
HatchetInstrumentorwith automatic tracing for workflow runs, event pushes, and step executions - OpenTelemetry example demonstrating automatic and custom span instrumentation (
examples/opentelemetry_instrumentation)
v1.17.2 - 2026-03-17
Added
- Added
getTaskStatsandscrapePrometheusMetricsmethods to the metrics client.
v1.17.1 - 2026-03-17
Changed
- Updates the
DurableTaskRunAckEntryResultinterface to includeworkflowRunExternalIdfield, to enable spawning children from durable tasks fire-and-forget style.
v1.17.0 - 2026-03-16
Added
- Added a
DurableContext.waitForEventhelper which returns the payload of the awaited event. - Added an
EvictionPolicy, which allows durable tasks to be evicted from the worker when idle.
Changed
- Makes a bunch of internal-facing changes for new durable execution features
v1.16.0 - 2026-03-11
Added
- Added logs client for retrieving task run logs.
v1.15.2 - 2026-03-06
Fixed
waitForand task conditions (e.g. user event keys) are correctly namespaced when using a non-default namespace.- Cron expressions now support an optional leading seconds field (6-part expressions), e.g.
30 * * * * *to trigger at 30 seconds past every minute.
v1.15.1 - 2026-03-04
Fixed
- Fix npm publish so the package includes compiled JavaScript at the correct paths.
v1.15.0 - 2026-03-03
Added
- Adds a
desiredWorkerLabelsoption toRunOptsto allow dynamically routing task runs to a specific worker at trigger time
v1.14.0 - 2026-02-28
Deprecated
- v0 SDK is now deprecated. Migrate to the v1 API for ongoing support.
Added
- Internal legacy transformer for backwards compatibility with existing v0 workflows and workers.
v1.13.1 - 2026-02-27
Changed
- Updated internal dependencies to address security advisories.
v1.13.0 - 2026-02-23
Added
- Introduced client middleware support with composable
before/afterhooks to customize request handling and response processing. - Added middleware examples and recipes to demonstrate practical client-side patterns.
v1.12.1 - 2026-02-18
Fixed
- Restored
ctx.taskRunId()as a deprecated alias forctx.taskRunExternalId()on both v0 and v1 worker contexts, so existing code callingctx.taskRunId()continues to work after the proto naming changes in 1.11.0.
v1.12.0 - 2026-02-13
Added
- Webhooks client for managing incoming webhooks: create, list, get, update, and delete methods for webhooks, so external systems (e.g. GitHub, Stripe) can trigger workflows via HTTP.
v1.11.0 - 2026-02-05
Internal Only
- Updated gRPC/REST contract field names to lowerCamelCase for consistency across SDKs.
v1.11.0 - 2026-02-04
Changed
- Updated the metrics client for the latest server metrics APIs (including adding
getTaskStatusMetricsfor tenant task/run status counts). - Removes deprecated metrics methods.
v1.10.8 - 2026-02-02
Changed
- Improved cancellation log messages: cancellation-related logs now use
debuglevel instead oferrorlevel since cancellation is expected behavior, not a failure. - Updated terminology in log messages from "step run" to "task run" for consistency.
- Added link to cancellation docs (https://docs.hatchet.run/v1/cancellation) in error messages when task completion fails.
v1.10.7 - 2026-01-27
Added
- Adds support for an
inputValidatorprop on the various workflow definitions, e.g.hatchet.workflowandhatchet.task, which accepts a Zod schema to validate the input to the workflow or task. Used on the dashboard to provide autocomplete on the trigger workflow form.
v1.10.6 - 2026-01-27
Changed
- Improves handling of cancellations for tasks to limit how often tasks receive a cancellation but then are marked as succeeded anyways.
Last updated on October 9, 2026