@mastra/inngest 1.5.0-alpha.0 → 1.5.0-alpha.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @mastra/inngest
2
2
 
3
+ ## 1.5.0-alpha.1
4
+
5
+ ### Minor Changes
6
+
7
+ - Add fire-and-forget workflow resume that returns immediately with `{ runId }` without awaiting the run output. ([#17230](https://github.com/mastra-ai/mastra/pull/17230))
8
+
9
+ For `@mastra/inngest`, this skips the `getRunOutput()` polling that previously raced a realtime subscription against the Inngest runs API and could surface spurious 404s even though the durable workflow was running fine.
10
+ - `Run.resumeAsync()` added to core: dispatches the resume in the background and returns `{ runId }` immediately. Engines that poll for results (Inngest) override it to skip polling entirely.
11
+ - `InngestRun.resumeAsync()` sends the resume event and returns `{ runId }`, skipping polling. Send-time failures (bad payload, event send failure) still reject synchronously and roll back the snapshot.
12
+ - New `POST /workflows/:workflowId/resume-no-wait` and `POST /agent-builder/:actionId/resume-no-wait` routes return `{ runId }` immediately.
13
+ - New client SDK `run.resumeNoWait()` resolves with `{ runId }`.
14
+
15
+ The existing `resumeAsync()` client/server surface is unchanged and still resolves with the full workflow result, so there is no breaking change.
16
+
17
+ `resumeNoWait` is intentionally additive in v1. In Mastra v2 the fire-and-forget behavior is planned to become the default behavior of `resumeAsync()` (mirroring `start`/`resume` semantics), at which point `resumeNoWait` and the `resume-no-wait` routes will be removed. The code paths carry `TODO(v2)` comments documenting this consolidation.
18
+
19
+ ### Patch Changes
20
+
21
+ - Fixed processor workflow steps so `args.systemMessages` only contains untagged system messages. Tagged processor-owned system messages stay on the message list and are still included in the final model input. ([#16950](https://github.com/mastra-ai/mastra/pull/16950))
22
+
23
+ - Updated dependencies [[`8ace89d`](https://github.com/mastra-ai/mastra/commit/8ace89df77f762e622d3b9f7f65ad7524350d050), [`fa63872`](https://github.com/mastra-ai/mastra/commit/fa6387280954e6b667bec5714b55ba082bc627ff), [`f07b646`](https://github.com/mastra-ai/mastra/commit/f07b64604ab7d25391179790b7fd4823df9e2dff), [`d8838ae`](https://github.com/mastra-ai/mastra/commit/d8838ae80b69780361693d27098f7f6684af12fe), [`40f9297`](https://github.com/mastra-ai/mastra/commit/40f9297003b921c62373d3e8d3a4bda76c9f6de3), [`0f0d1ba`](https://github.com/mastra-ai/mastra/commit/0f0d1ba67bfcb2204e571401662f1eceefc03357), [`8c31bcd`](https://github.com/mastra-ai/mastra/commit/8c31bcdb00e597880d5939b1b7d7566fbe5dacae), [`95b14cd`](https://github.com/mastra-ai/mastra/commit/95b14cdd820e86d97ac05fe568424c513a252e31), [`aa36be2`](https://github.com/mastra-ai/mastra/commit/aa36be23aa513b7dc53cb8ca16b7fab8f20e43ad), [`212c635`](https://github.com/mastra-ai/mastra/commit/212c635203e61d036ab41db8ff86c3893dc795b3), [`d8838ae`](https://github.com/mastra-ai/mastra/commit/d8838ae80b69780361693d27098f7f6684af12fe), [`9aa5a73`](https://github.com/mastra-ai/mastra/commit/9aa5a73e7e110f6e9365eec69364a33d5f03bb56), [`f73c789`](https://github.com/mastra-ai/mastra/commit/f73c789e8ef21561580395d2c410119cab5848c8), [`8bd16da`](https://github.com/mastra-ai/mastra/commit/8bd16da73a4cb874d739373643dbd6a6e7f88684), [`c8630f8`](https://github.com/mastra-ai/mastra/commit/c8630f80d4f40cb5d22e60ab162b618b1907167a), [`47f71dc`](https://github.com/mastra-ai/mastra/commit/47f71dc6fbcbd12d71e21a979e676e20a02bd77d), [`50ceae2`](https://github.com/mastra-ai/mastra/commit/50ceae270878e2f8fb2b2c6c2faab09df0007c8a), [`8cdde58`](https://github.com/mastra-ai/mastra/commit/8cdde5875bbba6702d9df226f2b20232b8d75d6c), [`847ff1e`](https://github.com/mastra-ai/mastra/commit/847ff1e0d94368d94b2e173e4e0908e115568ef3), [`259d409`](https://github.com/mastra-ai/mastra/commit/259d409a514174299dbde1ff5e1121209b3ba850), [`9e16c68`](https://github.com/mastra-ai/mastra/commit/9e16c6818b6485ccb43df28aba6f3a2219d28662), [`cefca33`](https://github.com/mastra-ai/mastra/commit/cefca33ae666e69810c935fedf95a929c173d1d7), [`d00e8c5`](https://github.com/mastra-ai/mastra/commit/d00e8c50daebe5bce5bf2f48bde39c86fc3d2fe4), [`36fa7e2`](https://github.com/mastra-ai/mastra/commit/36fa7e24d14e58a1eb46147097b32f583e5b8775), [`87e9774`](https://github.com/mastra-ai/mastra/commit/87e97741c1e493cd6d62f478eb810b49bda4d57c), [`65a72e7`](https://github.com/mastra-ai/mastra/commit/65a72e70c25eedea8ff985a6624b96be2850236b), [`0f77241`](https://github.com/mastra-ai/mastra/commit/0f7724108806703799a8ba80ad0f09414afd5066), [`92ff509`](https://github.com/mastra-ai/mastra/commit/92ff5098ef8a990438ca038077021a5f7541ec1d), [`3fce5e7`](https://github.com/mastra-ai/mastra/commit/3fce5e70d011d289043e75003ef3336ed4aa43c3), [`a763592`](https://github.com/mastra-ai/mastra/commit/a763592c3db46963ef1011cfe16fe372816e775e), [`80c7737`](https://github.com/mastra-ai/mastra/commit/80c7737e32d7917b5f356957d67c169d01744fd3), [`3f1cf47`](https://github.com/mastra-ai/mastra/commit/3f1cf476f74c1e4cc2df908837e05853a5347e31)]:
24
+ - @mastra/core@1.38.0-alpha.3
25
+
3
26
  ## 1.5.0-alpha.0
4
27
 
5
28
  ### Minor Changes
@@ -946,7 +946,15 @@ var InngestRun = class extends workflows.Run {
946
946
  this.executionResults = p;
947
947
  return p;
948
948
  }
949
- async _resume(params) {
949
+ /**
950
+ * Performs all resume preparation and dispatches the resume event to Inngest,
951
+ * but does NOT wait for the workflow result. Shared by `_resume()` (which polls
952
+ * for the result afterwards) and `resumeAsync()` (which returns immediately).
953
+ *
954
+ * Send-time failures (invalid resume data, event send failure) reject synchronously,
955
+ * and the snapshot is rolled back to its prior state on send failure.
956
+ */
957
+ async _resumeAndSendEvent(params) {
950
958
  const storage = this.#mastra?.getStorage();
951
959
  const workflowsStore = await storage?.getStore("workflows");
952
960
  if (!workflowsStore) {
@@ -1025,11 +1033,34 @@ var InngestRun = class extends workflows.Run {
1025
1033
  if (!eventId) {
1026
1034
  throw new Error("Event ID is not set");
1027
1035
  }
1036
+ return { eventId };
1037
+ }
1038
+ async _resume(params) {
1039
+ const { eventId } = await this._resumeAndSendEvent(params);
1028
1040
  const runOutput = await this.getRunOutput(eventId);
1029
1041
  const result = runOutput?.output?.result;
1030
1042
  this.hydrateFailedResult(result);
1031
1043
  return result;
1032
1044
  }
1045
+ /**
1046
+ * Resumes a suspended workflow without waiting for completion (fire-and-forget).
1047
+ * Returns immediately with the runId after sending the resume event to Inngest.
1048
+ * The workflow continues executing independently in Inngest.
1049
+ *
1050
+ * Mirrors `startAsync()`: send-time failures (invalid resume data, event send
1051
+ * failure) still reject synchronously and roll back the snapshot, but the result
1052
+ * is never polled via `getRunOutput()`. This avoids the polling-based 404 race when
1053
+ * you don't need the resolved result inline.
1054
+ *
1055
+ * NOTE: this is exposed over HTTP / the client SDK as `resume-no-wait` / `resumeNoWait()`,
1056
+ * not `resumeAsync`, because the existing `resumeAsync()` client/server surface awaits the
1057
+ * full workflow result. TODO(v2): consolidate so `resumeAsync` consistently means
1058
+ * fire-and-forget across core, client SDK and HTTP routes (breaking change deferred to v2).
1059
+ */
1060
+ async resumeAsync(params) {
1061
+ await this._resumeAndSendEvent(params);
1062
+ return { runId: this.runId };
1063
+ }
1033
1064
  async timeTravel(params) {
1034
1065
  const p = this._timeTravel(params).then((result) => {
1035
1066
  if (result.status !== "suspended") {
@@ -1832,5 +1863,5 @@ exports.InngestRun = InngestRun;
1832
1863
  exports.InngestWorkflow = InngestWorkflow;
1833
1864
  exports.collectInngestFunctions = collectInngestFunctions;
1834
1865
  exports.connect = connect;
1835
- //# sourceMappingURL=chunk-Q64WQPOH.cjs.map
1836
- //# sourceMappingURL=chunk-Q64WQPOH.cjs.map
1866
+ //# sourceMappingURL=chunk-MBGW5JID.cjs.map
1867
+ //# sourceMappingURL=chunk-MBGW5JID.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/execution-engine.ts","../src/pubsub.ts","../src/run.ts","../src/workflow.ts","../src/functions.ts","../src/connect.ts"],"names":["DefaultExecutionEngine","error","getErrorFromUnknown","randomUUID","createTimeTravelExecutionParams","PubSub","subscribe","Run","NonRetriableError","hydrateSerializedStepErrors","stream","ReadableStream","ChunkFrom","WorkflowRunOutput","Workflow","RequestContext","observability","SpanType","EntityType","emitErrorEvent"],"mappings":"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","file":"chunk-MBGW5JID.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { RequestContext } from '@mastra/core/di';\nimport { getErrorFromUnknown } from '@mastra/core/error';\nimport type { SerializedError } from '@mastra/core/error';\nimport type { PubSub } from '@mastra/core/events';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { EntityType } from '@mastra/core/observability';\nimport { DefaultExecutionEngine, createTimeTravelExecutionParams } from '@mastra/core/workflows';\nimport type {\n ExecutionContext,\n Step,\n StepResult,\n StepFailure,\n ExecutionEngineOptions,\n TimeTravelExecutionParams,\n WorkflowResult,\n} from '@mastra/core/workflows';\nimport type { Inngest, BaseContext } from 'inngest';\nimport { InngestWorkflow } from './workflow';\n\nexport class InngestExecutionEngine extends DefaultExecutionEngine {\n private inngestStep: BaseContext<Inngest>['step'];\n private inngestAttempts: number;\n\n constructor(\n mastra: Mastra,\n inngestStep: BaseContext<Inngest>['step'],\n inngestAttempts: number = 0,\n options: ExecutionEngineOptions,\n ) {\n super({ mastra, options });\n this.inngestStep = inngestStep;\n this.inngestAttempts = inngestAttempts;\n }\n\n // =============================================================================\n // Hook Overrides\n // =============================================================================\n\n /**\n * Format errors while preserving Error instances and their custom properties.\n * Uses getErrorFromUnknown to ensure all error properties are preserved.\n */\n protected formatResultError(\n error: Error | string | undefined,\n lastOutput: StepResult<any, any, any, any>,\n ): SerializedError {\n const outputError = (lastOutput as StepFailure<any, any, any, any>)?.error;\n const errorSource = error || outputError;\n const errorInstance = getErrorFromUnknown(errorSource, {\n serializeStack: true, // Include stack in JSON for better debugging in Inngest\n fallbackMessage: 'Unknown workflow error',\n });\n return errorInstance.toJSON();\n }\n\n /**\n * Detect InngestWorkflow instances for special nested workflow handling\n */\n isNestedWorkflowStep(step: Step<any, any, any>): boolean {\n return step instanceof InngestWorkflow;\n }\n\n /**\n * Inngest requires requestContext serialization for memoization.\n * When steps are replayed, the original function doesn't re-execute,\n * so requestContext modifications must be captured and restored.\n */\n requiresDurableContextSerialization(): boolean {\n return true;\n }\n\n /**\n * Execute a step with retry logic for Inngest.\n * Retries are handled via step-level retry (RetryAfterError thrown INSIDE step.run()).\n * After retries exhausted, error propagates here and we return a failed result.\n */\n async executeStepWithRetry<T>(\n stepId: string,\n runStep: () => Promise<T>,\n params: {\n retries: number;\n delay: number;\n stepSpan?: any;\n workflowId: string;\n runId: string;\n },\n ): Promise<{ ok: true; result: T } | { ok: false; error: { status: 'failed'; error: Error; endedAt: number } }> {\n for (let i = 0; i < params.retries + 1; i++) {\n if (i > 0 && params.delay) {\n await new Promise(resolve => setTimeout(resolve, params.delay));\n }\n try {\n //removed retry config with RetryAfterError from wrapDurableOperation, since we're manually handling retries here\n const result = await this.wrapDurableOperation(stepId, runStep);\n return { ok: true, result };\n } catch (e) {\n if (i === params.retries) {\n // After step-level retries exhausted, extract failure from error cause\n const cause = (e as any)?.cause;\n if (cause?.status === 'failed') {\n params.stepSpan?.error({\n error: e,\n attributes: { status: 'failed' },\n });\n // Ensure cause.error is an Error instance\n if (cause.error && !(cause.error instanceof Error)) {\n cause.error = getErrorFromUnknown(cause.error, { serializeStack: false });\n }\n return { ok: false, error: cause };\n }\n\n // Fallback for other errors - preserve the original error instance\n const errorInstance = getErrorFromUnknown(e, {\n serializeStack: false,\n fallbackMessage: 'Unknown step execution error',\n });\n params.stepSpan?.error({\n error: errorInstance,\n attributes: { status: 'failed' },\n });\n return {\n ok: false,\n error: {\n status: 'failed',\n error: errorInstance,\n endedAt: Date.now(),\n },\n };\n }\n }\n }\n // Should never reach here, but TypeScript needs it\n return { ok: false, error: { status: 'failed', error: new Error('Unknown error'), endedAt: Date.now() } };\n }\n\n /**\n * Use Inngest's sleep primitive for durability\n */\n async executeSleepDuration(duration: number, sleepId: string, workflowId: string): Promise<void> {\n await this.inngestStep.sleep(`workflow.${workflowId}.sleep.${sleepId}`, duration < 0 ? 0 : duration);\n }\n\n /**\n * Use Inngest's sleepUntil primitive for durability\n */\n async executeSleepUntilDate(date: Date, sleepUntilId: string, workflowId: string): Promise<void> {\n await this.inngestStep.sleepUntil(`workflow.${workflowId}.sleepUntil.${sleepUntilId}`, date);\n }\n\n /**\n * Wrap durable operations in Inngest step.run() for durability.\n *\n * IMPORTANT: Errors are wrapped with a cause structure before throwing.\n * This is necessary because Inngest's error serialization (serialize-error-cjs)\n * only captures standard Error properties (message, name, stack, code, cause).\n * Custom properties like statusCode, responseHeaders from AI SDK errors would\n * be lost. By putting our serialized error (via getErrorFromUnknown with toJSON())\n * in the cause property, we ensure custom properties survive serialization.\n * The cause property is in serialize-error-cjs's allowlist, and when the cause\n * object is finally JSON.stringify'd, our error's toJSON() is called.\n */\n async wrapDurableOperation<T>(operationId: string, operationFn: () => Promise<T>): Promise<T> {\n const result = await this.inngestStep.run(operationId, async () => {\n try {\n const fnResult = await operationFn();\n return fnResult;\n } catch (e) {\n const errorInstance = getErrorFromUnknown(e, {\n serializeStack: false,\n fallbackMessage: 'Unknown step execution error',\n });\n throw new Error(errorInstance.message, {\n cause: {\n status: 'failed',\n error: errorInstance,\n endedAt: Date.now(),\n },\n });\n }\n });\n return result as T;\n }\n\n /**\n * Provide Inngest step primitive in engine context\n */\n getEngineContext(): Record<string, any> {\n return { step: this.inngestStep };\n }\n\n /**\n * For Inngest, lifecycle callbacks are invoked in the workflow's finalize step\n * (wrapped in step.run for durability), not in execute(). Override to skip.\n */\n public async invokeLifecycleCallbacks(_result: {\n status: any;\n result?: any;\n error?: any;\n steps: Record<string, any>;\n tripwire?: any;\n runId: string;\n workflowId: string;\n resourceId?: string;\n input?: any;\n requestContext: RequestContext;\n state: Record<string, any>;\n }): Promise<void> {\n // No-op: Inngest handles callbacks in workflow.ts finalize step\n }\n\n /**\n * Actually invoke the lifecycle callbacks. Called from workflow.ts finalize step.\n */\n public async invokeLifecycleCallbacksInternal(result: {\n status: any;\n result?: any;\n error?: any;\n steps: Record<string, any>;\n tripwire?: any;\n runId: string;\n workflowId: string;\n resourceId?: string;\n input?: any;\n requestContext: RequestContext;\n state: Record<string, any>;\n }): Promise<void> {\n return super.invokeLifecycleCallbacks(result);\n }\n\n // =============================================================================\n // Durable Span Lifecycle Hooks\n // =============================================================================\n\n /**\n * Create a step span durably - on first execution, creates and exports span.\n * On replay, returns cached span data without re-creating.\n */\n async createStepSpan(params: {\n parentSpan: any;\n stepId: string;\n operationId: string;\n options: {\n name: string;\n type: any;\n input?: unknown;\n entityType?: string;\n entityId?: string;\n tracingPolicy?: any;\n };\n executionContext: ExecutionContext;\n }): Promise<any> {\n const { executionContext, operationId, options, parentSpan } = params;\n\n // Use the actual parent span's ID if provided (e.g., for steps inside control-flow),\n // otherwise fall back to workflow span\n const parentSpanId = parentSpan?.id ?? executionContext.tracingIds?.workflowSpanId;\n\n // Use wrapDurableOperation to memoize span creation\n const exportedSpan = await this.wrapDurableOperation(operationId, async () => {\n const observability = this.mastra?.observability?.getSelectedInstance({});\n if (!observability) return undefined;\n\n // Create span using tracingIds for traceId, and actual parent span for parentSpanId\n const span = observability.startSpan({\n ...options,\n entityType: options.entityType as EntityType | undefined,\n traceId: executionContext.tracingIds?.traceId,\n parentSpanId,\n });\n\n // Return serializable form\n return span?.exportSpan();\n });\n\n // Return a rebuilt span that can have .end()/.error() called later\n if (exportedSpan) {\n const observability = this.mastra?.observability?.getSelectedInstance({});\n return observability?.rebuildSpan(exportedSpan);\n }\n\n return undefined;\n }\n\n /**\n * End a step span durably.\n */\n async endStepSpan(params: {\n span: any;\n operationId: string;\n endOptions: {\n output?: unknown;\n attributes?: Record<string, unknown>;\n };\n }): Promise<void> {\n const { span, operationId, endOptions } = params;\n if (!span) return;\n\n await this.wrapDurableOperation(operationId, async () => {\n span.end(endOptions);\n });\n }\n\n /**\n * Record error on step span durably.\n */\n async errorStepSpan(params: {\n span: any;\n operationId: string;\n errorOptions: {\n error: Error;\n attributes?: Record<string, unknown>;\n };\n }): Promise<void> {\n const { span, operationId, errorOptions } = params;\n if (!span) return;\n\n await this.wrapDurableOperation(operationId, async () => {\n span.error(errorOptions);\n });\n }\n\n /**\n * Create a generic child span durably (for control-flow operations).\n * On first execution, creates and exports span. On replay, returns cached span data.\n */\n async createChildSpan(params: {\n parentSpan: any;\n operationId: string;\n options: {\n name: string;\n type: any;\n input?: unknown;\n attributes?: Record<string, unknown>;\n };\n executionContext: ExecutionContext;\n }): Promise<any> {\n const { executionContext, operationId, options, parentSpan } = params;\n\n // Use the actual parent span's ID if provided, otherwise fall back to workflow span\n const parentSpanId = parentSpan?.id ?? executionContext.tracingIds?.workflowSpanId;\n\n // Use wrapDurableOperation to memoize span creation\n const exportedSpan = await this.wrapDurableOperation(operationId, async () => {\n const observability = this.mastra?.observability?.getSelectedInstance({});\n if (!observability) return undefined;\n\n // Create span using tracingIds for traceId, and actual parent span for parentSpanId\n const span = observability.startSpan({\n ...options,\n traceId: executionContext.tracingIds?.traceId,\n parentSpanId,\n tracingPolicy: this.options?.tracingPolicy,\n });\n\n // Return serializable form\n return span?.exportSpan();\n });\n\n // Return a rebuilt span that can have .end()/.error() called later\n if (exportedSpan) {\n const observability = this.mastra?.observability?.getSelectedInstance({});\n return observability?.rebuildSpan(exportedSpan);\n }\n\n return undefined;\n }\n\n /**\n * End a generic child span durably (for control-flow operations).\n */\n async endChildSpan(params: {\n span: any;\n operationId: string;\n endOptions?: {\n output?: unknown;\n attributes?: Record<string, unknown>;\n };\n }): Promise<void> {\n const { span, operationId, endOptions } = params;\n if (!span) return;\n\n await this.wrapDurableOperation(operationId, async () => {\n span.end(endOptions);\n });\n }\n\n /**\n * Record error on a generic child span durably (for control-flow operations).\n */\n async errorChildSpan(params: {\n span: any;\n operationId: string;\n errorOptions: {\n error: Error;\n attributes?: Record<string, unknown>;\n };\n }): Promise<void> {\n const { span, operationId, errorOptions } = params;\n if (!span) return;\n\n await this.wrapDurableOperation(operationId, async () => {\n span.error(errorOptions);\n });\n }\n\n /**\n * Execute nested InngestWorkflow using inngestStep.invoke() for durability.\n * This MUST be called directly (not inside step.run()) due to Inngest constraints.\n */\n async executeWorkflowStep(params: {\n step: Step<string, any, any>;\n stepResults: Record<string, StepResult<any, any, any, any>>;\n executionContext: ExecutionContext;\n resume?: {\n steps: string[];\n resumePayload: any;\n runId?: string;\n };\n timeTravel?: TimeTravelExecutionParams;\n prevOutput: any;\n inputData: any;\n pubsub: PubSub;\n startedAt: number;\n perStep?: boolean;\n stepSpan?: any;\n }): Promise<StepResult<any, any, any, any> | null> {\n // Only handle InngestWorkflow instances\n if (!(params.step instanceof InngestWorkflow)) {\n return null;\n }\n\n const {\n step,\n stepResults,\n executionContext,\n resume,\n timeTravel,\n prevOutput,\n inputData,\n pubsub,\n startedAt,\n perStep,\n stepSpan,\n } = params;\n\n // Build trace context to propagate to nested workflow\n const nestedTracingContext = executionContext.tracingIds?.traceId\n ? {\n traceId: executionContext.tracingIds.traceId,\n parentSpanId: stepSpan?.id,\n }\n : undefined;\n\n const isResume = !!resume?.steps?.length;\n let result: WorkflowResult<any, any, any, any>;\n let runId: string;\n\n const isTimeTravel = !!(timeTravel && timeTravel.steps?.length > 1 && timeTravel.steps[0] === step.id);\n\n try {\n if (isResume) {\n runId = stepResults[resume?.steps?.[0] ?? '']?.suspendPayload?.__workflow_meta?.runId ?? randomUUID();\n const workflowsStore = await this.mastra?.getStorage()?.getStore('workflows');\n const snapshot: any = await workflowsStore?.loadWorkflowSnapshot({\n workflowName: step.id,\n runId: runId,\n });\n\n const invokeResp = (await this.inngestStep.invoke(`workflow.${executionContext.workflowId}.step.${step.id}`, {\n function: step.getFunction(),\n data: {\n inputData,\n initialState: executionContext.state ?? snapshot?.value ?? {},\n runId: runId,\n resume: {\n runId: runId,\n steps: resume.steps.slice(1),\n stepResults: snapshot?.context as any,\n resumePayload: resume.resumePayload,\n resumePath: resume.steps?.[1] ? (snapshot?.suspendedPaths?.[resume.steps?.[1]] as any) : undefined,\n },\n outputOptions: { includeState: true },\n perStep,\n tracingOptions: nestedTracingContext,\n },\n })) as any;\n result = invokeResp.result;\n runId = invokeResp.runId;\n executionContext.state = invokeResp.result.state;\n } else if (isTimeTravel) {\n const workflowsStoreForTimeTravel = await this.mastra?.getStorage()?.getStore('workflows');\n const snapshot: any = (await workflowsStoreForTimeTravel?.loadWorkflowSnapshot({\n workflowName: step.id,\n runId: executionContext.runId,\n })) ?? { context: {} };\n const timeTravelParams = createTimeTravelExecutionParams({\n steps: timeTravel.steps.slice(1),\n inputData: timeTravel.inputData,\n resumeData: timeTravel.resumeData,\n context: (timeTravel.nestedStepResults?.[step.id] ?? {}) as any,\n nestedStepsContext: (timeTravel.nestedStepResults ?? {}) as any,\n snapshot,\n graph: step.buildExecutionGraph(),\n });\n const invokeResp = (await this.inngestStep.invoke(`workflow.${executionContext.workflowId}.step.${step.id}`, {\n function: step.getFunction(),\n data: {\n timeTravel: timeTravelParams,\n initialState: executionContext.state ?? {},\n runId: executionContext.runId,\n outputOptions: { includeState: true },\n perStep,\n tracingOptions: nestedTracingContext,\n },\n })) as any;\n result = invokeResp.result;\n runId = invokeResp.runId;\n executionContext.state = invokeResp.result.state;\n } else {\n const invokeResp = (await this.inngestStep.invoke(`workflow.${executionContext.workflowId}.step.${step.id}`, {\n function: step.getFunction(),\n data: {\n inputData,\n initialState: executionContext.state ?? {},\n outputOptions: { includeState: true },\n perStep,\n tracingOptions: nestedTracingContext,\n },\n })) as any;\n result = invokeResp.result;\n runId = invokeResp.runId;\n executionContext.state = invokeResp.result.state;\n }\n } catch (e) {\n // Nested workflow threw an error (likely from finalization step)\n // The error cause should contain the workflow result with runId\n const errorCause = (e as any)?.cause;\n\n // Try to extract runId from error cause or generate new one\n if (errorCause && typeof errorCause === 'object') {\n result = errorCause as WorkflowResult<any, any, any, any>;\n // The runId might be in the result's steps metadata\n runId = errorCause.runId || randomUUID();\n } else {\n // Fallback: if we can't get the result from error, construct a basic failed result\n runId = randomUUID();\n result = {\n status: 'failed',\n error: e instanceof Error ? e : new Error(String(e)),\n steps: {},\n input: inputData,\n } as WorkflowResult<any, any, any, any>;\n }\n }\n\n const res = await this.inngestStep.run(\n `workflow.${executionContext.workflowId}.step.${step.id}.nestedwf-results`,\n async () => {\n if (result.status === 'failed') {\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-result',\n payload: {\n id: step.id,\n status: 'failed',\n error: result?.error,\n payload: prevOutput,\n },\n },\n });\n\n return { executionContext, result: { status: 'failed', error: result?.error, endedAt: Date.now() } };\n } else if (result.status === 'suspended') {\n const suspendedSteps = Object.entries(result.steps).filter(([_stepName, stepResult]) => {\n const stepRes: StepResult<any, any, any, any> = stepResult as StepResult<any, any, any, any>;\n return stepRes?.status === 'suspended';\n });\n\n for (const [stepName, stepResult] of suspendedSteps) {\n const suspendPath: string[] = [stepName, ...(stepResult?.suspendPayload?.__workflow_meta?.path ?? [])];\n executionContext.suspendedPaths[step.id] = executionContext.executionPath;\n\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-suspended',\n payload: {\n id: step.id,\n status: 'suspended',\n },\n },\n });\n\n return {\n executionContext,\n result: {\n status: 'suspended',\n suspendedAt: Date.now(),\n payload: stepResult.payload,\n suspendPayload: {\n ...(stepResult as any)?.suspendPayload,\n __workflow_meta: { runId: runId, path: suspendPath },\n },\n },\n };\n }\n\n return {\n executionContext,\n result: {\n status: 'suspended',\n suspendedAt: Date.now(),\n payload: {},\n },\n };\n } else if (result.status === 'tripwire') {\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-result',\n payload: {\n id: step.id,\n status: 'tripwire',\n error: result?.tripwire?.reason,\n payload: prevOutput,\n },\n },\n });\n\n return {\n executionContext,\n result: {\n status: 'tripwire',\n tripwire: result?.tripwire,\n endedAt: Date.now(),\n },\n };\n } else if (perStep || result.status === 'paused') {\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-result',\n payload: {\n id: step.id,\n status: 'paused',\n },\n },\n });\n\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-finish',\n payload: {\n id: step.id,\n metadata: {},\n },\n },\n });\n return { executionContext, result: { status: 'paused' } };\n }\n\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-result',\n payload: {\n id: step.id,\n status: 'success',\n output: result?.result,\n },\n },\n });\n\n await pubsub.publish(`workflow.events.v2.${executionContext.runId}`, {\n type: 'watch',\n runId: executionContext.runId,\n data: {\n type: 'workflow-step-finish',\n payload: {\n id: step.id,\n metadata: {},\n },\n },\n });\n\n return { executionContext, result: { status: 'success', output: result?.result, endedAt: Date.now() } };\n },\n );\n\n Object.assign(executionContext, res.executionContext);\n return {\n ...res.result,\n startedAt,\n payload: inputData,\n resumedAt: resume?.steps[0] === step.id ? startedAt : undefined,\n resumePayload: resume?.steps[0] === step.id ? resume?.resumePayload : undefined,\n } as StepResult<any, any, any, any>;\n }\n}\n","import { PubSub } from '@mastra/core/events';\nimport type { Event } from '@mastra/core/events';\nimport type { Inngest } from 'inngest';\nimport { subscribe } from 'inngest/realtime';\n\n/**\n * Build a TopicRef compatible with Inngest SDK v4's `inngest.realtime.publish()`.\n * The runtime only requires `channel` and `topic`; `config.schema` is optional and\n * we leave it absent so no validation runs.\n */\nfunction buildTopicRef(channel: string, topic: string) {\n return { channel, topic, config: {} as any };\n}\n\n/**\n * Parse a topic string and extract the runId and topic type.\n *\n * Supported formats:\n * - \"workflow.events.v2.{runId}\" - workflow events\n * - \"agent.stream.{runId}\" - agent stream events\n *\n * @returns { runId, topicType } or null if not a recognized format\n */\nfunction parseTopic(topic: string): { runId: string; topicType: 'workflow' | 'agent' } | null {\n // Try workflow format first\n const workflowMatch = topic.match(/^workflow\\.events\\.v2\\.(.+)$/);\n if (workflowMatch && workflowMatch[1]) {\n return { runId: workflowMatch[1], topicType: 'workflow' };\n }\n\n // Try agent stream format\n const agentMatch = topic.match(/^agent\\.stream\\.(.+)$/);\n if (agentMatch && agentMatch[1]) {\n return { runId: agentMatch[1], topicType: 'agent' };\n }\n\n return null;\n}\n\n/**\n * PubSub implementation for Inngest workflows.\n *\n * This bridges the PubSub abstract class interface with Inngest's realtime system:\n * - publish() uses `inngest.realtime.publish()` (Inngest SDK v4 client API).\n * This is non-durable: it executes immediately and is not memoized as a step.\n * When called inside an Inngest function it auto-includes the current runId.\n * - subscribe() uses `inngest/realtime` subscribe for real-time streaming.\n *\n * Supported topic formats:\n * - \"workflow.events.v2.{runId}\" - workflow events\n * -> Inngest channel: \"workflow:{workflowId}:{runId}\", topic: \"watch\"\n * - \"agent.stream.{runId}\" - agent stream events (for InngestAgent)\n * -> Inngest channel: \"agent:{runId}\", topic: \"agent-stream\"\n */\nexport class InngestPubSub extends PubSub {\n private inngest: Inngest;\n private workflowId: string;\n private subscriptions: Map<\n string,\n {\n unsubscribe: () => void;\n callbacks: Set<(event: Event, ack?: () => Promise<void>) => void>;\n }\n > = new Map();\n\n constructor(inngest: Inngest, workflowId: string) {\n super();\n this.inngest = inngest;\n this.workflowId = workflowId;\n }\n\n /**\n * Publish an event to Inngest's realtime system.\n *\n * Supported topic formats:\n * - \"workflow.events.v2.{runId}\" - workflow events\n * -> channel: \"workflow:{workflowId}:{runId}\", topic: \"watch\"\n * - \"agent.stream.{runId}\" - agent stream events\n * -> channel: \"agent:{runId}\", topic: \"agent-stream\"\n * (Note: agent stream uses runId-only channel so nested workflows can publish to same channel)\n */\n async publish(topic: string, event: Omit<Event, 'id' | 'createdAt'>): Promise<void> {\n const parsed = parseTopic(topic);\n if (!parsed) {\n return; // Ignore unrecognized topic formats\n }\n\n const { runId, topicType } = parsed;\n\n // Use different Inngest topics and channels for different event types\n // Agent stream events use a runId-only channel so nested workflows publish to the same channel\n const inngestTopic = topicType === 'agent' ? 'agent-stream' : 'watch';\n const channel = topicType === 'agent' ? `agent:${runId}` : `workflow:${this.workflowId}:${runId}`;\n\n try {\n // For agent stream events, send the full event structure so subscribers can access type/runId/data\n // For workflow events, send just the data (existing behavior)\n const dataToSend = topicType === 'agent' ? event : event.data;\n await this.inngest.realtime.publish(buildTopicRef(channel, inngestTopic), dataToSend);\n } catch (err: any) {\n // For agent stream terminal events, rethrow — losing a finish/error event\n // causes the client stream to hang indefinitely\n if (topicType === 'agent' && (event.type === 'finish' || event.type === 'error')) {\n throw err;\n }\n // Non-terminal events: log but don't throw\n console.error('InngestPubSub publish error:', err?.message ?? err);\n }\n }\n\n /**\n * Subscribe to events from Inngest's realtime system.\n *\n * Supported topic formats:\n * - \"workflow.events.v2.{runId}\" - workflow events\n * -> channel: \"workflow:{workflowId}:{runId}\", topic: \"watch\"\n * - \"agent.stream.{runId}\" - agent stream events\n * -> channel: \"agent:{runId}\", topic: \"agent-stream\"\n * (Note: agent stream uses runId-only channel so nested workflows can publish to same channel)\n */\n async subscribe(topic: string, cb: (event: Event, ack?: () => Promise<void>) => void): Promise<void> {\n const parsed = parseTopic(topic);\n if (!parsed) {\n return; // Ignore unrecognized topic formats\n }\n\n const { runId, topicType } = parsed;\n\n // Check if we already have a subscription for this topic\n if (this.subscriptions.has(topic)) {\n this.subscriptions.get(topic)!.callbacks.add(cb);\n return;\n }\n\n const callbacks = new Set<(event: Event, ack?: () => Promise<void>) => void>([cb]);\n\n // Use different Inngest topics and channels for different event types\n // Agent stream events use a runId-only channel so nested workflows publish to the same channel\n const inngestTopic = topicType === 'agent' ? 'agent-stream' : 'watch';\n const channel = topicType === 'agent' ? `agent:${runId}` : `workflow:${this.workflowId}:${runId}`;\n\n // Await the subscribe call to ensure the WebSocket connection is established\n // before we consider the subscription \"ready\". This prevents race conditions\n // where the workflow triggers before the subscription can receive events.\n const stream = await subscribe(\n {\n channel,\n topics: [inngestTopic],\n app: this.inngest,\n },\n (message: any) => {\n // For agent stream events, message.data is the full AgentStreamEvent structure (type, runId, data)\n // For workflow events, wrap message.data in a PubSub Event format\n // IMPORTANT: Always generate a unique `id` and `createdAt` for every event.\n // CachingPubSub deduplicates events by `id` — without a unique id, all events\n // after the first would be filtered out (since undefined === undefined in the seen set).\n let event: Event;\n if (topicType === 'agent' && message.data?.type && message.data?.runId) {\n // Agent stream event - spread the AgentStreamEvent data and add required Event fields\n event = {\n id: crypto.randomUUID(),\n createdAt: new Date(),\n ...message.data,\n } as unknown as Event;\n } else {\n // Workflow event or fallback - wrap in standard Event format\n event = {\n id: crypto.randomUUID(),\n type: inngestTopic,\n runId,\n data: message.data,\n createdAt: new Date(),\n };\n }\n\n for (const callback of callbacks) {\n callback(event);\n }\n },\n );\n\n this.subscriptions.set(topic, {\n unsubscribe: () => {\n try {\n void stream.cancel();\n } catch (err) {\n console.error('InngestPubSub unsubscribe error:', err);\n }\n },\n callbacks,\n });\n }\n\n /**\n * Unsubscribe a callback from a topic.\n * If no callbacks remain, the underlying Inngest subscription is cancelled.\n */\n async unsubscribe(topic: string, cb: (event: Event, ack?: () => Promise<void>) => void): Promise<void> {\n const sub = this.subscriptions.get(topic);\n if (!sub) {\n return;\n }\n\n sub.callbacks.delete(cb);\n\n // If no more callbacks, cancel the subscription\n if (sub.callbacks.size === 0) {\n sub.unsubscribe();\n this.subscriptions.delete(topic);\n }\n }\n\n /**\n * Flush any pending operations. No-op for Inngest.\n */\n async flush(): Promise<void> {\n // No-op for Inngest\n }\n\n /**\n * Clean up all subscriptions during graceful shutdown.\n */\n async close(): Promise<void> {\n for (const [, sub] of this.subscriptions) {\n sub.unsubscribe();\n }\n this.subscriptions.clear();\n }\n}\n","import { ReadableStream } from 'node:stream/web';\nimport { getErrorFromUnknown } from '@mastra/core/error';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { TracingContext, TracingOptions } from '@mastra/core/observability';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { WorkflowRunOutput, ChunkFrom } from '@mastra/core/stream';\nimport { createTimeTravelExecutionParams, Run, hydrateSerializedStepErrors } from '@mastra/core/workflows';\nimport type {\n ExecutionEngine,\n ExecutionGraph,\n OutputWriter,\n SerializedStepFlowEntry,\n Step,\n StepWithComponent,\n StreamEvent,\n TimeTravelContext,\n WorkflowEngineType,\n WorkflowResult,\n WorkflowStreamEvent,\n} from '@mastra/core/workflows';\nimport { NonRetriableError } from 'inngest';\nimport type { Inngest } from 'inngest';\nimport { subscribe } from 'inngest/realtime';\nimport type { InngestEngineType } from './types';\n\nexport class InngestRun<\n TEngineType = InngestEngineType,\n TSteps extends Step<string, any, any, any, any, any, TEngineType>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TEngineType\n >[],\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n> extends Run<TEngineType, TSteps, TState, TInput, TOutput> {\n private inngest: Inngest;\n serializedStepGraph: SerializedStepFlowEntry[];\n #mastra: Mastra;\n\n constructor(\n params: {\n workflowId: string;\n runId: string;\n resourceId?: string;\n executionEngine: ExecutionEngine;\n executionGraph: ExecutionGraph;\n serializedStepGraph: SerializedStepFlowEntry[];\n mastra?: Mastra;\n retryConfig?: {\n attempts?: number;\n delay?: number;\n };\n cleanup?: () => void;\n workflowSteps: Record<string, StepWithComponent>;\n workflowEngineType: WorkflowEngineType;\n validateInputs?: boolean;\n },\n inngest: Inngest,\n ) {\n super(params);\n this.inngest = inngest;\n this.serializedStepGraph = params.serializedStepGraph;\n this.#mastra = params.mastra!;\n }\n\n /**\n * Get run output using hybrid approach: realtime subscription + polling fallback.\n * Resolves as soon as either method detects completion.\n */\n async getRunOutput(_eventId: string, maxWaitMs = 300000) {\n const storage = this.#mastra?.getStorage();\n const workflowsStore = await storage?.getStore('workflows');\n if (!workflowsStore) {\n throw new NonRetriableError(`Workflow storage is required to retrieve output for run ${this.runId}`);\n }\n return new Promise<any>((resolve, reject) => {\n let resolved = false;\n let unsubscribe: (() => void) | null = null;\n let pollTimeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch {\n // Ignore unsubscribe errors\n }\n }\n if (pollTimeoutId) {\n clearTimeout(pollTimeoutId);\n }\n };\n\n const handleResult = (result: any, _source: string) => {\n if (!resolved) {\n resolved = true;\n cleanup();\n resolve(result);\n }\n };\n\n const handleError = (error: any, _source: string) => {\n if (!resolved) {\n resolved = true;\n cleanup();\n reject(error);\n }\n };\n\n // Start realtime subscription for workflow-finish event\n let realtimeStreamPromise: ReturnType<typeof subscribe> | null = null;\n\n const startRealtimeSubscription = async () => {\n try {\n realtimeStreamPromise = subscribe(\n {\n channel: `workflow:${this.workflowId}:${this.runId}`,\n topics: ['watch'],\n app: this.inngest,\n },\n async (message: any) => {\n if (resolved) return;\n\n const event = message.data;\n\n if (event?.type === 'workflow-finish') {\n // Got the finish event - load snapshot and resolve\n const snapshot = await workflowsStore?.loadWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n });\n if (snapshot?.context) {\n snapshot.context = hydrateSerializedStepErrors(snapshot.context);\n }\n\n const realtimeResult: Record<string, unknown> = {\n steps: snapshot?.context,\n status: event.payload?.status ?? snapshot?.status,\n input: (snapshot?.context as Record<string, unknown>)?.input,\n };\n const resultValue = event.payload?.result ?? snapshot?.result;\n if (resultValue !== undefined) realtimeResult.result = resultValue;\n const rawError = event.payload?.error ?? snapshot?.error;\n if (rawError) {\n realtimeResult.error = getErrorFromUnknown(rawError, { serializeStack: false });\n }\n if (snapshot?.value !== undefined) realtimeResult.state = snapshot.value;\n const result = { output: { result: realtimeResult } };\n\n handleResult(result, 'realtime');\n }\n },\n );\n\n // Set unsubscribe immediately so cleanup can cancel even before await resolves\n unsubscribe = () => {\n realtimeStreamPromise?.then(stream => stream.cancel().catch(() => {})).catch(() => {});\n };\n\n await realtimeStreamPromise;\n } catch {\n // Realtime subscription failed - polling will still work as fallback\n }\n };\n\n // Start polling by checking our own workflow snapshot store directly.\n // This avoids the Inngest runs API which has a 15-second response cache.\n const startPolling = async () => {\n const startTime = Date.now();\n\n const poll = async () => {\n if (resolved) {\n return;\n }\n if (Date.now() - startTime >= maxWaitMs) {\n handleError(new NonRetriableError(`Workflow did not complete within ${maxWaitMs}ms`), 'polling-timeout');\n return;\n }\n\n try {\n const snapshot = await workflowsStore.loadWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n });\n\n // Still running or in an intermediate state — schedule next poll\n // 'running' = initial state, 'waiting' = sleeping/waiting, 'pending' = not yet started\n if (\n !snapshot ||\n snapshot.status === 'running' ||\n snapshot.status === 'waiting' ||\n snapshot.status === 'pending'\n ) {\n pollTimeoutId = setTimeout(poll, 150 + Math.random() * 100);\n return;\n }\n\n if (snapshot.context) {\n snapshot.context = hydrateSerializedStepErrors(snapshot.context);\n }\n\n const pollingResult: Record<string, unknown> = {\n steps: snapshot.context,\n status: snapshot.status,\n input: (snapshot.context as Record<string, unknown>)?.input,\n };\n if (snapshot.result !== undefined) pollingResult.result = snapshot.result;\n if (snapshot.error !== undefined) {\n pollingResult.error = getErrorFromUnknown(snapshot.error, { serializeStack: false });\n }\n if (snapshot.value !== undefined) pollingResult.state = snapshot.value;\n\n handleResult({ output: { result: pollingResult } }, `polling-${snapshot.status}`);\n } catch (error) {\n if (error instanceof NonRetriableError) {\n handleError(error, 'polling-non-retriable');\n return;\n }\n handleError(\n new NonRetriableError(\n `Failed to poll workflow status: ${error instanceof Error ? error.message : String(error)}`,\n ),\n 'polling-error',\n );\n }\n };\n\n // Start first poll\n void poll();\n };\n\n // Start both in parallel\n void startRealtimeSubscription();\n void startPolling();\n });\n }\n\n async cancel() {\n const storage = this.#mastra?.getStorage();\n\n await this.inngest.send({\n name: `cancel.workflow.${this.workflowId}`,\n data: {\n runId: this.runId,\n },\n });\n\n const workflowsStore = await storage?.getStore('workflows');\n const snapshot = await workflowsStore?.loadWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n });\n if (snapshot) {\n await workflowsStore?.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: {\n ...snapshot,\n status: 'canceled' as any,\n value: snapshot.value,\n },\n });\n }\n }\n\n async start(\n args: (TInput extends unknown\n ? {\n inputData?: TInput;\n }\n : {\n inputData: TInput;\n }) &\n (TState extends unknown\n ? {\n initialState?: TState;\n }\n : {\n initialState: TState;\n }) & {\n requestContext?: RequestContext;\n outputWriter?: OutputWriter;\n tracingContext?: TracingContext;\n tracingOptions?: TracingOptions;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n perStep?: boolean;\n },\n ): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n return this._start(args);\n }\n\n /**\n * Starts the workflow execution without waiting for completion (fire-and-forget).\n * Returns immediately with the runId after sending the event to Inngest.\n * The workflow executes independently in Inngest.\n * Use this when you don't need to wait for the result or want to avoid polling failures.\n */\n async startAsync(\n args: (TInput extends unknown\n ? {\n inputData?: TInput;\n }\n : {\n inputData: TInput;\n }) &\n (TState extends unknown\n ? {\n initialState?: TState;\n }\n : {\n initialState: TState;\n }) & {\n requestContext?: RequestContext;\n tracingOptions?: TracingOptions;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n perStep?: boolean;\n },\n ): Promise<{ runId: string }> {\n // Persist initial snapshot\n const workflowsStore = await this.#mastra.getStorage()?.getStore('workflows');\n await workflowsStore?.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: {\n runId: this.runId,\n serializedStepGraph: this.serializedStepGraph,\n status: 'running',\n value: {},\n context: {} as any,\n activePaths: [],\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n waitingPaths: {},\n timestamp: Date.now(),\n },\n });\n\n // Validate inputs\n const inputDataToUse = await this._validateInput(args.inputData);\n const initialStateToUse = await this._validateInitialState(args.initialState ?? ({} as TState));\n\n // Send event to Inngest (fire-and-forget)\n const eventOutput = await this.inngest.send({\n name: `workflow.${this.workflowId}`,\n data: {\n inputData: inputDataToUse,\n initialState: initialStateToUse,\n runId: this.runId,\n resourceId: this.resourceId,\n outputOptions: args.outputOptions,\n tracingOptions: args.tracingOptions,\n requestContext: args.requestContext ? Object.fromEntries(args.requestContext.entries()) : {},\n perStep: args.perStep,\n },\n });\n\n const eventId = eventOutput.ids[0];\n if (!eventId) {\n throw new Error('Event ID is not set');\n }\n\n // Return immediately - NO POLLING\n return { runId: this.runId };\n }\n\n async _start({\n inputData,\n initialState,\n outputOptions,\n tracingOptions,\n format,\n requestContext,\n perStep,\n }: {\n inputData?: TInput;\n requestContext?: RequestContext;\n initialState?: TState;\n tracingOptions?: TracingOptions;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n format?: 'legacy' | 'vnext' | undefined;\n perStep?: boolean;\n }): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n const workflowsStore = await this.#mastra.getStorage()?.getStore('workflows');\n await workflowsStore?.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: {\n runId: this.runId,\n serializedStepGraph: this.serializedStepGraph,\n status: 'running',\n value: {},\n context: {} as any,\n activePaths: [],\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n waitingPaths: {},\n timestamp: Date.now(),\n },\n });\n\n const inputDataToUse = await this._validateInput(inputData);\n const initialStateToUse = await this._validateInitialState(initialState ?? ({} as TState));\n\n const eventName = `workflow.${this.workflowId}`;\n\n const eventOutput = await this.inngest.send({\n name: eventName,\n data: {\n inputData: inputDataToUse,\n initialState: initialStateToUse,\n runId: this.runId,\n resourceId: this.resourceId,\n outputOptions,\n tracingOptions,\n format,\n requestContext: requestContext ? Object.fromEntries(requestContext.entries()) : {},\n perStep,\n },\n });\n\n const eventId = eventOutput.ids[0];\n if (!eventId) {\n throw new Error('Event ID is not set');\n }\n\n const runOutput = await this.getRunOutput(eventId);\n const result = runOutput?.output?.result;\n\n this.hydrateFailedResult(result);\n\n // Only include state when explicitly requested, matching core engine behavior\n if (!outputOptions?.includeState) {\n delete result.state;\n }\n\n if (result.status !== 'suspended') {\n this.cleanup?.();\n }\n return result;\n }\n\n async resume<TResume>(params: {\n resumeData?: TResume;\n step?:\n | Step<string, any, any, TResume, any>\n | [...Step<string, any, any, any, any>[], Step<string, any, any, TResume, any>]\n | string\n | string[];\n label?: string;\n requestContext?: RequestContext;\n perStep?: boolean;\n }): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n const p = this._resume(params).then(result => {\n if (result.status !== 'suspended') {\n this.closeStreamAction?.().catch(() => {});\n }\n\n return result;\n });\n\n this.executionResults = p;\n return p;\n }\n\n /**\n * Performs all resume preparation and dispatches the resume event to Inngest,\n * but does NOT wait for the workflow result. Shared by `_resume()` (which polls\n * for the result afterwards) and `resumeAsync()` (which returns immediately).\n *\n * Send-time failures (invalid resume data, event send failure) reject synchronously,\n * and the snapshot is rolled back to its prior state on send failure.\n */\n async _resumeAndSendEvent<TResume>(params: {\n resumeData?: TResume;\n step?:\n | Step<string, any, any, TResume, any>\n | [...Step<string, any, any, any, any>[], Step<string, any, any, TResume, any>]\n | string\n | string[];\n label?: string;\n requestContext?: RequestContext;\n perStep?: boolean;\n }): Promise<{ eventId: string }> {\n const storage = this.#mastra?.getStorage();\n\n const workflowsStore = await storage?.getStore('workflows');\n if (!workflowsStore) {\n throw new NonRetriableError(`Workflow storage is required to resume run ${this.runId}`);\n }\n const snapshot = await workflowsStore.loadWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n });\n if (!snapshot) {\n throw new NonRetriableError(`Cannot resume run ${this.runId}: snapshot not found`);\n }\n\n // Support label-based resume: look up step from resumeLabels\n const snapshotResumeLabel = params.label ? snapshot.resumeLabels?.[params.label] : undefined;\n const stepParam = snapshotResumeLabel?.stepId ?? params.step;\n\n let steps: string[] = [];\n if (stepParam) {\n if (typeof stepParam === 'string') {\n steps = stepParam.split('.');\n } else {\n steps = (Array.isArray(stepParam) ? stepParam : [stepParam]).map(step =>\n typeof step === 'string' ? step : step?.id,\n );\n }\n }\n\n const suspendedStep = this.workflowSteps[steps?.[0] ?? ''];\n\n const resumeDataToUse = await this._validateResumeData(params.resumeData, suspendedStep);\n\n // Merge persisted requestContext from snapshot with any new values from params\n const persistedRequestContext = (snapshot as any)?.requestContext ?? {};\n const newRequestContext = params.requestContext ? Object.fromEntries(params.requestContext.entries()) : {};\n const mergedRequestContext = { ...persistedRequestContext, ...newRequestContext };\n\n // Mark the snapshot as 'running' before sending the event so that\n // snapshot-based polling doesn't return the stale suspended/paused result.\n await workflowsStore.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: {\n ...snapshot,\n status: 'running',\n result: undefined,\n error: undefined,\n timestamp: Date.now(),\n } as any,\n });\n\n let eventOutput;\n try {\n eventOutput = await this.inngest.send({\n name: `workflow.${this.workflowId}`,\n data: {\n inputData: resumeDataToUse,\n initialState: snapshot?.value ?? {},\n runId: this.runId,\n workflowId: this.workflowId,\n stepResults: snapshot?.context as any,\n resume: {\n steps,\n stepResults: snapshot?.context as any,\n resumePayload: resumeDataToUse,\n resumePath: steps?.[0] ? (snapshot?.suspendedPaths?.[steps?.[0]] as any) : undefined,\n },\n requestContext: mergedRequestContext,\n perStep: params.perStep,\n },\n });\n } catch (err) {\n // Rollback: restore the original snapshot so the run isn't stuck in 'running'.\n // The rollback itself can fail (e.g. transient storage error); log it but\n // always rethrow the original error so the underlying failure isn't masked.\n try {\n await workflowsStore.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: snapshot as any,\n });\n } catch (rollbackErr) {\n console.error('Failed to rollback snapshot during resume error recovery:', rollbackErr);\n }\n throw err;\n }\n\n const eventId = eventOutput.ids[0];\n if (!eventId) {\n throw new Error('Event ID is not set');\n }\n\n return { eventId };\n }\n\n async _resume<TResume>(params: {\n resumeData?: TResume;\n step?:\n | Step<string, any, any, TResume, any>\n | [...Step<string, any, any, any, any>[], Step<string, any, any, TResume, any>]\n | string\n | string[];\n label?: string;\n requestContext?: RequestContext;\n perStep?: boolean;\n }): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n const { eventId } = await this._resumeAndSendEvent(params);\n const runOutput = await this.getRunOutput(eventId);\n const result = runOutput?.output?.result;\n this.hydrateFailedResult(result);\n return result;\n }\n\n /**\n * Resumes a suspended workflow without waiting for completion (fire-and-forget).\n * Returns immediately with the runId after sending the resume event to Inngest.\n * The workflow continues executing independently in Inngest.\n *\n * Mirrors `startAsync()`: send-time failures (invalid resume data, event send\n * failure) still reject synchronously and roll back the snapshot, but the result\n * is never polled via `getRunOutput()`. This avoids the polling-based 404 race when\n * you don't need the resolved result inline.\n *\n * NOTE: this is exposed over HTTP / the client SDK as `resume-no-wait` / `resumeNoWait()`,\n * not `resumeAsync`, because the existing `resumeAsync()` client/server surface awaits the\n * full workflow result. TODO(v2): consolidate so `resumeAsync` consistently means\n * fire-and-forget across core, client SDK and HTTP routes (breaking change deferred to v2).\n */\n async resumeAsync<TResume>(params: {\n resumeData?: TResume;\n step?:\n | Step<string, any, any, TResume, any>\n | [...Step<string, any, any, any, any>[], Step<string, any, any, TResume, any>]\n | string\n | string[];\n label?: string;\n requestContext?: RequestContext;\n perStep?: boolean;\n }): Promise<{ runId: string }> {\n await this._resumeAndSendEvent(params);\n // Return immediately - NO POLLING\n return { runId: this.runId };\n }\n\n async timeTravel<TInput>(params: {\n inputData?: TInput;\n resumeData?: any;\n initialState?: TState;\n step:\n | Step<string, any, TInput, any, any>\n | [...Step<string, any, any, any, any>[], Step<string, any, TInput, any, any>]\n | string\n | string[];\n context?: TimeTravelContext<any, any, any, any>;\n nestedStepsContext?: Record<string, TimeTravelContext<any, any, any, any>>;\n requestContext?: RequestContext;\n tracingOptions?: TracingOptions;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n perStep?: boolean;\n }): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n const p = this._timeTravel(params).then(result => {\n if (result.status !== 'suspended') {\n this.closeStreamAction?.().catch(() => {});\n }\n\n return result;\n });\n\n this.executionResults = p;\n return p;\n }\n\n async _timeTravel<TInput>(params: {\n inputData?: TInput;\n resumeData?: any;\n initialState?: TState;\n step:\n | Step<string, any, TInput, any, any>\n | [...Step<string, any, any, any, any>[], Step<string, any, TInput, any, any>]\n | string\n | string[];\n context?: TimeTravelContext<any, any, any, any>;\n nestedStepsContext?: Record<string, TimeTravelContext<any, any, any, any>>;\n requestContext?: RequestContext;\n tracingOptions?: TracingOptions;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n perStep?: boolean;\n }) {\n if (!params.step || (Array.isArray(params.step) && params.step?.length === 0)) {\n throw new Error('Step is required and must be a valid step or array of steps');\n }\n\n let steps: string[] = [];\n if (typeof params.step === 'string') {\n steps = params.step.split('.');\n } else {\n steps = (Array.isArray(params.step) ? params.step : [params.step]).map(step =>\n typeof step === 'string' ? step : step?.id,\n );\n }\n\n if (steps.length === 0) {\n throw new Error('No steps provided to timeTravel');\n }\n\n const storage = this.#mastra?.getStorage();\n const workflowsStore = await storage?.getStore('workflows');\n if (!workflowsStore) {\n throw new NonRetriableError(`Workflow storage is required to time-travel run ${this.runId}`);\n }\n\n const snapshot = await workflowsStore.loadWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n });\n\n let snapshotForRollback = snapshot;\n if (!snapshot) {\n const pendingSnapshot = {\n runId: this.runId,\n serializedStepGraph: this.serializedStepGraph,\n status: 'pending' as const,\n value: {},\n context: {} as any,\n activePaths: [] as number[],\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n waitingPaths: {},\n timestamp: Date.now(),\n };\n await workflowsStore.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: pendingSnapshot,\n });\n snapshotForRollback = pendingSnapshot;\n }\n\n if (snapshot?.status === 'running') {\n throw new Error('This workflow run is still running, cannot time travel');\n }\n\n let inputDataToUse = params.inputData;\n\n if (inputDataToUse && steps.length === 1) {\n inputDataToUse = await this._validateTimetravelInputData(params.inputData, this.workflowSteps[steps[0]!]!);\n }\n\n const timeTravelData = createTimeTravelExecutionParams({\n steps,\n inputData: inputDataToUse,\n resumeData: params.resumeData,\n context: params.context,\n nestedStepsContext: params.nestedStepsContext,\n snapshot: (snapshot ?? { context: {} }) as any,\n graph: this.executionGraph,\n initialState: params.initialState,\n perStep: params.perStep,\n });\n\n // Save previous snapshot for rollback if send fails\n const previousSnapshot = snapshotForRollback;\n\n // Mark the snapshot as 'running' before sending the event so that\n // snapshot-based polling doesn't return the stale result from a previous run.\n await workflowsStore.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: {\n runId: this.runId,\n serializedStepGraph: this.serializedStepGraph,\n status: 'running',\n value: {},\n context: {} as any,\n activePaths: [],\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n waitingPaths: {},\n timestamp: Date.now(),\n },\n });\n\n let eventOutput;\n try {\n eventOutput = await this.inngest.send({\n name: `workflow.${this.workflowId}`,\n data: {\n initialState: timeTravelData.state,\n runId: this.runId,\n workflowId: this.workflowId,\n stepResults: timeTravelData.stepResults,\n timeTravel: timeTravelData,\n tracingOptions: params.tracingOptions,\n outputOptions: params.outputOptions,\n requestContext: params.requestContext ? Object.fromEntries(params.requestContext.entries()) : {},\n perStep: params.perStep,\n },\n });\n } catch (err) {\n // Rollback: restore the previous snapshot so the run isn't stuck in 'running'.\n // The rollback itself can fail (e.g. transient storage error); log it but\n // always rethrow the original error so the underlying failure isn't masked.\n if (previousSnapshot) {\n try {\n await workflowsStore.persistWorkflowSnapshot({\n workflowName: this.workflowId,\n runId: this.runId,\n resourceId: this.resourceId,\n snapshot: previousSnapshot as any,\n });\n } catch (rollbackErr) {\n console.error('Failed to rollback snapshot during time-travel error recovery:', rollbackErr);\n }\n }\n throw err;\n }\n\n const eventId = eventOutput.ids[0];\n if (!eventId) {\n throw new Error('Event ID is not set');\n }\n const runOutput = await this.getRunOutput(eventId);\n const result = runOutput?.output?.result;\n this.hydrateFailedResult(result);\n\n // Only include state when explicitly requested, matching core engine behavior\n if (!params.outputOptions?.includeState) {\n delete result.state;\n }\n\n return result;\n }\n\n watch(cb: (event: WorkflowStreamEvent) => void): () => void {\n let active = true;\n const streamPromise = subscribe(\n {\n channel: `workflow:${this.workflowId}:${this.runId}`,\n topics: ['watch'],\n app: this.inngest,\n },\n (message: any) => {\n if (active) {\n cb(message.data);\n }\n },\n );\n\n return () => {\n active = false;\n streamPromise\n .then(async (stream: Awaited<typeof streamPromise>) => {\n return stream.cancel();\n })\n .catch(err => {\n console.error(err);\n });\n };\n }\n\n streamLegacy({ inputData, requestContext }: { inputData?: TInput; requestContext?: RequestContext } = {}): {\n stream: ReadableStream<StreamEvent>;\n getWorkflowState: () => Promise<WorkflowResult<TState, TInput, TOutput, TSteps>>;\n } {\n const { readable, writable } = new TransformStream<StreamEvent, StreamEvent>();\n\n const writer = writable.getWriter();\n void writer.write({\n // @ts-expect-error - stream event type mismatch\n type: 'start',\n payload: { runId: this.runId },\n });\n\n const unwatch = this.watch(async event => {\n try {\n const e: any = {\n ...event,\n type: event.type.replace('workflow-', ''),\n };\n\n if (e.type === 'step-output') {\n e.type = e.payload.output.type;\n e.payload = e.payload.output.payload;\n }\n // watch events are data stream events, so we need to cast them to the correct type\n await writer.write(e as any);\n } catch {}\n });\n\n this.closeStreamAction = async () => {\n await writer.write({\n type: 'finish',\n // @ts-expect-error - stream event type mismatch\n payload: { runId: this.runId },\n });\n unwatch();\n\n try {\n await writer.close();\n } catch (err) {\n console.error('Error closing stream:', err);\n } finally {\n writer.releaseLock();\n }\n };\n\n this.executionResults = this._start({ inputData, requestContext, format: 'legacy' }).then(result => {\n if (result.status !== 'suspended') {\n this.closeStreamAction?.().catch(() => {});\n }\n\n return result;\n });\n\n return {\n stream: readable as ReadableStream<StreamEvent>,\n getWorkflowState: () => this.executionResults!,\n };\n }\n\n stream({\n inputData,\n requestContext,\n tracingOptions,\n closeOnSuspend = true,\n initialState,\n outputOptions,\n perStep,\n }: {\n inputData?: TInput;\n requestContext?: RequestContext;\n tracingContext?: TracingContext;\n tracingOptions?: TracingOptions;\n closeOnSuspend?: boolean;\n initialState?: TState;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n perStep?: boolean;\n } = {}): WorkflowRunOutput<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n if (this.closeStreamAction && this.streamOutput) {\n return this.streamOutput;\n }\n\n this.closeStreamAction = async () => {};\n\n const self = this;\n const stream = new ReadableStream<WorkflowStreamEvent>({\n async start(controller) {\n // TODO: fix this, watch doesn't have a type\n const unwatch = self.watch(async ({ type, from = ChunkFrom.WORKFLOW, payload }) => {\n controller.enqueue({\n type,\n runId: self.runId,\n from,\n payload: {\n stepName: (payload as unknown as { id: string })?.id,\n ...payload,\n },\n } as WorkflowStreamEvent);\n });\n\n self.closeStreamAction = async () => {\n unwatch();\n\n try {\n await controller.close();\n } catch (err) {\n console.error('Error closing stream:', err);\n }\n };\n\n const executionResultsPromise = self._start({\n inputData,\n requestContext,\n // tracingContext, // We are not able to pass a reference to a span here, what to do?\n initialState,\n tracingOptions,\n outputOptions,\n format: 'vnext',\n perStep,\n });\n let executionResults;\n try {\n executionResults = await executionResultsPromise;\n\n if (closeOnSuspend) {\n // always close stream, even if the workflow is suspended\n // this will trigger a finish event with workflow status set to suspended\n self.closeStreamAction?.().catch(() => {});\n } else if (executionResults.status !== 'suspended') {\n self.closeStreamAction?.().catch(() => {});\n }\n if (self.streamOutput) {\n self.streamOutput.updateResults(\n executionResults as unknown as WorkflowResult<TState, TInput, TOutput, TSteps>,\n );\n }\n } catch (err) {\n self.streamOutput?.rejectResults(err as unknown as Error);\n self.closeStreamAction?.().catch(() => {});\n }\n },\n });\n\n this.streamOutput = new WorkflowRunOutput<WorkflowResult<TState, TInput, TOutput, TSteps>>({\n runId: this.runId,\n workflowId: this.workflowId,\n stream,\n });\n\n return this.streamOutput;\n }\n\n timeTravelStream<TTravelInput>({\n inputData,\n resumeData,\n initialState,\n step,\n context,\n nestedStepsContext,\n requestContext,\n // tracingContext,\n tracingOptions,\n outputOptions,\n perStep,\n }: {\n inputData?: TTravelInput;\n initialState?: TState;\n resumeData?: any;\n step:\n | Step<string, any, any, any, any, any, TEngineType>\n | [...Step<string, any, any, any, any, any, TEngineType>[], Step<string, any, any, any, any, any, TEngineType>]\n | string\n | string[];\n context?: TimeTravelContext<any, any, any, any>;\n nestedStepsContext?: Record<string, TimeTravelContext<any, any, any, any>>;\n requestContext?: RequestContext;\n tracingContext?: TracingContext;\n tracingOptions?: TracingOptions;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n perStep?: boolean;\n }) {\n this.closeStreamAction = async () => {};\n\n const self = this;\n const stream = new ReadableStream<WorkflowStreamEvent>({\n async start(controller) {\n // TODO: fix this, watch doesn't have a type\n const unwatch = self.watch(async ({ type, from = ChunkFrom.WORKFLOW, payload }) => {\n controller.enqueue({\n type,\n runId: self.runId,\n from,\n payload: {\n stepName: (payload as unknown as { id: string })?.id,\n ...payload,\n },\n } as WorkflowStreamEvent);\n });\n\n self.closeStreamAction = async () => {\n unwatch();\n\n try {\n controller.close();\n } catch (err) {\n console.error('Error closing stream:', err);\n }\n };\n const executionResultsPromise = self._timeTravel({\n inputData,\n step,\n context,\n nestedStepsContext,\n resumeData,\n initialState,\n requestContext,\n tracingOptions,\n outputOptions,\n perStep,\n });\n\n self.executionResults = executionResultsPromise;\n\n let executionResults;\n try {\n executionResults = await executionResultsPromise;\n self.closeStreamAction?.().catch(() => {});\n\n if (self.streamOutput) {\n self.streamOutput.updateResults(executionResults);\n }\n } catch (err) {\n self.streamOutput?.rejectResults(err as unknown as Error);\n self.closeStreamAction?.().catch(() => {});\n }\n },\n });\n\n this.streamOutput = new WorkflowRunOutput<WorkflowResult<TState, TInput, TOutput, TSteps>>({\n runId: this.runId,\n workflowId: this.workflowId,\n stream,\n });\n\n return this.streamOutput;\n }\n\n /**\n * Hydrates errors in a failed workflow result back to proper Error instances.\n * This ensures error.cause chains and custom properties are preserved.\n */\n private hydrateFailedResult(result: WorkflowResult<TState, TInput, TOutput, TSteps>): void {\n if (result.status === 'failed') {\n // Ensure error is a proper Error instance with all properties preserved\n result.error = getErrorFromUnknown(result.error, { serializeStack: false });\n // Re-hydrate serialized errors in step results\n if (result.steps) {\n hydrateSerializedStepErrors(result.steps);\n }\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { emitErrorEvent } from '@mastra/core/agent/durable';\nimport { RequestContext } from '@mastra/core/di';\nimport type { Mastra } from '@mastra/core/mastra';\nimport { SpanType, EntityType } from '@mastra/core/observability';\nimport type { WorkflowRuns } from '@mastra/core/storage';\nimport { Workflow } from '@mastra/core/workflows';\nimport type {\n Step,\n StepResult,\n WorkflowConfig,\n StepFlowEntry,\n WorkflowResult,\n WorkflowRunState,\n WorkflowStreamEvent,\n Run,\n} from '@mastra/core/workflows';\nimport { NonRetriableError } from 'inngest';\nimport type { Inngest } from 'inngest';\nimport { InngestExecutionEngine } from './execution-engine';\nimport { InngestPubSub } from './pubsub';\nimport { InngestRun } from './run';\nimport type {\n InngestEngineType,\n InngestFlowControlConfig,\n InngestFlowCronConfig,\n InngestWorkflowConfig,\n} from './types';\n\nexport class InngestWorkflow<\n TEngineType = InngestEngineType,\n TSteps extends Step<string, any, any, any, any, any, TEngineType>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TEngineType\n >[],\n TWorkflowId extends string = string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TPrevSchema = TInput,\n> extends Workflow<TEngineType, TSteps, TWorkflowId, TState, TInput, TOutput, TPrevSchema> {\n #mastra: Mastra;\n public inngest: Inngest;\n\n private function: ReturnType<Inngest['createFunction']> | undefined;\n private cronFunction: ReturnType<Inngest['createFunction']> | undefined;\n private readonly flowControlConfig?: InngestFlowControlConfig;\n private readonly cronConfig?: InngestFlowCronConfig<TInput, TState>;\n\n constructor(\n params: InngestWorkflowConfig<\n TWorkflowId,\n TState,\n TInput,\n TOutput,\n TSteps & Step<string, any, any, any, any, any, InngestEngineType>[]\n >,\n inngest: Inngest,\n ) {\n const { concurrency, rateLimit, throttle, debounce, priority, cron, inputData, initialState, ...workflowParams } =\n params;\n\n super(workflowParams as WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps>);\n\n this.engineType = 'inngest';\n\n const flowControlEntries = Object.entries({ concurrency, rateLimit, throttle, debounce, priority }).filter(\n ([_, value]) => value !== undefined,\n );\n\n this.flowControlConfig = flowControlEntries.length > 0 ? Object.fromEntries(flowControlEntries) : undefined;\n\n this.#mastra = params.mastra!;\n this.inngest = inngest;\n\n if (cron) {\n this.cronConfig = { cron, inputData, initialState };\n }\n }\n\n async listWorkflowRuns(args?: {\n fromDate?: Date;\n toDate?: Date;\n perPage?: number | false;\n page?: number;\n resourceId?: string;\n }) {\n const storage = this.#mastra?.getStorage();\n if (!storage) {\n this.logger.debug('Cannot get workflow runs. Mastra engine is not initialized');\n return { runs: [], total: 0 };\n }\n\n const workflowsStore = await storage.getStore('workflows');\n if (!workflowsStore) {\n return { runs: [], total: 0 };\n }\n return workflowsStore.listWorkflowRuns({ workflowName: this.id, ...(args ?? {}) }) as unknown as WorkflowRuns;\n }\n\n __registerMastra(mastra: Mastra) {\n super.__registerMastra(mastra);\n this.#mastra = mastra;\n this.executionEngine.__registerMastra(mastra);\n const updateNested = (step: StepFlowEntry) => {\n if (\n (step.type === 'step' || step.type === 'loop' || step.type === 'foreach') &&\n step.step instanceof InngestWorkflow\n ) {\n step.step.__registerMastra(mastra);\n } else if (step.type === 'parallel' || step.type === 'conditional') {\n for (const subStep of step.steps) {\n updateNested(subStep);\n }\n }\n };\n\n if (this.executionGraph.steps.length) {\n for (const step of this.executionGraph.steps) {\n updateNested(step);\n }\n }\n }\n\n async createRun(options?: {\n runId?: string;\n resourceId?: string;\n }): Promise<Run<TEngineType, TSteps, TState, TInput, TOutput>> {\n const runIdToUse = options?.runId || randomUUID();\n\n // Return a new Run instance with object parameters\n const existingInMemoryRun = this.runs.get(runIdToUse);\n const newRun = new InngestRun<TEngineType, TSteps, TState, TInput, TOutput>(\n {\n workflowId: this.id,\n runId: runIdToUse,\n resourceId: options?.resourceId,\n executionEngine: this.executionEngine,\n executionGraph: this.executionGraph,\n serializedStepGraph: this.serializedStepGraph,\n mastra: this.#mastra,\n retryConfig: this.retryConfig,\n cleanup: () => this.runs.delete(runIdToUse),\n workflowSteps: this.steps,\n workflowEngineType: this.engineType,\n validateInputs: this.options.validateInputs,\n },\n this.inngest,\n );\n const run = (existingInMemoryRun ?? newRun) as Run<TEngineType, TSteps, TState, TInput, TOutput>;\n\n this.runs.set(runIdToUse, run);\n\n const shouldPersistSnapshot = this.options.shouldPersistSnapshot({\n workflowStatus: run.workflowRunStatus,\n stepResults: {},\n });\n\n const existingStoredRun = await this.getWorkflowRunById(runIdToUse, {\n withNestedWorkflows: false,\n });\n\n // Check if run exists in persistent storage (not just in-memory)\n const existsInStorage = existingStoredRun && !existingStoredRun.isFromInMemory;\n\n if (!existsInStorage && shouldPersistSnapshot) {\n const workflowsStore = await this.mastra?.getStorage()?.getStore('workflows');\n await workflowsStore?.persistWorkflowSnapshot({\n workflowName: this.id,\n runId: runIdToUse,\n resourceId: options?.resourceId,\n snapshot: {\n runId: runIdToUse,\n status: 'pending',\n value: {},\n context: {},\n activePaths: [],\n activeStepsPath: {},\n waitingPaths: {},\n serializedStepGraph: this.serializedStepGraph,\n suspendedPaths: {},\n resumeLabels: {},\n result: undefined,\n error: undefined,\n timestamp: Date.now(),\n },\n });\n }\n\n return run;\n }\n\n //createCronFunction is only called if cronConfig.cron is defined.\n private createCronFunction() {\n if (this.cronFunction) {\n return this.cronFunction;\n }\n this.cronFunction = this.inngest.createFunction(\n {\n id: `workflow.${this.id}.cron`,\n retries: 0,\n cancelOn: [{ event: `cancel.workflow.${this.id}` }],\n triggers: { cron: this.cronConfig?.cron ?? '' },\n ...this.flowControlConfig,\n },\n async () => {\n const run = await this.createRun();\n // @ts-expect-error - cron inputData type mismatch\n const result = await run.start({\n inputData: this.cronConfig?.inputData,\n initialState: this.cronConfig?.initialState,\n });\n return { result, runId: run.runId };\n },\n );\n return this.cronFunction;\n }\n\n getFunction(): ReturnType<Inngest['createFunction']> {\n if (this.function) {\n return this.function;\n }\n\n // Always set function-level retries to 0, since retries are handled at the step level via executeStepWithRetry\n // which uses either step.retries or retryConfig.attempts (step.retries takes precedence).\n // step.retries is not accessible at function level, so we handle retries manually in executeStepWithRetry.\n // This is why we set retries to 0 here.\n this.function = this.inngest.createFunction(\n {\n id: `workflow.${this.id}`,\n retries: 0,\n cancelOn: [{ event: `cancel.workflow.${this.id}` }],\n triggers: { event: `workflow.${this.id}` },\n // Spread flow control configuration\n ...this.flowControlConfig,\n },\n async ({ event, step, attempt }) => {\n let {\n inputData,\n initialState,\n runId,\n resourceId,\n resume,\n outputOptions,\n format,\n timeTravel,\n perStep,\n tracingOptions,\n } = event.data;\n\n if (!runId) {\n runId = await step.run(`workflow.${this.id}.runIdGen`, async () => {\n return randomUUID();\n });\n }\n\n // Create InngestPubSub instance. Publishes go through `inngest.realtime.publish()`\n // (Inngest SDK v4 client API), which auto-includes the current runId from the\n // function's async context.\n const pubsub = new InngestPubSub(this.inngest, this.id);\n\n // Create requestContext before execute so we can reuse it in finalize\n const requestContext: RequestContext = new RequestContext(Object.entries(event.data.requestContext ?? {}));\n\n // Store mastra reference for use in proxy closure\n const mastra = this.#mastra;\n const tracingPolicy = this.options.tracingPolicy;\n\n // Create the workflow root span durably - exports SPAN_STARTED immediately on first execution\n // On replay, returns memoized ExportedSpan data without re-creating the span\n const workflowSpanData = await step.run(`workflow.${this.id}.span.start`, async () => {\n const observability = mastra?.observability?.getSelectedInstance({ requestContext });\n if (!observability) return undefined;\n\n const span = observability.startSpan({\n type: SpanType.WORKFLOW_RUN,\n name: `workflow run: '${this.id}'`,\n entityType: EntityType.WORKFLOW_RUN,\n entityId: this.id,\n entityName: this.id,\n input: inputData,\n metadata: {\n resourceId,\n runId,\n },\n tracingPolicy,\n tracingOptions,\n requestContext,\n });\n\n return span?.exportSpan();\n });\n\n const engine = new InngestExecutionEngine(this.#mastra, step, attempt, this.options);\n\n let result: WorkflowResult<TState, TInput, TOutput, TSteps>;\n try {\n result = await engine.execute<TState, TInput, WorkflowResult<TState, TInput, TOutput, TSteps>>({\n workflowId: this.id,\n runId,\n resourceId,\n graph: this.executionGraph,\n serializedStepGraph: this.serializedStepGraph,\n input: inputData,\n initialState,\n pubsub,\n retryConfig: this.retryConfig,\n requestContext,\n resume,\n timeTravel,\n perStep,\n format,\n abortController: new AbortController(),\n // For Inngest, we don't pass workflowSpan - step spans use tracingIds instead\n workflowSpan: undefined,\n // Pass tracing IDs for durable span operations\n tracingIds: workflowSpanData\n ? {\n traceId: workflowSpanData.traceId,\n workflowSpanId: workflowSpanData.id,\n }\n : undefined,\n outputOptions,\n outputWriter: async (chunk: WorkflowStreamEvent) => {\n try {\n await pubsub.publish(`workflow.events.v2.${runId}`, {\n type: 'watch',\n runId,\n data: chunk,\n });\n } catch (err) {\n this.logger.debug?.('Failed to publish watch event:', err);\n }\n },\n });\n } catch (executionError) {\n // Execution threw an exception (not just returned failed status)\n // Create a failed result to pass to finalize\n result = {\n status: 'failed',\n steps: {},\n state: initialState ?? {},\n error: executionError instanceof Error ? executionError : new Error(String(executionError)),\n } as WorkflowResult<TState, TInput, TOutput, TSteps>;\n }\n\n // Final step to invoke lifecycle callbacks and end workflow span.\n // This step is memoized by step.run.\n let finalizeError: unknown;\n let finalizeErrored = false;\n try {\n await step.run(`workflow.${this.id}.finalize`, async () => {\n // For durable agent workflows, emit error event on failure so the\n // client's stream can receive the error and close properly.\n if (result.status === 'failed' && inputData?.__workflowKind === 'durable-agent' && inputData?.runId) {\n const error = result.error instanceof Error ? result.error : new Error(String(result.error));\n try {\n await emitErrorEvent(pubsub, inputData.runId, error);\n } catch (e) {\n this.logger.debug?.('Failed to emit error event:', e);\n }\n }\n\n if (result.status !== 'paused') {\n // Invoke lifecycle callbacks (onFinish and onError)\n await engine.invokeLifecycleCallbacksInternal({\n status: result.status,\n result: 'result' in result ? result.result : undefined,\n error: 'error' in result ? result.error : undefined,\n steps: result.steps,\n tripwire: 'tripwire' in result ? result.tripwire : undefined,\n runId,\n workflowId: this.id,\n resourceId,\n input: inputData,\n requestContext,\n state: result.state ?? initialState ?? {},\n });\n }\n\n // End the workflow span with appropriate status\n // The workflow span was already created and SPAN_STARTED was exported in the span.start step\n if (workflowSpanData) {\n const observability = mastra?.observability?.getSelectedInstance({ requestContext });\n if (observability) {\n // Rebuild the span from cached data to call end/error\n const workflowSpan = observability.rebuildSpan(workflowSpanData);\n\n if (result.status === 'failed') {\n workflowSpan.error({\n error: result.error instanceof Error ? result.error : new Error(String(result.error)),\n attributes: { status: 'failed' },\n });\n } else {\n workflowSpan.end({\n output: result.status === 'success' ? result.result : undefined,\n attributes: { status: result.status },\n });\n }\n }\n }\n\n // Ensure final snapshot is persisted BEFORE publishing workflow-finish\n // This fixes a race condition where getRunOutput reads the snapshot before it's fully written\n const shouldPersistFinalSnapshot = this.options.shouldPersistSnapshot({\n workflowStatus: result.status,\n stepResults: result.steps,\n });\n if (shouldPersistFinalSnapshot) {\n const workflowsStore = await mastra?.getStorage()?.getStore('workflows');\n if (workflowsStore) {\n // For suspended workflows, read existing snapshot to preserve suspendedPaths and resumeLabels\n // which were set correctly by the handlers during execution\n let existingSnapshot:\n | { suspendedPaths?: Record<string, number[]>; resumeLabels?: Record<string, any> }\n | undefined;\n if (result.status === 'suspended') {\n existingSnapshot =\n (await workflowsStore.loadWorkflowSnapshot({\n workflowName: this.id,\n runId,\n })) ?? undefined;\n }\n\n await workflowsStore.persistWorkflowSnapshot({\n workflowName: this.id,\n runId,\n resourceId,\n snapshot: {\n runId,\n status: result.status,\n value: result.state ?? initialState ?? {},\n context: toSnapshotContext(result.steps),\n activePaths: [],\n activeStepsPath: {},\n serializedStepGraph: this.serializedStepGraph,\n suspendedPaths: existingSnapshot?.suspendedPaths ?? {},\n waitingPaths: {},\n resumeLabels: existingSnapshot?.resumeLabels ?? result.resumeLabels ?? {},\n result: result.status === 'success' ? toSnapshotResult(result.result) : undefined,\n error: result.status === 'failed' ? result.error : undefined,\n timestamp: Date.now(),\n },\n });\n }\n }\n\n // Publish workflow-finish event for realtime subscribers (best-effort)\n try {\n await pubsub.publish(`workflow.events.v2.${runId}`, {\n type: 'watch',\n runId,\n data: {\n type: 'workflow-finish',\n payload: {\n status: result.status,\n result: result.status === 'success' ? result.result : undefined,\n error: result.status === 'failed' ? result.error : undefined,\n },\n },\n });\n } catch (publishError) {\n this.logger.debug?.('Failed to publish workflow-finish event:', publishError);\n }\n\n // Throw after span ended for failed workflows\n if (result.status === 'failed') {\n throw new NonRetriableError(`Workflow failed`, {\n cause: result,\n });\n }\n\n return result;\n });\n } catch (error) {\n finalizeErrored = true;\n finalizeError = error;\n } finally {\n // Keep this outside step.run memoization, but guaranteed on all paths.\n const observability = mastra?.observability?.getSelectedInstance({ requestContext });\n if (observability) {\n try {\n await observability.flush();\n } catch (flushError) {\n this.logger.debug?.('Failed to flush observability:', flushError);\n }\n }\n }\n\n if (finalizeErrored) {\n throw finalizeError;\n }\n\n return { result, runId };\n },\n );\n return this.function;\n }\n\n getNestedFunctions(steps: StepFlowEntry[]): ReturnType<Inngest['createFunction']>[] {\n return steps.flatMap(step => {\n if (step.type === 'step' || step.type === 'loop' || step.type === 'foreach') {\n if (step.step instanceof InngestWorkflow) {\n return [step.step.getFunction(), ...step.step.getNestedFunctions(step.step.executionGraph.steps)];\n }\n return [];\n } else if (step.type === 'parallel' || step.type === 'conditional') {\n return this.getNestedFunctions(step.steps);\n }\n\n return [];\n });\n }\n\n getFunctions(): ReturnType<Inngest['createFunction']>[] {\n return [\n this.getFunction(),\n ...(this.cronConfig?.cron ? [this.createCronFunction()] : []),\n ...this.getNestedFunctions(this.executionGraph.steps),\n ];\n }\n}\n\n/**\n * Converts runtime step results to the serialized context shape expected by WorkflowRunState.\n * StepResult is a structural subset of SerializedStepResult (widening), so no data\n * transformation is needed — this bridges the generic type mismatch at the persistence boundary.\n */\nfunction toSnapshotContext(steps: Record<string, StepResult<any, any, any, any>>): WorkflowRunState['context'] {\n return steps as unknown as WorkflowRunState['context'];\n}\n\n/**\n * Converts a workflow output value to the record shape expected by WorkflowRunState.result.\n * Workflow outputs are generic (TOutput) but the snapshot schema stores them as Record<string, any>.\n */\nfunction toSnapshotResult(output: unknown): WorkflowRunState['result'] {\n return output as WorkflowRunState['result'];\n}\n","import type { Mastra } from '@mastra/core/mastra';\nimport type { InngestFunction } from 'inngest';\nimport { InngestWorkflow } from './workflow';\n\nexport function collectInngestFunctions({\n mastra,\n functions: userFunctions = [],\n}: {\n mastra: Mastra;\n functions?: InngestFunction.Like[];\n}) {\n const workflows = mastra.listWorkflows();\n const workflowFunctions = Array.from(\n new Set(\n Object.values(workflows).flatMap(workflow => {\n if (workflow instanceof InngestWorkflow) {\n workflow.__registerMastra(mastra);\n return workflow.getFunctions();\n }\n return [];\n }),\n ),\n );\n\n return [...workflowFunctions, ...userFunctions];\n}\n","import type { Mastra } from '@mastra/core/mastra';\nimport type { Inngest, InngestFunction, RegisterOptions } from 'inngest';\nimport type { connect as inngestConnect } from 'inngest/connect';\nimport { collectInngestFunctions } from './functions';\n\ntype InngestConnectOptions = Parameters<typeof inngestConnect>[0];\n\nexport interface MastraConnectOptions extends Omit<InngestConnectOptions, 'apps'> {\n mastra: Mastra;\n inngest: Inngest;\n /**\n * Optional array of additional Inngest functions to expose through the same Connect worker.\n */\n functions?: InngestFunction.Like[];\n /**\n * Forwarded to Inngest as part of the app registration (timeout, signing key overrides, etc.).\n *\n * When a field is present in both `registerOptions` and the top-level Connect options\n * (e.g. `signingKey`), `registerOptions` wins. This matches the override behavior of\n * `serve()` so the two surfaces stay consistent.\n */\n registerOptions?: RegisterOptions;\n}\n\n/**\n * Connect Mastra workflows to Inngest using an outbound worker connection.\n *\n * Use this instead of `serve()` when the worker process should not expose an inbound HTTP\n * endpoint. The same workflow functions collected by `serve()` are forwarded to\n * `inngest/connect`, alongside any additional user functions.\n *\n * If the Mastra instance has no `InngestWorkflow` and no additional `functions` are\n * provided, a warning is emitted because the worker would otherwise idle forever with\n * nothing to execute.\n *\n * @example Worker process\n * ```ts\n * import { connect } from '@mastra/inngest/connect';\n * import { mastra } from './mastra';\n * import { inngest } from './mastra/inngest';\n *\n * await connect({ mastra, inngest });\n * ```\n */\nexport async function connect(options: MastraConnectOptions) {\n const { mastra, inngest, functions, registerOptions, ...connectOptions } = options;\n const appFunctions = collectInngestFunctions({ mastra, functions });\n\n if (appFunctions.length === 0) {\n console.warn(\n '[@mastra/inngest] connect() was called with no Inngest workflows and no additional functions. ' +\n 'The worker will connect to Inngest but has nothing to execute. ' +\n 'Register at least one InngestWorkflow on the Mastra instance or pass `functions: [...]`.',\n );\n }\n\n const { connect: connectWorker } = await import('inngest/connect');\n\n return connectWorker({\n // Top-level Connect options first, then registerOptions so they take precedence\n // for any overlapping keys (e.g. `signingKey`). This matches serve()'s behavior.\n ...connectOptions,\n ...registerOptions,\n apps: [{ client: inngest, functions: appFunctions }],\n });\n}\n"]}
@@ -944,7 +944,15 @@ var InngestRun = class extends Run {
944
944
  this.executionResults = p;
945
945
  return p;
946
946
  }
947
- async _resume(params) {
947
+ /**
948
+ * Performs all resume preparation and dispatches the resume event to Inngest,
949
+ * but does NOT wait for the workflow result. Shared by `_resume()` (which polls
950
+ * for the result afterwards) and `resumeAsync()` (which returns immediately).
951
+ *
952
+ * Send-time failures (invalid resume data, event send failure) reject synchronously,
953
+ * and the snapshot is rolled back to its prior state on send failure.
954
+ */
955
+ async _resumeAndSendEvent(params) {
948
956
  const storage = this.#mastra?.getStorage();
949
957
  const workflowsStore = await storage?.getStore("workflows");
950
958
  if (!workflowsStore) {
@@ -1023,11 +1031,34 @@ var InngestRun = class extends Run {
1023
1031
  if (!eventId) {
1024
1032
  throw new Error("Event ID is not set");
1025
1033
  }
1034
+ return { eventId };
1035
+ }
1036
+ async _resume(params) {
1037
+ const { eventId } = await this._resumeAndSendEvent(params);
1026
1038
  const runOutput = await this.getRunOutput(eventId);
1027
1039
  const result = runOutput?.output?.result;
1028
1040
  this.hydrateFailedResult(result);
1029
1041
  return result;
1030
1042
  }
1043
+ /**
1044
+ * Resumes a suspended workflow without waiting for completion (fire-and-forget).
1045
+ * Returns immediately with the runId after sending the resume event to Inngest.
1046
+ * The workflow continues executing independently in Inngest.
1047
+ *
1048
+ * Mirrors `startAsync()`: send-time failures (invalid resume data, event send
1049
+ * failure) still reject synchronously and roll back the snapshot, but the result
1050
+ * is never polled via `getRunOutput()`. This avoids the polling-based 404 race when
1051
+ * you don't need the resolved result inline.
1052
+ *
1053
+ * NOTE: this is exposed over HTTP / the client SDK as `resume-no-wait` / `resumeNoWait()`,
1054
+ * not `resumeAsync`, because the existing `resumeAsync()` client/server surface awaits the
1055
+ * full workflow result. TODO(v2): consolidate so `resumeAsync` consistently means
1056
+ * fire-and-forget across core, client SDK and HTTP routes (breaking change deferred to v2).
1057
+ */
1058
+ async resumeAsync(params) {
1059
+ await this._resumeAndSendEvent(params);
1060
+ return { runId: this.runId };
1061
+ }
1031
1062
  async timeTravel(params) {
1032
1063
  const p = this._timeTravel(params).then((result) => {
1033
1064
  if (result.status !== "suspended") {
@@ -1825,5 +1856,5 @@ async function connect(options) {
1825
1856
  }
1826
1857
 
1827
1858
  export { InngestExecutionEngine, InngestPubSub, InngestRun, InngestWorkflow, collectInngestFunctions, connect };
1828
- //# sourceMappingURL=chunk-R2J5O4MH.js.map
1829
- //# sourceMappingURL=chunk-R2J5O4MH.js.map
1859
+ //# sourceMappingURL=chunk-NNGHERTQ.js.map
1860
+ //# sourceMappingURL=chunk-NNGHERTQ.js.map