import type { StringValue } from './_ms.js'; /** * @internal * All the slugs of the errors used for documentation links. */ export declare const ERROR_SLUGS: { readonly NODE_JS_MODULE_IN_WORKFLOW: "node-js-module-in-workflow"; readonly START_INVALID_WORKFLOW_FUNCTION: "start-invalid-workflow-function"; readonly SERIALIZATION_FAILED: "serialization-failed"; readonly WEBHOOK_INVALID_RESPOND_WITH_VALUE: "webhook-invalid-respond-with-value"; readonly WEBHOOK_RESPONSE_NOT_SENT: "webhook-response-not-sent"; readonly FETCH_IN_WORKFLOW_FUNCTION: "fetch-in-workflow"; readonly TIMEOUT_FUNCTIONS_IN_WORKFLOW: "timeout-in-workflow"; readonly HOOK_CONFLICT: "hook-conflict"; readonly CORRUPTED_EVENT_LOG: "corrupted-event-log"; readonly REPLAY_DIVERGENCE: "replay-divergence"; readonly STEP_NOT_REGISTERED: "step-not-registered"; readonly WORKFLOW_NOT_REGISTERED: "workflow-not-registered"; readonly RUNTIME_DECRYPTION_FAILED: "runtime-decryption-failed"; }; type ErrorSlug = (typeof ERROR_SLUGS)[keyof typeof ERROR_SLUGS]; interface WorkflowErrorOptions extends ErrorOptions { /** * The slug of the error. This will be used to generate a link to the error documentation. */ slug?: ErrorSlug; } /** * The base class for all Workflow-related errors. * * This error is thrown by the Workflow SDK when internal operations fail. * You can use this class with `instanceof` to catch any Workflow SDK error. * * @example * ```ts * try { * await getRun(runId); * } catch (error) { * if (error instanceof WorkflowError) { * console.error('Workflow SDK error:', error.message); * } * } * ``` */ export declare class WorkflowError extends Error { readonly cause?: unknown; constructor(message: string, options?: WorkflowErrorOptions); static is(value: unknown): value is WorkflowError; } /** * Thrown when a world (storage backend) operation fails unexpectedly. * * This is the catch-all error for world implementations. Specific, * well-known failure modes have dedicated error types (e.g. * EntityConflictError, RunExpiredError, ThrottleError). This error * covers everything else — validation failures, missing entities * without a dedicated type, or unexpected HTTP errors from world-vercel. */ export declare class WorkflowWorldError extends WorkflowError { status?: number; code?: string; url?: string; /** Retry-After value in seconds, present on 429 and 425 responses */ retryAfter?: number; constructor(message: string, options?: { status?: number; url?: string; code?: string; retryAfter?: number; cause?: unknown; }); static is(value: unknown): value is WorkflowWorldError; } /** * Thrown when a workflow run fails during execution. * * This error indicates that the workflow encountered a fatal error and cannot * continue. It is thrown when awaiting `run.returnValue` on a run whose status * is `'failed'`. The `cause` property contains the underlying error with its * message, stack trace, and optional error code. * * Use the static `WorkflowRunFailedError.is()` method for type-safe checking * in catch blocks. * * @example * ```ts * import { WorkflowRunFailedError } from "workflow/internal/errors"; * * try { * const result = await run.returnValue; * } catch (error) { * if (WorkflowRunFailedError.is(error)) { * console.error(`Run ${error.runId} failed:`, error.cause.message); * } * } * ``` */ export declare class WorkflowRunFailedError extends WorkflowError { runId: string; /** * The high-level error category (e.g. USER_ERROR, RUNTIME_ERROR) for the * failed run, from the run_failed event's `errorCode` field. */ errorCode?: string; /** * The original thrown value from the failed workflow run, hydrated through * the workflow serialization pipeline. Preserves the original type identity * (Error subclasses, FatalError, custom classes with WORKFLOW_SERIALIZE, etc.) * and custom properties (cause chains, etc.). * * Note: any JavaScript value can be thrown, so this is typed as `unknown`. * Typical values are Error instances, but strings, objects, etc. are also * possible. */ cause: unknown; constructor(runId: string, error: unknown, options?: { errorCode?: string; }); static is(value: unknown): value is WorkflowRunFailedError; } /** * Thrown when attempting to get results from an incomplete workflow run. * * This error occurs when you try to access the result of a workflow * that is still running or hasn't completed yet. */ export declare class WorkflowRunNotCompletedError extends WorkflowError { runId: string; status: string; constructor(runId: string, status: string); static is(value: unknown): value is WorkflowRunNotCompletedError; } /** * Thrown when the Workflow runtime encounters an internal error. * * This error indicates an issue with workflow execution, such as * serialization failures, starting an invalid workflow function, or * other runtime problems. */ export declare class WorkflowRuntimeError extends WorkflowError { constructor(message: string, options?: WorkflowErrorOptions); static is(value: unknown): value is WorkflowRuntimeError; } /** * Thrown when the persisted workflow event log cannot be replayed because it * contains orphaned, duplicate, or mismatched events. * * This is a runtime/infrastructure failure rather than user code throwing. * When this reaches run failure handling, it is recorded with the distinct * `CORRUPTED_EVENT_LOG` code so worlds and backends can track it separately * from generic runtime failures. */ export declare class CorruptedEventLogError extends WorkflowRuntimeError { constructor(message: string, options?: ErrorOptions); static is(value: unknown): value is CorruptedEventLogError; } /** * Thrown when the current workflow replay cannot follow the path described by * the recorded event log. A single divergence does not prove that the * persisted history is invalid: a subsequent replay may observe or schedule * work correctly, so the runtime may redeliver before declaring corruption. */ export declare class ReplayDivergenceError extends WorkflowRuntimeError { readonly eventId: string; constructor(message: string, options: ErrorOptions & { eventId: string; }); static is(value: unknown): value is ReplayDivergenceError; } /** * Optional structured context attached to a {@link RuntimeDecryptionError}, * carried over from the underlying decrypt call site to help diagnose the * failure without poking through stacks. */ export interface RuntimeDecryptionErrorContext { /** The operation that failed — useful to tell encrypt vs decrypt apart. */ operation?: 'encrypt' | 'decrypt'; /** Byte length of the input payload at the time of the failure. */ byteLength?: number; /** * The first 4 bytes of the input payload, decoded as UTF-8 if printable. * Useful for telling apart truncated-but-valid-looking encrypted payloads * from completely unrelated corruption (e.g. an HTML error page surfaced * as a 200 OK). */ formatPrefix?: string; } /** * Thrown when the SDK's built-in AES-GCM encryption layer fails to encrypt * or decrypt a workflow payload. * * This is an internal SDK failure — user code never invokes the SDK's * encryption primitives directly. Common causes: * * - A ciphertext / auth tag mismatch, typically surfaced as the native Web * Crypto `OperationError: The operation failed for an operation-specific * reason`. Usually caused by ciphertext mutation or truncation in transit * between storage and read (truncated HTTP response, edge-cache miss * returning a partial 200, proxy drop during streaming, etc.). * - A key resolution mismatch (wrong deployment, missing key material). * - A malformed encrypted envelope (too short to contain the GCM nonce * and tag). * * Extends {@link WorkflowRuntimeError} so the run-failure classifier * routes it to `RUNTIME_ERROR`. */ export declare class RuntimeDecryptionError extends WorkflowRuntimeError { /** Optional structured context about the failed encrypt/decrypt call. */ readonly context?: RuntimeDecryptionErrorContext; constructor(message: string, options?: ErrorOptions & { context?: RuntimeDecryptionErrorContext; }); static is(value: unknown): value is RuntimeDecryptionError; } interface WorkflowBuildErrorOptions extends ErrorOptions { /** * An optional actionable hint appended to the main message, explaining how * the user can resolve the failure. Shown after a blank line. */ hint?: string; } /** * Thrown when the workflow build pipeline (esbuild, SWC transform, file * discovery, bundler integration) fails in a way the user can act on. * * This is distinct from `WorkflowRuntimeError` (which is raised at runtime * by the workflow engine) — `WorkflowBuildError` fires during `pnpm build`, * `next build`, or equivalent, before any workflow has started executing. * * Prefer attaching a short, actionable `hint` (e.g. `run \`pnpm install workflow\``) * as plain text — the rendering layer is responsible for any styling or * "hint:" label. Keeping `hint` plain keeps it useful in non-TTY contexts * (CI logs, structured error serialization) where ANSI escapes are noise. */ export declare class WorkflowBuildError extends WorkflowError { readonly hint?: string; constructor(message: string, options?: WorkflowBuildErrorOptions); static is(value: unknown): value is WorkflowBuildError; } interface SerializationErrorOptions extends ErrorOptions { /** * An optional actionable hint appended to the main message, explaining how * the user can resolve the failure (e.g. "register the class with…" or * "move this call inside a step"). */ hint?: string; } /** * Thrown when a value cannot be serialized into or deserialized out of the * workflow event log. * * This usually indicates a user-facing mistake: passing a non-serializable * value (class without `WORKFLOW_SERIALIZE`, locked stream, direct workflow * function reference) into a step boundary, or an unregistered class * returning from a step. * * Internal invariants (corrupted buffers, unknown format bytes) should use * `WorkflowRuntimeError` instead — this class is scoped to things the user * can fix in their own code. */ export declare class SerializationError extends WorkflowError { readonly hint?: string; /** * Serialization errors are deterministic — if a step returns a non-POJO, * replaying the step will always produce the same non-serializable value. * Retrying is guaranteed to fail, so these errors are surfaced as fatal * and skip the step-retry loop. `FatalError.is()` recognizes any error * with `fatal: true` (see `packages/errors/src/index.ts`), so no other * wiring is required for user-thrown SerializationErrors. */ readonly fatal = true; constructor(message: string, options?: SerializationErrorOptions); static is(value: unknown): value is SerializationError; } /** * Thrown when a step function is not registered in the current deployment. * * This is an infrastructure error — not a user code error. It typically means * something went wrong with the bundling/build tooling that caused the step * to not get built correctly. * * When this happens, the step fails (like a FatalError) and control is passed back * to the workflow function, which can optionally handle the failure gracefully. */ export declare class StepNotRegisteredError extends WorkflowRuntimeError { stepName: string; constructor(stepName: string); static is(value: unknown): value is StepNotRegisteredError; } /** * Thrown when a workflow function is not registered in the current deployment. * * This is an infrastructure error — not a user code error. It typically means: * - A run was started against a deployment that does not have the workflow * (e.g., the workflow was renamed or moved and a new run targeted the latest deployment) * - Something went wrong with the bundling/build tooling that caused the workflow * to not get built correctly * * When this happens, the run fails with a `RUNTIME_ERROR` error code. */ export declare class WorkflowNotRegisteredError extends WorkflowRuntimeError { workflowName: string; constructor(workflowName: string); static is(value: unknown): value is WorkflowNotRegisteredError; } /** * Thrown when performing operations on a workflow run that does not exist. * * This error occurs when you call methods on a run object (e.g. `run.status`, * `run.cancel()`, `run.returnValue`) but the underlying run ID does not match * any known workflow run. Note that `getRun(id)` itself is synchronous and will * not throw — this error is raised when subsequent operations discover the run * is missing. * * Use the static `WorkflowRunNotFoundError.is()` method for type-safe checking * in catch blocks. * * @example * ```ts * import { WorkflowRunNotFoundError } from "workflow/internal/errors"; * * try { * const status = await run.status; * } catch (error) { * if (WorkflowRunNotFoundError.is(error)) { * console.error(`Run ${error.runId} does not exist`); * } * } * ``` */ export declare class WorkflowRunNotFoundError extends WorkflowError { runId: string; constructor(runId: string); static is(value: unknown): value is WorkflowRunNotFoundError; } /** * Thrown when a hook token is already in use by another active workflow run. * * This is a user error — it means the same custom token was passed to * `createHook` in two or more concurrent runs. Use a unique token per run * (or omit the token to let the runtime generate one automatically). */ export declare class HookConflictError extends WorkflowError { token: string; conflictingRunId?: string; constructor(token: string, conflictingRunId?: string); static is(value: unknown): value is HookConflictError; } /** * Thrown when calling `resumeHook()` or `resumeWebhook()` with a token that * does not match any active hook. * * Common causes: * - The hook has expired (past its TTL) * - The hook was already disposed after being consumed * - The workflow has not started yet, so the hook does not exist * * A common pattern is to catch this error and start a new workflow run when * the hook does not exist yet (the "resume or start" pattern). * * Use the static `HookNotFoundError.is()` method for type-safe checking in * catch blocks. * * @example * ```ts * import { HookNotFoundError } from "workflow/internal/errors"; * * try { * await resumeHook(token, payload); * } catch (error) { * if (HookNotFoundError.is(error)) { * // Hook doesn't exist — start a new workflow run instead * await startWorkflow("myWorkflow", payload); * } * } * ``` */ export declare class HookNotFoundError extends WorkflowError { token: string; constructor(token: string); static is(value: unknown): value is HookNotFoundError; } /** * Thrown when an operation conflicts with the current state of an entity. * This includes attempts to modify an entity already in a terminal state, * create an entity that already exists, or any other 409-style conflict. * * The workflow runtime handles this error automatically. Users interacting * with world storage backends directly may encounter it. */ export declare class EntityConflictError extends WorkflowWorldError { constructor(message: string); static is(value: unknown): value is EntityConflictError; } /** * Thrown when a run is no longer available — either because it has been * cleaned up, expired, or already reached a terminal state (completed/failed). * * The workflow runtime handles this error automatically. Users interacting * with world storage backends directly may encounter it. */ export declare class RunExpiredError extends WorkflowWorldError { constructor(message: string); static is(value: unknown): value is RunExpiredError; } /** * Thrown when an operation cannot proceed because a required timestamp * (e.g. retryAfter) has not been reached yet. * * The workflow runtime handles this error automatically. Users interacting * with world storage backends directly may encounter it. * * @property retryAfter - Delay in seconds before the operation can be retried. */ export declare class TooEarlyError extends WorkflowWorldError { constructor(message: string, options?: { retryAfter?: number; }); static is(value: unknown): value is TooEarlyError; } /** * Thrown when a request is rate limited by the workflow backend. * * The workflow runtime handles this error automatically with retry logic. * Users interacting with world storage backends directly may encounter it * if retries are exhausted. * * @property retryAfter - Delay in seconds before the request can be retried. */ export declare class ThrottleError extends WorkflowWorldError { retryAfter?: number; constructor(message: string, options?: { retryAfter?: number; }); static is(value: unknown): value is ThrottleError; } /** * Thrown when awaiting `run.returnValue` on a workflow run that was cancelled. * * This error indicates that the workflow was explicitly cancelled (via * `run.cancel()`) and will not produce a return value. You can check for * cancellation before awaiting the return value by inspecting `run.status`. * * Use the static `WorkflowRunCancelledError.is()` method for type-safe * checking in catch blocks. * * @example * ```ts * import { WorkflowRunCancelledError } from "workflow/internal/errors"; * * try { * const result = await run.returnValue; * } catch (error) { * if (WorkflowRunCancelledError.is(error)) { * console.log(`Run ${error.runId} was cancelled`); * } * } * ``` */ export declare class WorkflowRunCancelledError extends WorkflowError { runId: string; constructor(runId: string); static is(value: unknown): value is WorkflowRunCancelledError; } /** * Thrown when attempting to operate on a workflow run that requires a newer World version. * * This error occurs when a run was created with a newer spec version than the * current World implementation supports. To resolve this, upgrade your * `workflow` packages to a version that supports the required spec version. * * Use the static `RunNotSupportedError.is()` method for type-safe checking in * catch blocks. * * @example * ```ts * import { RunNotSupportedError } from "workflow/internal/errors"; * * try { * const status = await run.status; * } catch (error) { * if (RunNotSupportedError.is(error)) { * console.error( * `Run requires spec v${error.runSpecVersion}, ` + * `but world supports v${error.worldSpecVersion}` * ); * } * } * ``` */ export declare class RunNotSupportedError extends WorkflowError { readonly runSpecVersion: number; readonly worldSpecVersion: number; constructor(runSpecVersion: number, worldSpecVersion: number); static is(value: unknown): value is RunNotSupportedError; } /** * A fatal error is an error that cannot be retried. * It will cause the step to fail and the error will * be bubbled up to the workflow logic. * * Any error can opt into the non-retry behavior by setting a `fatal: true` * own property. This is how structured error classes that aren't direct * `FatalError` subclasses (e.g. context-violation errors) signal to the * step handler that retrying will never help — the user's code is calling * a workflow-only API from the wrong context, or similar — and burning * retry attempts just produces a wall of duplicated log output. */ export declare class FatalError extends Error { fatal: boolean; constructor(message: string); static is(value: unknown): value is FatalError; } export interface RetryableErrorOptions { /** * The number of milliseconds to wait before retrying the step. * Can also be a duration string (e.g., "5s", "2m") or a Date object. * If not provided, the step will be retried after 1 second (1000 milliseconds). */ retryAfter?: number | StringValue | Date; } /** * An error that can happen during a step execution, allowing * for configuration of the retry behavior. */ export declare class RetryableError extends Error { /** * The Date when the step should be retried. */ retryAfter: Date; constructor(message: string, options?: RetryableErrorOptions); static is(value: unknown): value is RetryableError; } export declare const VERCEL_403_ERROR_MESSAGE = "Your current vercel account does not have access to this resource. Use `vercel login` or `vercel switch` to ensure you are linked to the right account."; export { RUN_ERROR_CODES, type RunErrorCode } from './error-codes.js'; //# sourceMappingURL=index.d.ts.map