Changelog
v0.9.4
What’s Changed
Runtime Safety
- Mutating client methods (
startJobChain,startJobChains,deleteJobChains,triggerJob,completeJobChain) now enforce that a transaction context fromrunInTransactionis provided at runtime, throwingTransactionContextRequiredErrorif omitted. This matches the existing TypeScript type requirements and ensures consistent behavior for JavaScript callers. - New exported error class
TransactionContextRequiredErrorfor specific error handling.
Bug Fixes
- Dashboard chain-delete and job-trigger routes now correctly wrap mutating calls in a transaction context.
Packages
All packages released at 0.9.4: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.9.3
What’s Changed
Improvements
-
Simplified
JobAttemptMiddlewaretype signature — The second type parameter (TJobTypeDefinitions) has been removed fromJobAttemptMiddlewareandJobTypeProcessorDefaults. Middleware definitions are now simpler: useJobAttemptMiddleware<typeof stateAdapter>instead ofJobAttemptMiddleware<typeof stateAdapter, JobTypeRegistryDefinitions<typeof registry>>. TheJobTypeRegistryDefinitionsimport is no longer needed for middleware. -
Fixed
ResolvedJobChainoutput type — Intermediate chain steps withoutput: undefinedno longer leakundefinedinto the final chain’s completed output type.
Packages
All packages released at 0.9.3: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.9.2
What’s Changed
Bug Fixes
- Fix broken package exports in published npm packages — tsdown’s
devExportswrites source paths toexportsand dist paths topublishConfig.exports, butnpm publish(used bychangeset publish) does not applypublishConfigoverrides. Switched topnpm publishwhich handles this natively.
Packages
All packages released at 0.9.2: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.9.1
What’s Changed
Bug Fixes
- Fix broken package exports in published npm packages —
publishConfigoverrides (e.g.exportspointing todist/) were not being applied duringchangeset publish, causing v0.9.0 packages to be unusable
Packages
All packages released at 0.9.1: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.9.0
What’s Changed
Features
- Richer error messages: Failed jobs now store the full stack trace and custom Error properties (e.g.,
code,statusCode) instead of just[object Object]or a bare message string. Long errors are truncated at 10,000 characters. - New observability events:
jobChainDeletedandjobTriggeredevents are now emitted through logging, OpenTelemetry, and custom observability adapters. - Safer
triggerJob: Now guards against non-pending jobs (AND status = 'pending') and uses row-level locking (FOR UPDATE) in Postgres to prevent race conditions.
Breaking Changes
- Default Postgres schema changed: The Postgres adapter now defaults to
schema: "public"withtablePrefix: "queuert_"(previouslyschema: "queuert"with no prefix). Pass{ schema: "queuert", tablePrefix: "" }tocreatePgStateAdapterto preserve existing behavior. - Removed type exports:
NavigationMap,BaseNavigationMap,BaseNavigationEntry,JobTypeRegistryNavigation,ChainJobTypeNames,ContinuationJobTypes,EntryJobTypeDefinitions,BlockedJobTypeNames,ChainTypesReaching,JobTypeProcessorRegistryNavigation,processorNavigationSymbol. UseJobTypeNames,JobTypeEntryNames, andJobTypePropertyas replacements. - Union-based merged registries: Merged registry definitions are now a union type instead of an intersection.
Packages
All packages released at 0.9.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.8.1
What’s Changed
Bug Fixes
- Dashboard: Fixed job detail continuation lookup to use a targeted query instead of fetching the entire chain, significantly improving performance for long chains.
- Dashboard: Fixed a race condition where changing filters while a “load more” request was in-flight could append stale results in the chain and job list views.
- Dashboard: The
leasedBybadge in the job list now only appears for running jobs. - Dashboard: Fixed TypeScript type inference for
createDashboard— theclientoption now preserves generic types instead of requiringClient<any, any>.
Packages
All packages released at 0.8.1: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.8.0
What’s Changed
Breaking Changes
- Renamed worker and client options for clarity:
registry→jobTypeRegistry,processorRegistry→jobTypeProcessorRegistry,processDefaults→jobTypeProcessorDefaults. TheInProcessWorkerProcessDefaultstype is nowJobTypeProcessorDefaults.mergeJobTypeRegistriesandmergeJobTypeProcessorRegistriesnow take{ slices: [...] }instead of positional args. - The
Jobtype now has a 5th type parameterTOutput. Completed jobs expose anoutputfield. - Dashboard now takes a
Clientinstance instead of raw adapters.
Features
triggerJobAPI: New client method to trigger a pending job immediately, bypassing its scheduled time. Dashboard also gains a “Trigger” button for pending jobs.jobChainTypeNamefilter onlistJobs: Query jobs scoped to chains of a specific type.- Chain deletion in dashboard: Delete job chains with a confirmation dialog.
- Merged registry rejection:
createJobTypeProcessorRegistrynow throws a clearTypeErrorwhen passed a merged registry.
Bug Fixes
continueWithnow uses distributive conditional types for correct type checking across union job types.completeJobChainrejects un-narrowed union jobs, preventing ambiguous completions.
Packages
All packages released at 0.8.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.7.0
What’s Changed
Features
- Savepoint support for TransactionHooks — New
withSavepoint(fn)andcreateSavepoint()methods enable partial rollback of buffered side effects (notifications, observability events) within a transaction without discarding the entire transaction’s work. Hook definitions can now provide acheckpointcallback via the new optionalHookDef.checkpointfield. HookDefandTransactionHooksSavepointtypes are now exported from@queuert/core.
Bug Fixes
- Lease renewal scoped to staged mode — Lease renewal after
getJobBlockersno longer runs in atomic/deferred modes where the transaction stays open and renewal is unnecessary. - Error handler transaction rollback — When the error handler’s
runInTransactionfails, prepare and complete transactions are now properly rejected (rolled back) instead of resolved, preventing jobs from being left in inconsistent state. - Default
TJobIdtype corrected —PgStateAdapterandSqliteStateAdaptertype defaults changed fromstringtoUUID, matching actual runtime behavior.
Breaking Changes
StateAdapter.withSavepointis now a required method (previously optional) with a simplified positional signature:withSavepoint(txCtx, fn). Custom state adapter implementations must add this method.- Default
TJobIdgeneric onPgStateAdapterandSqliteStateAdapterchanged fromstringtoUUID. Code relying on the previousstringdefault may see new type errors.
Packages
All packages released at 0.7.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.6.0
What’s Changed
Features
- Batch
startJobChainsAPI — Create multiple job chains in a single operation viaclient.startJobChains(), with full type-safe return values and optimized database round-trips for PostgreSQL (unnest+ CTE-based batch inserts) - Savepoint-protected user callbacks —
prepareandcompletecallbacks during job processing now run inside database savepoints on PostgreSQL. If a user callback executes a failing SQL statement, only the savepoint is rolled back — the outer transaction remains usable for error handling (reschedule, retry, etc.) - Optional
withSavepointon StateAdapter — Custom state adapter authors can implementwithSavepointto opt into savepoint protection. The PostgreSQL adapter implements this automatically
Breaking Changes
- StateAdapter interface updated —
createJob/addJobBlockers(singular) replaced bycreateJobs/addJobsBlockers(plural/batched). Custom state adapter implementations must update to the new array-based signatures. The official PostgreSQL and SQLite adapters are already updated - Removed type exports —
CompleteJobChainResultandJobChainCompleteOptionsare no longer exported fromqueuert(now internal types prefixed with_)
Packages
All packages released at 0.6.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.
v0.5.1
What’s Changed
Features
- Compile-time validation for job type definitions — New
ValidatedJobTypeDefinitionsandJobTypeDefinitionErrorstypes catch definition errors (missing output schemas, invalid blocker references, unknown type names) as TypeScript errors instead of accepting them silently - Compile-time validation for
createInProcessWorker— Processor registries containing job types unknown to the client are now rejected at compile time instead of only failing at runtime - Validation adapter examples updated to use the new compile-time validation types
Packages
All packages released at 0.5.1: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.