@mastra/temporal 0.5.0 → 0.6.0-alpha.0

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/dist/index.cjs CHANGED
@@ -1,19 +1,16 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_utils = require("./utils-BVE1AkTt.cjs");
3
3
  let _mastra_core_workflows = require("@mastra/core/workflows");
4
+ let timers_promises = require("timers/promises");
4
5
  let _mastra_core_di = require("@mastra/core/di");
5
6
  let _temporalio_client = require("@temporalio/client");
6
7
  // src/run.ts
7
- function toStepResults(input, { steps, stepMeta }) {
8
- if (!stepMeta) return {};
9
- const records = { input };
10
- for (const [stepId, times] of Object.entries(stepMeta)) records[stepId] = {
11
- status: "success",
12
- output: steps[stepId],
13
- ...times
14
- };
15
- return records;
16
- }
8
+ var TemporalWorkflowStatusUnknownError = class extends Error {
9
+ constructor(runId, cause, afterResumeSignal = false) {
10
+ super(afterResumeSignal ? `Unable to determine Temporal workflow status for run "${runId}" after sending a resume signal. The signal may have been delivered; do not retry resume() blindly.` : `Unable to determine Temporal workflow status for run "${runId}".`, { cause });
11
+ this.name = "TemporalWorkflowStatusUnknownError";
12
+ }
13
+ };
17
14
  var TemporalRun = class extends _mastra_core_workflows.Run {
18
15
  client;
19
16
  taskQueue;
@@ -23,60 +20,82 @@ var TemporalRun = class extends _mastra_core_workflows.Run {
23
20
  this.taskQueue = temporalParams.taskQueue;
24
21
  }
25
22
  async start(args = {}) {
26
- const { input, initialState, requestContext } = await this.#prepareStart(args);
23
+ const input = await this._validateInput(args.inputData);
24
+ const initialState = await this._validateInitialState(args.initialState);
25
+ await this._validateRequestContext(args.requestContext);
26
+ const requestContext = args.requestContext ?? new _mastra_core_di.RequestContext();
27
+ await this.invokeStartCallback(input, initialState, requestContext);
27
28
  let handle;
28
29
  try {
29
- handle = await this.client.workflow.start(require_utils.toWorkflowType(this.workflowId), {
30
- taskQueue: this.taskQueue,
31
- workflowId: this.runId,
32
- args: [{
33
- inputData: input,
34
- initialState,
35
- requestContext: Object.fromEntries(requestContext.entries()),
36
- runId: this.runId,
37
- resourceId: this.resourceId,
38
- outputOptions: args.outputOptions,
39
- tracingOptions: args.tracingOptions,
40
- perStep: args.perStep,
41
- recordStepMeta: true,
42
- validateInputs: this.validateInputs
43
- }]
44
- });
30
+ handle = await this.dispatch(args, input, initialState, requestContext);
45
31
  } catch (error) {
46
- return this.#failedResult(error, input, initialState);
32
+ const result = this.failedResult(input, initialState, error);
33
+ if (!(error instanceof _temporalio_client.WorkflowExecutionAlreadyStartedError)) await this.invokeLifecycleCallbacks(result, requestContext);
34
+ return result;
47
35
  }
48
- const result = await this.#settle(handle, input, initialState);
49
- await this.#invokeFinishCallbacks(result, input, requestContext);
50
- return result;
36
+ return this.awaitResultOrSuspended(handle, input, initialState, requestContext);
51
37
  }
52
- async #prepareStart(args) {
53
- const input = await this._validateInput(args.inputData);
54
- const initialState = await this._validateInitialState(args.initialState) ?? {};
55
- await this._validateRequestContext(args.requestContext);
56
- const requestContext = args.requestContext ?? new _mastra_core_di.RequestContext();
57
- await this.executionEngine.invokeStartCallback({
58
- runId: this.runId,
59
- workflowId: this.workflowId,
60
- resourceId: this.resourceId,
61
- getInitData: () => input,
62
- requestContext,
63
- state: initialState
38
+ dispatch(args, input, initialState, requestContext) {
39
+ return this.client.workflow.start(require_utils.toWorkflowType(this.workflowId), {
40
+ taskQueue: this.taskQueue,
41
+ workflowId: this.runId,
42
+ args: [{
43
+ inputData: input,
44
+ initialState,
45
+ requestContext: Object.fromEntries(requestContext.entries()),
46
+ runId: this.runId,
47
+ resourceId: this.resourceId,
48
+ outputOptions: args.outputOptions,
49
+ tracingOptions: args.tracingOptions,
50
+ perStep: args.perStep,
51
+ validateInputs: this.validateInputs
52
+ }]
64
53
  });
65
- return {
66
- input,
67
- initialState,
68
- requestContext
69
- };
70
54
  }
71
- async #settle(handle, input, initialState) {
55
+ async awaitResult(handle, input, initialState, requestContext) {
56
+ const result = await this.resolveResult(handle, input, initialState);
57
+ await this.invokeLifecycleCallbacks(result, requestContext);
58
+ return result;
59
+ }
60
+ async queryStatus(handle, afterResumeSignal = false) {
61
+ if (typeof handle.query !== "function") return;
72
62
  try {
73
- const result = await handle.result();
63
+ return await handle.query("mastra.status");
64
+ } catch (error) {
65
+ throw new TemporalWorkflowStatusUnknownError(this.runId, error, afterResumeSignal);
66
+ }
67
+ }
68
+ async awaitResultOrSuspended(handle, input, initialState, requestContext, previousSuspension, afterResumeSignal = false) {
69
+ const terminal = this.resolveResult(handle, input, initialState);
70
+ while (true) {
71
+ const result = await Promise.race([terminal.then((result) => ({
72
+ type: "terminal",
73
+ result
74
+ })), (0, timers_promises.setTimeout)(100).then(() => ({ type: "poll" }))]);
75
+ if (result.type === "terminal") {
76
+ await this.invokeLifecycleCallbacks(result.result, requestContext);
77
+ return result.result;
78
+ }
79
+ const status = await this.queryStatus(handle, afterResumeSignal);
80
+ if (isSuspendedWorkflowResult(status)) {
81
+ const previousStep = previousSuspension ? status.steps[previousSuspension.stepId] : void 0;
82
+ if (previousSuspension !== void 0 && isSuspendedStepResult(previousStep) && previousStep.suspendedAt === previousSuspension.suspendedAt) continue;
83
+ const suspended = {
84
+ ...status,
85
+ steps: normalizeStepResults(status.steps)
86
+ };
87
+ await this.invokeLifecycleCallbacks(suspended, requestContext);
88
+ return suspended;
89
+ }
90
+ }
91
+ }
92
+ async resolveResult(handle, input, initialState) {
93
+ try {
94
+ const output = await handle.result();
74
95
  return {
75
- status: "success",
76
- input,
77
- result: result.result,
78
- state: initialState,
79
- steps: toStepResults(input, result)
96
+ ...output,
97
+ ...input !== void 0 && { input },
98
+ steps: normalizeStepResults(output.steps)
80
99
  };
81
100
  } catch (error) {
82
101
  if (error instanceof _temporalio_client.WorkflowFailedError && error.cause instanceof _temporalio_client.CancelledFailure) return {
@@ -85,10 +104,10 @@ var TemporalRun = class extends _mastra_core_workflows.Run {
85
104
  state: initialState,
86
105
  steps: {}
87
106
  };
88
- return this.#failedResult(error, input, initialState);
107
+ return this.failedResult(input, initialState, error);
89
108
  }
90
109
  }
91
- #failedResult(error, input, initialState) {
110
+ failedResult(input, initialState, error) {
92
111
  return {
93
112
  status: "failed",
94
113
  input,
@@ -97,7 +116,17 @@ var TemporalRun = class extends _mastra_core_workflows.Run {
97
116
  steps: {}
98
117
  };
99
118
  }
100
- #invokeFinishCallbacks(result, input, requestContext) {
119
+ invokeStartCallback(input, initialState, requestContext) {
120
+ return this.executionEngine.invokeStartCallback({
121
+ runId: this.runId,
122
+ workflowId: this.workflowId,
123
+ resourceId: this.resourceId,
124
+ getInitData: () => input,
125
+ requestContext,
126
+ state: initialState ?? {}
127
+ });
128
+ }
129
+ invokeLifecycleCallbacks(result, requestContext) {
101
130
  return this.executionEngine.invokeLifecycleCallbacks({
102
131
  status: result.status,
103
132
  result: result.status === "success" ? result.result : void 0,
@@ -106,11 +135,21 @@ var TemporalRun = class extends _mastra_core_workflows.Run {
106
135
  runId: this.runId,
107
136
  workflowId: this.workflowId,
108
137
  resourceId: this.resourceId,
109
- input,
138
+ input: result.input,
110
139
  requestContext,
111
140
  state: result.state ?? {}
112
141
  });
113
142
  }
143
+ async resumePayload(params) {
144
+ const step = Array.isArray(params.step) ? params.step.at(-1) : params.step;
145
+ const stepId = typeof step === "string" ? step : step?.id;
146
+ const resumeData = await this._validateResumeData(params.resumeData, stepId ? this.workflowSteps[stepId] : void 0);
147
+ return {
148
+ ...stepId !== void 0 && { step: stepId },
149
+ ...params.label !== void 0 && { label: params.label },
150
+ resumeData
151
+ };
152
+ }
114
153
  async cancel() {
115
154
  await this.client.workflow.getHandle(this.runId).cancel();
116
155
  await super.cancel();
@@ -127,11 +166,24 @@ var TemporalRun = class extends _mastra_core_workflows.Run {
127
166
  resumeStream(..._args) {
128
167
  return this.unsupported("resumeStream");
129
168
  }
130
- resume(..._args) {
131
- return this.unsupported("resume");
169
+ async resume(params) {
170
+ await this._validateRequestContext(params.requestContext);
171
+ const requestContext = params.requestContext ?? new _mastra_core_di.RequestContext();
172
+ const handle = this.client.workflow.getHandle(this.runId);
173
+ const payload = await this.resumePayload(params);
174
+ const status = await this.queryStatus(handle);
175
+ const stepId = isSuspendedWorkflowResult(status) ? payload.step ?? (payload.label ? status.resumeLabels?.[payload.label]?.stepId : void 0) ?? (status.suspended?.length === 1 && status.suspended[0]?.length === 1 ? status.suspended[0][0] : void 0) : void 0;
176
+ const previousStep = stepId && isSuspendedWorkflowResult(status) ? status.steps[stepId] : void 0;
177
+ const previousSuspension = stepId && isSuspendedStepResult(previousStep) ? {
178
+ stepId,
179
+ suspendedAt: previousStep.suspendedAt
180
+ } : void 0;
181
+ await handle.signal("mastra.resume", payload);
182
+ return this.awaitResultOrSuspended(handle, void 0, void 0, requestContext, previousSuspension, true);
132
183
  }
133
- resumeAsync(..._args) {
134
- return this.unsupported("resumeAsync");
184
+ async resumeAsync(params) {
185
+ await this.client.workflow.getHandle(this.runId).signal("mastra.resume", await this.resumePayload(params));
186
+ return { runId: this.runId };
135
187
  }
136
188
  restart(..._args) {
137
189
  return this.unsupported("restart");
@@ -143,29 +195,63 @@ var TemporalRun = class extends _mastra_core_workflows.Run {
143
195
  return this.unsupported("timeTravelStream");
144
196
  }
145
197
  async startAsync(args = {}) {
146
- const { input, initialState, requestContext } = await this.#prepareStart(args);
198
+ const input = await this._validateInput(args.inputData);
199
+ const initialState = await this._validateInitialState(args.initialState);
200
+ await this._validateRequestContext(args.requestContext);
201
+ const requestContext = args.requestContext ?? new _mastra_core_di.RequestContext();
202
+ await this.invokeStartCallback(input, initialState, requestContext);
203
+ let handle;
204
+ try {
205
+ handle = await this.dispatch(args, input, initialState, requestContext);
206
+ } catch (error) {
207
+ if (!(error instanceof _temporalio_client.WorkflowExecutionAlreadyStartedError)) await this.invokeLifecycleCallbacks(this.failedResult(input, initialState, error), requestContext);
208
+ throw error;
209
+ }
147
210
  const { onFinish, onError } = this.executionEngine.options;
148
- const hasFinishCallbacks = Boolean(onFinish || onError);
149
- const handle = await this.client.workflow.start(require_utils.toWorkflowType(this.workflowId), {
150
- taskQueue: this.taskQueue,
151
- workflowId: this.runId,
152
- args: [{
153
- inputData: input,
154
- initialState,
155
- requestContext: Object.fromEntries(requestContext.entries()),
156
- runId: this.runId,
157
- resourceId: this.resourceId,
158
- outputOptions: args.outputOptions,
159
- tracingOptions: args.tracingOptions,
160
- perStep: args.perStep,
161
- ...hasFinishCallbacks && { recordStepMeta: true },
162
- validateInputs: this.validateInputs
163
- }]
164
- });
165
- if (hasFinishCallbacks) this.#settle(handle, input, initialState).then((result) => this.#invokeFinishCallbacks(result, input, requestContext));
211
+ if (onFinish || onError) this.awaitResult(handle, input, initialState, requestContext);
166
212
  return { runId: this.runId };
167
213
  }
168
214
  };
215
+ function isSuspendedWorkflowResult(value) {
216
+ return typeof value === "object" && value !== null && value.status === "suspended" && typeof value.steps === "object" && value.steps !== null;
217
+ }
218
+ function isSuspendedStepResult(value) {
219
+ return typeof value === "object" && value !== null && value.status === "suspended";
220
+ }
221
+ function normalizeStepResult(value) {
222
+ if (typeof value !== "object" || value === null) return {
223
+ status: "success",
224
+ output: value,
225
+ startedAt: 0,
226
+ endedAt: 0
227
+ };
228
+ const record = value;
229
+ if (record.__temporalStepResult === true && record.status === "suspended" && typeof record.suspendedAt === "number") return {
230
+ status: "suspended",
231
+ payload: record.payload,
232
+ suspendPayload: record.suspendPayload,
233
+ suspendedAt: record.suspendedAt
234
+ };
235
+ if (record.__temporalStepResult === true && record.status === "success" && typeof record.startedAt === "number" && typeof record.endedAt === "number") return {
236
+ status: "success",
237
+ payload: record.payload,
238
+ output: record.output,
239
+ ...record.suspendPayload !== void 0 && { suspendPayload: record.suspendPayload },
240
+ ...record.resumeData !== void 0 && { resumeData: record.resumeData },
241
+ startedAt: record.startedAt,
242
+ endedAt: record.endedAt
243
+ };
244
+ return {
245
+ status: "success",
246
+ output: value,
247
+ startedAt: 0,
248
+ endedAt: 0
249
+ };
250
+ }
251
+ function normalizeStepResults(steps) {
252
+ if (!steps || typeof steps !== "object") return {};
253
+ return Object.fromEntries(Object.entries(steps).map(([id, value]) => [id, normalizeStepResult(value)]));
254
+ }
169
255
  // src/workflow.ts
170
256
  var TemporalWorkflow = class extends _mastra_core_workflows.Workflow {
171
257
  temporalClient;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Run","toWorkflowType","RequestContext","WorkflowFailedError","CancelledFailure","Workflow"],"sources":["../src/run.ts","../src/workflow.ts"],"sourcesContent":["import { RequestContext } from '@mastra/core/di';\nimport { Run } from '@mastra/core/workflows';\nimport type { Step, StepResult, WorkflowResult, WorkflowRunStartOptions } from '@mastra/core/workflows';\nimport { CancelledFailure, WorkflowFailedError } from '@temporalio/client';\nimport type { Client, WorkflowHandle } from '@temporalio/client';\nimport type { WorkflowExecutionResult } from './transforms/temporal-workflow-runtime';\nimport type { TemporalEngineType } from './types';\nimport { toWorkflowType } from './utils';\n\n// Builds Mastra step records from the Temporal result. Iterates `stepMeta` rather than `steps`\n// because a step that returned undefined has no key in `steps` once serialized. A result without\n// `stepMeta` came from a Worker that predates it, so `steps` stays empty instead of guessing times.\nfunction toStepResults(input: unknown, { steps, stepMeta }: WorkflowExecutionResult): Record<string, unknown> {\n if (!stepMeta) {\n return {};\n }\n\n const records: Record<string, unknown> = { input };\n for (const [stepId, times] of Object.entries(stepMeta)) {\n records[stepId] = { status: 'success', output: steps[stepId], ...times };\n }\n return records;\n}\n\ntype TemporalRunStartArgs<TState, TInput, TRequestContext> = {\n inputData?: TInput;\n initialState?: TState;\n requestContext?: RequestContext<TRequestContext>;\n} & WorkflowRunStartOptions;\n\nexport class TemporalRun<\n TSteps extends Step<string, any, any, any, any, any, TemporalEngineType, any>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TemporalEngineType\n >[],\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> extends Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext> {\n private readonly client: Client;\n private readonly taskQueue: string;\n\n constructor(\n params: ConstructorParameters<typeof Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>>[0],\n temporalParams: {\n client: Client;\n taskQueue: string;\n },\n ) {\n super(params);\n\n this.client = temporalParams.client;\n this.taskQueue = temporalParams.taskQueue;\n }\n\n async start(args: TemporalRunStartArgs<TState, TInput, TRequestContext> = {}) {\n const { input, initialState, requestContext } = await this.#prepareStart(args);\n\n let handle: WorkflowHandle;\n try {\n handle = await this.client.workflow.start(toWorkflowType(this.workflowId), {\n taskQueue: this.taskQueue,\n workflowId: this.runId,\n args: [\n {\n inputData: input,\n initialState,\n requestContext: Object.fromEntries(requestContext.entries()),\n runId: this.runId,\n resourceId: this.resourceId,\n outputOptions: args.outputOptions,\n tracingOptions: args.tracingOptions,\n perStep: args.perStep,\n recordStepMeta: true,\n validateInputs: this.validateInputs,\n },\n ],\n });\n } catch (error) {\n // Temporal did not start this run, for example because its id is already in use, so the\n // finish callbacks have no outcome to report.\n return this.#failedResult(error, input, initialState);\n }\n\n const result = await this.#settle(handle, input, initialState);\n await this.#invokeFinishCallbacks(result, input, requestContext);\n return result;\n }\n\n // Lifecycle hooks are closures that cannot run in the Temporal workflow sandbox, so they run\n // in the process that starts the run. onStart can change the state and request context, so\n // the caller sends both to Temporal only after it runs.\n async #prepareStart(args: TemporalRunStartArgs<TState, TInput, TRequestContext>) {\n const input = await this._validateInput(args.inputData);\n const initialState = (await this._validateInitialState(args.initialState)) ?? ({} as TState);\n await this._validateRequestContext(args.requestContext as RequestContext<unknown> | undefined);\n\n const requestContext = (args.requestContext ?? new RequestContext()) as RequestContext;\n await this.executionEngine.invokeStartCallback({\n runId: this.runId,\n workflowId: this.workflowId,\n resourceId: this.resourceId,\n getInitData: () => input,\n requestContext,\n state: initialState as Record<string, any>,\n });\n\n return { input, initialState, requestContext };\n }\n\n async #settle(\n handle: WorkflowHandle,\n input: TInput | undefined,\n initialState: TState | undefined,\n ): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n try {\n const result = (await handle.result()) as WorkflowExecutionResult;\n\n return {\n status: 'success',\n input: input as TInput,\n result: result.result as TOutput,\n state: initialState,\n steps: toStepResults(input, result),\n } as WorkflowResult<TState, TInput, TOutput, TSteps>;\n } catch (error) {\n // Core reports a canceled run as `canceled` and does not call onError for it.\n if (error instanceof WorkflowFailedError && error.cause instanceof CancelledFailure) {\n return { status: 'canceled', input, state: initialState, steps: {} } as unknown as WorkflowResult<\n TState,\n TInput,\n TOutput,\n TSteps\n >;\n }\n\n return this.#failedResult(error, input, initialState);\n }\n }\n\n #failedResult(error: unknown, input: TInput | undefined, initialState: TState | undefined) {\n return {\n status: 'failed',\n input: input as TInput,\n error: error instanceof Error ? error : new Error(String(error)),\n state: initialState,\n steps: {},\n } as WorkflowResult<TState, TInput, TOutput, TSteps>;\n }\n\n #invokeFinishCallbacks(\n result: WorkflowResult<TState, TInput, TOutput, TSteps>,\n input: TInput | undefined,\n requestContext: RequestContext,\n ) {\n return this.executionEngine.invokeLifecycleCallbacks({\n status: result.status,\n result: result.status === 'success' ? result.result : undefined,\n error: result.status === 'failed' ? result.error : undefined,\n steps: result.steps as Record<string, StepResult<any, any, any, any>>,\n runId: this.runId,\n workflowId: this.workflowId,\n resourceId: this.resourceId,\n input,\n requestContext,\n state: (result.state ?? {}) as Record<string, any>,\n });\n }\n\n async cancel() {\n await this.client.workflow.getHandle(this.runId).cancel();\n await super.cancel();\n }\n\n private unsupported(method: string): never {\n throw new Error(`@mastra/temporal does not support ${method}() yet. Use start() or startAsync() instead.`);\n }\n\n override stream(\n ..._args: Parameters<Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>['stream']>\n ): never {\n return this.unsupported('stream');\n }\n\n override streamLegacy(\n ..._args: Parameters<Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>['streamLegacy']>\n ): never {\n return this.unsupported('streamLegacy');\n }\n\n override resumeStream(..._args: unknown[]): never {\n return this.unsupported('resumeStream');\n }\n\n override resume(..._args: unknown[]): never {\n return this.unsupported('resume');\n }\n\n override resumeAsync(..._args: unknown[]): never {\n return this.unsupported('resumeAsync');\n }\n\n override restart(\n ..._args: Parameters<Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>['restart']>\n ): never {\n return this.unsupported('restart');\n }\n\n override timeTravel(..._args: unknown[]): never {\n return this.unsupported('timeTravel');\n }\n\n override timeTravelStream(..._args: unknown[]): never {\n return this.unsupported('timeTravelStream');\n }\n\n async startAsync(args: TemporalRunStartArgs<TState, TInput, TRequestContext> = {}) {\n const { input, initialState, requestContext } = await this.#prepareStart(args);\n const { onFinish, onError } = this.executionEngine.options;\n const hasFinishCallbacks = Boolean(onFinish || onError);\n\n const handle = await this.client.workflow.start(toWorkflowType(this.workflowId), {\n taskQueue: this.taskQueue,\n workflowId: this.runId,\n args: [\n {\n inputData: input,\n initialState,\n requestContext: Object.fromEntries(requestContext.entries()),\n runId: this.runId,\n resourceId: this.resourceId,\n outputOptions: args.outputOptions,\n tracingOptions: args.tracingOptions,\n perStep: args.perStep,\n ...(hasFinishCallbacks && { recordStepMeta: true }),\n validateInputs: this.validateInputs,\n },\n ],\n });\n\n // Best-effort, as with core startAsync(): the callbacks are lost if this process exits\n // before the workflow finishes (#24587).\n if (hasFinishCallbacks) {\n void this.#settle(handle, input, initialState).then(result =>\n this.#invokeFinishCallbacks(result, input, requestContext),\n );\n }\n\n return { runId: this.runId };\n }\n}\n","import { Workflow, createStep } from '@mastra/core/workflows';\nimport type { Step, WorkflowConfig } from '@mastra/core/workflows';\nimport type { Client } from '@temporalio/client';\nimport type { ActivityOptions } from '@temporalio/workflow';\nimport { TemporalRun } from './run';\nimport type { TemporalEngineType } from './types';\n\nexport type TemporalWorkflowParams = {\n client: Client;\n taskQueue: string;\n startToCloseTimeout?: string;\n retry?: ActivityOptions['retry'];\n};\n\nexport class TemporalWorkflow<\n TSteps extends Step<string, any, any, any, any, any, TemporalEngineType, any>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TemporalEngineType\n >[],\n TWorkflowId extends string = string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TPrevSchema = TInput,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> extends Workflow<TemporalEngineType, TSteps, TWorkflowId, TState, TInput, TOutput, TPrevSchema, TRequestContext> {\n private readonly temporalClient: Client;\n readonly taskQueue: string;\n readonly startToCloseTimeout: string;\n\n constructor(\n params: WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps, TRequestContext>,\n temporalParams: TemporalWorkflowParams,\n ) {\n super(params);\n\n this.engineType = 'temporal';\n this.temporalClient = temporalParams.client;\n this.taskQueue = temporalParams.taskQueue;\n this.startToCloseTimeout = temporalParams.startToCloseTimeout ?? '1 minute';\n }\n\n async createRun(options?: { runId?: string; resourceId?: string; disableScorers?: boolean }) {\n const runId = options?.runId ?? crypto.randomUUID();\n const run = new TemporalRun<TSteps, TState, TInput, TOutput, TRequestContext>(\n {\n workflowId: this.id,\n runId,\n resourceId: options?.resourceId,\n stateSchema: this.stateSchema,\n inputSchema: this.inputSchema,\n requestContextSchema: this.requestContextSchema,\n executionEngine: this.executionEngine,\n executionGraph: this.executionGraph,\n mastra: this.mastra,\n retryConfig: this.retryConfig,\n serializedStepGraph: this.serializedStepGraph,\n disableScorers: options?.disableScorers,\n tracingPolicy: this.options.tracingPolicy,\n workflowSteps: this.steps,\n validateInputs: this.options.validateInputs,\n workflowEngineType: this.engineType,\n cleanup: undefined,\n },\n {\n client: this.temporalClient,\n taskQueue: this.taskQueue,\n },\n );\n\n this.runs.set(runId, run);\n return run;\n }\n}\n\nexport function createWorkflow<\n TSteps extends Step<string, any, any, any, any, any, TemporalEngineType, any>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TemporalEngineType\n >[],\n TWorkflowId extends string = string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TRequestContext extends Record<string, any> | unknown = unknown,\n>(\n config: WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps, TRequestContext>,\n temporal: TemporalWorkflowParams,\n) {\n return new TemporalWorkflow<TSteps, TWorkflowId, TState, TInput, TOutput, TInput, TRequestContext>(config, temporal);\n}\n\nexport function init(temporalParams: TemporalWorkflowParams) {\n return {\n createWorkflow: <\n TWorkflowId extends string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TSteps extends Step[] = Step[],\n TRequestContext extends Record<string, any> | unknown = unknown,\n >(\n config: WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps, TRequestContext>,\n ) => createWorkflow<TSteps, TWorkflowId, TState, TInput, TOutput, TRequestContext>(config, temporalParams),\n createStep,\n };\n}\n"],"mappings":";;;;;;AAYA,SAAS,cAAc,OAAgB,EAAE,OAAO,YAA8D;CAC5G,IAAI,CAAC,UACH,OAAO,CAAC;CAGV,MAAM,UAAmC,EAAE,MAAM;CACjD,KAAK,MAAM,CAAC,QAAQ,UAAU,OAAO,QAAQ,QAAQ,GACnD,QAAQ,UAAU;EAAE,QAAQ;EAAW,QAAQ,MAAM;EAAS,GAAG;CAAM;CAEzE,OAAO;AACT;AAQA,IAAa,cAAb,cAcUA,uBAAAA,IAA0E;CAClF;CACA;CAEA,YACE,QACA,gBAIA;EACA,MAAM,MAAM;EAEZ,KAAK,SAAS,eAAe;EAC7B,KAAK,YAAY,eAAe;CAClC;CAEA,MAAM,MAAM,OAA8D,CAAC,GAAG;EAC5E,MAAM,EAAE,OAAO,cAAc,mBAAmB,MAAM,KAAK,cAAc,IAAI;EAE7E,IAAI;EACJ,IAAI;GACF,SAAS,MAAM,KAAK,OAAO,SAAS,MAAMC,cAAAA,eAAe,KAAK,UAAU,GAAG;IACzE,WAAW,KAAK;IAChB,YAAY,KAAK;IACjB,MAAM,CACJ;KACE,WAAW;KACX;KACA,gBAAgB,OAAO,YAAY,eAAe,QAAQ,CAAC;KAC3D,OAAO,KAAK;KACZ,YAAY,KAAK;KACjB,eAAe,KAAK;KACpB,gBAAgB,KAAK;KACrB,SAAS,KAAK;KACd,gBAAgB;KAChB,gBAAgB,KAAK;IACvB,CACF;GACF,CAAC;EACH,SAAS,OAAO;GAGd,OAAO,KAAK,cAAc,OAAO,OAAO,YAAY;EACtD;EAEA,MAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,OAAO,YAAY;EAC7D,MAAM,KAAK,uBAAuB,QAAQ,OAAO,cAAc;EAC/D,OAAO;CACT;CAKA,MAAM,cAAc,MAA6D;EAC/E,MAAM,QAAQ,MAAM,KAAK,eAAe,KAAK,SAAS;EACtD,MAAM,eAAgB,MAAM,KAAK,sBAAsB,KAAK,YAAY,KAAO,CAAC;EAChF,MAAM,KAAK,wBAAwB,KAAK,cAAqD;EAE7F,MAAM,iBAAkB,KAAK,kBAAkB,IAAIC,gBAAAA,eAAe;EAClE,MAAM,KAAK,gBAAgB,oBAAoB;GAC7C,OAAO,KAAK;GACZ,YAAY,KAAK;GACjB,YAAY,KAAK;GACjB,mBAAmB;GACnB;GACA,OAAO;EACT,CAAC;EAED,OAAO;GAAE;GAAO;GAAc;EAAe;CAC/C;CAEA,MAAM,QACJ,QACA,OACA,cAC0D;EAC1D,IAAI;GACF,MAAM,SAAU,MAAM,OAAO,OAAO;GAEpC,OAAO;IACL,QAAQ;IACD;IACP,QAAQ,OAAO;IACf,OAAO;IACP,OAAO,cAAc,OAAO,MAAM;GACpC;EACF,SAAS,OAAO;GAEd,IAAI,iBAAiBC,mBAAAA,uBAAuB,MAAM,iBAAiBC,mBAAAA,kBACjE,OAAO;IAAE,QAAQ;IAAY;IAAO,OAAO;IAAc,OAAO,CAAC;GAAE;GAQrE,OAAO,KAAK,cAAc,OAAO,OAAO,YAAY;EACtD;CACF;CAEA,cAAc,OAAgB,OAA2B,cAAkC;EACzF,OAAO;GACL,QAAQ;GACD;GACP,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GAC/D,OAAO;GACP,OAAO,CAAC;EACV;CACF;CAEA,uBACE,QACA,OACA,gBACA;EACA,OAAO,KAAK,gBAAgB,yBAAyB;GACnD,QAAQ,OAAO;GACf,QAAQ,OAAO,WAAW,YAAY,OAAO,SAAS,KAAA;GACtD,OAAO,OAAO,WAAW,WAAW,OAAO,QAAQ,KAAA;GACnD,OAAO,OAAO;GACd,OAAO,KAAK;GACZ,YAAY,KAAK;GACjB,YAAY,KAAK;GACjB;GACA;GACA,OAAQ,OAAO,SAAS,CAAC;EAC3B,CAAC;CACH;CAEA,MAAM,SAAS;EACb,MAAM,KAAK,OAAO,SAAS,UAAU,KAAK,KAAK,CAAC,CAAC,OAAO;EACxD,MAAM,MAAM,OAAO;CACrB;CAEA,YAAoB,QAAuB;EACzC,MAAM,IAAI,MAAM,qCAAqC,OAAO,6CAA6C;CAC3G;CAEA,OACE,GAAG,OACI;EACP,OAAO,KAAK,YAAY,QAAQ;CAClC;CAEA,aACE,GAAG,OACI;EACP,OAAO,KAAK,YAAY,cAAc;CACxC;CAEA,aAAsB,GAAG,OAAyB;EAChD,OAAO,KAAK,YAAY,cAAc;CACxC;CAEA,OAAgB,GAAG,OAAyB;EAC1C,OAAO,KAAK,YAAY,QAAQ;CAClC;CAEA,YAAqB,GAAG,OAAyB;EAC/C,OAAO,KAAK,YAAY,aAAa;CACvC;CAEA,QACE,GAAG,OACI;EACP,OAAO,KAAK,YAAY,SAAS;CACnC;CAEA,WAAoB,GAAG,OAAyB;EAC9C,OAAO,KAAK,YAAY,YAAY;CACtC;CAEA,iBAA0B,GAAG,OAAyB;EACpD,OAAO,KAAK,YAAY,kBAAkB;CAC5C;CAEA,MAAM,WAAW,OAA8D,CAAC,GAAG;EACjF,MAAM,EAAE,OAAO,cAAc,mBAAmB,MAAM,KAAK,cAAc,IAAI;EAC7E,MAAM,EAAE,UAAU,YAAY,KAAK,gBAAgB;EACnD,MAAM,qBAAqB,QAAQ,YAAY,OAAO;EAEtD,MAAM,SAAS,MAAM,KAAK,OAAO,SAAS,MAAMH,cAAAA,eAAe,KAAK,UAAU,GAAG;GAC/E,WAAW,KAAK;GAChB,YAAY,KAAK;GACjB,MAAM,CACJ;IACE,WAAW;IACX;IACA,gBAAgB,OAAO,YAAY,eAAe,QAAQ,CAAC;IAC3D,OAAO,KAAK;IACZ,YAAY,KAAK;IACjB,eAAe,KAAK;IACpB,gBAAgB,KAAK;IACrB,SAAS,KAAK;IACd,GAAI,sBAAsB,EAAE,gBAAgB,KAAK;IACjD,gBAAgB,KAAK;GACvB,CACF;EACF,CAAC;EAID,IAAI,oBACF,KAAU,QAAQ,QAAQ,OAAO,YAAY,CAAC,CAAC,MAAK,WAClD,KAAK,uBAAuB,QAAQ,OAAO,cAAc,CAC3D;EAGF,OAAO,EAAE,OAAO,KAAK,MAAM;CAC7B;AACF;;AClPA,IAAa,mBAAb,cAgBUI,uBAAAA,SAAyG;CACjH;CACA;CACA;CAEA,YACE,QACA,gBACA;EACA,MAAM,MAAM;EAEZ,KAAK,aAAa;EAClB,KAAK,iBAAiB,eAAe;EACrC,KAAK,YAAY,eAAe;EAChC,KAAK,sBAAsB,eAAe,uBAAuB;CACnE;CAEA,MAAM,UAAU,SAA6E;EAC3F,MAAM,QAAQ,SAAS,SAAS,OAAO,WAAW;EAClD,MAAM,MAAM,IAAI,YACd;GACE,YAAY,KAAK;GACjB;GACA,YAAY,SAAS;GACrB,aAAa,KAAK;GAClB,aAAa,KAAK;GAClB,sBAAsB,KAAK;GAC3B,iBAAiB,KAAK;GACtB,gBAAgB,KAAK;GACrB,QAAQ,KAAK;GACb,aAAa,KAAK;GAClB,qBAAqB,KAAK;GAC1B,gBAAgB,SAAS;GACzB,eAAe,KAAK,QAAQ;GAC5B,eAAe,KAAK;GACpB,gBAAgB,KAAK,QAAQ;GAC7B,oBAAoB,KAAK;GACzB,SAAS,KAAA;EACX,GACA;GACE,QAAQ,KAAK;GACb,WAAW,KAAK;EAClB,CACF;EAEA,KAAK,KAAK,IAAI,OAAO,GAAG;EACxB,OAAO;CACT;AACF;AAEA,SAAgB,eAgBd,QACA,UACA;CACA,OAAO,IAAI,iBAAwF,QAAQ,QAAQ;AACrH;AAEA,SAAgB,KAAK,gBAAwC;CAC3D,OAAO;EACL,iBAQE,WACG,eAA8E,QAAQ,cAAc;EACzG,YAAA,uBAAA;CACF;AACF"}
1
+ {"version":3,"file":"index.cjs","names":["Run","RequestContext","WorkflowExecutionAlreadyStartedError","toWorkflowType","delay","WorkflowFailedError","CancelledFailure","Workflow"],"sources":["../src/run.ts","../src/workflow.ts"],"sourcesContent":["import { setTimeout as delay } from 'node:timers/promises';\nimport { RequestContext } from '@mastra/core/di';\nimport { Run } from '@mastra/core/workflows';\nimport type { Step, WorkflowResult, WorkflowRunStartOptions } from '@mastra/core/workflows';\nimport { CancelledFailure, WorkflowExecutionAlreadyStartedError, WorkflowFailedError } from '@temporalio/client';\nimport type { Client, WorkflowHandle } from '@temporalio/client';\nimport type { TemporalEngineType } from './types';\nimport { toWorkflowType } from './utils';\n\ntype TemporalRunStartArgs<TState, TInput, TRequestContext> = {\n inputData?: TInput;\n initialState?: TState;\n requestContext?: RequestContext<TRequestContext>;\n} & WorkflowRunStartOptions;\n\nexport class TemporalWorkflowStatusUnknownError extends Error {\n constructor(runId: string, cause: unknown, afterResumeSignal = false) {\n super(\n afterResumeSignal\n ? `Unable to determine Temporal workflow status for run \"${runId}\" after sending a resume signal. The signal may have been delivered; do not retry resume() blindly.`\n : `Unable to determine Temporal workflow status for run \"${runId}\".`,\n { cause },\n );\n this.name = 'TemporalWorkflowStatusUnknownError';\n }\n}\n\nexport class TemporalRun<\n TSteps extends Step<string, any, any, any, any, any, TemporalEngineType, any>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TemporalEngineType\n >[],\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> extends Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext> {\n private readonly client: Client;\n private readonly taskQueue: string;\n\n constructor(\n params: ConstructorParameters<typeof Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>>[0],\n temporalParams: {\n client: Client;\n taskQueue: string;\n },\n ) {\n super(params);\n\n this.client = temporalParams.client;\n this.taskQueue = temporalParams.taskQueue;\n }\n\n async start(args: TemporalRunStartArgs<TState, TInput, TRequestContext> = {}) {\n const input = await this._validateInput(args.inputData);\n const initialState = await this._validateInitialState(args.initialState);\n await this._validateRequestContext(args.requestContext as RequestContext<unknown> | undefined);\n const requestContext = (args.requestContext ?? new RequestContext()) as RequestContext;\n await this.invokeStartCallback(input, initialState, requestContext);\n\n let handle: WorkflowHandle;\n try {\n handle = await this.dispatch(args, input, initialState, requestContext);\n } catch (error) {\n const result = this.failedResult(input, initialState, error);\n if (!(error instanceof WorkflowExecutionAlreadyStartedError)) {\n await this.invokeLifecycleCallbacks(result, requestContext);\n }\n return result;\n }\n\n return this.awaitResultOrSuspended(handle, input, initialState, requestContext);\n }\n\n private dispatch(\n args: TemporalRunStartArgs<TState, TInput, TRequestContext>,\n input: unknown,\n initialState: unknown,\n requestContext: RequestContext,\n ): Promise<WorkflowHandle> {\n return this.client.workflow.start(toWorkflowType(this.workflowId), {\n taskQueue: this.taskQueue,\n workflowId: this.runId,\n args: [\n {\n inputData: input,\n initialState,\n requestContext: Object.fromEntries(requestContext.entries()),\n runId: this.runId,\n resourceId: this.resourceId,\n outputOptions: args.outputOptions,\n tracingOptions: args.tracingOptions,\n perStep: args.perStep,\n validateInputs: this.validateInputs,\n },\n ],\n });\n }\n\n private async awaitResult(\n handle: WorkflowHandle,\n input: unknown,\n initialState: unknown,\n requestContext: RequestContext,\n ): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n const result = await this.resolveResult(handle, input, initialState);\n await this.invokeLifecycleCallbacks(result, requestContext);\n return result;\n }\n\n private async queryStatus(handle: WorkflowHandle, afterResumeSignal = false): Promise<unknown> {\n if (typeof handle.query !== 'function') {\n return undefined;\n }\n\n try {\n return await handle.query('mastra.status');\n } catch (error) {\n throw new TemporalWorkflowStatusUnknownError(this.runId, error, afterResumeSignal);\n }\n }\n\n private async awaitResultOrSuspended(\n handle: WorkflowHandle,\n input: unknown,\n initialState: unknown,\n requestContext: RequestContext,\n previousSuspension?: { stepId: string; suspendedAt?: number },\n afterResumeSignal = false,\n ): Promise<WorkflowResult<TState, TInput, TOutput, TSteps>> {\n const terminal = this.resolveResult(handle, input, initialState);\n\n while (true) {\n const result = await Promise.race([\n terminal.then(result => ({ type: 'terminal' as const, result })),\n delay(100).then(() => ({ type: 'poll' as const })),\n ]);\n\n if (result.type === 'terminal') {\n await this.invokeLifecycleCallbacks(result.result, requestContext);\n return result.result;\n }\n\n const status = await this.queryStatus(handle, afterResumeSignal);\n if (isSuspendedWorkflowResult(status)) {\n const previousStep = previousSuspension ? status.steps[previousSuspension.stepId] : undefined;\n const isPreviousSuspension =\n previousSuspension !== undefined &&\n isSuspendedStepResult(previousStep) &&\n previousStep.suspendedAt === previousSuspension.suspendedAt;\n if (isPreviousSuspension) {\n continue;\n }\n\n const suspended = {\n ...status,\n steps: normalizeStepResults(status.steps),\n } as WorkflowResult<TState, TInput, TOutput, TSteps>;\n await this.invokeLifecycleCallbacks(suspended, requestContext);\n return suspended;\n }\n }\n }\n\n private async resolveResult(handle: WorkflowHandle, input: unknown, initialState: unknown) {\n try {\n // The generated Temporal workflow returns the execution result ({ status, result, state, steps }).\n const output = (await handle.result()) as WorkflowResult<TState, TInput, TOutput, TSteps>;\n return {\n ...output,\n ...(input !== undefined && { input: input as TInput }),\n steps: normalizeStepResults(output.steps),\n } as WorkflowResult<TState, TInput, TOutput, TSteps>;\n } catch (error) {\n if (error instanceof WorkflowFailedError && error.cause instanceof CancelledFailure) {\n return {\n status: 'canceled',\n input: input as TInput,\n state: initialState,\n steps: {},\n } as unknown as WorkflowResult<TState, TInput, TOutput, TSteps>;\n }\n\n return this.failedResult(input, initialState, error);\n }\n }\n\n private failedResult(input: unknown, initialState: unknown, error: unknown) {\n return {\n status: 'failed',\n input: input as TInput,\n error: error instanceof Error ? error : new Error(String(error)),\n state: initialState,\n steps: {},\n } as WorkflowResult<TState, TInput, TOutput, TSteps>;\n }\n\n // Lifecycle hooks are closures that cannot run inside the deterministic Temporal workflow\n // sandbox, so they run here in the process that started the run, using core hook semantics.\n private invokeStartCallback(input: unknown, initialState: unknown, requestContext: RequestContext) {\n return this.executionEngine.invokeStartCallback({\n runId: this.runId,\n workflowId: this.workflowId,\n resourceId: this.resourceId,\n getInitData: () => input,\n requestContext,\n state: (initialState ?? {}) as Record<string, any>,\n });\n }\n\n private invokeLifecycleCallbacks(\n result: WorkflowResult<TState, TInput, TOutput, TSteps>,\n requestContext: RequestContext,\n ) {\n return this.executionEngine.invokeLifecycleCallbacks({\n status: result.status,\n result: result.status === 'success' ? result.result : undefined,\n error: result.status === 'failed' ? result.error : undefined,\n steps: result.steps,\n runId: this.runId,\n workflowId: this.workflowId,\n resourceId: this.resourceId,\n input: result.input,\n requestContext,\n state: (result.state ?? {}) as Record<string, any>,\n });\n }\n\n private async resumePayload(params: {\n step?:\n | Step<string, any, any, any, any, any, TemporalEngineType, any>\n | Step<string, any, any, any, any, any, TemporalEngineType, any>[]\n | string\n | string[];\n label?: string;\n resumeData?: unknown;\n }) {\n const step = Array.isArray(params.step) ? params.step.at(-1) : params.step;\n const stepId = typeof step === 'string' ? step : step?.id;\n const resumeData = await this._validateResumeData(\n params.resumeData,\n stepId ? this.workflowSteps[stepId] : undefined,\n );\n\n return {\n ...(stepId !== undefined && { step: stepId }),\n ...(params.label !== undefined && { label: params.label }),\n resumeData,\n };\n }\n\n async cancel() {\n await this.client.workflow.getHandle(this.runId).cancel();\n await super.cancel();\n }\n\n private unsupported(method: string): never {\n throw new Error(`@mastra/temporal does not support ${method}() yet. Use start() or startAsync() instead.`);\n }\n\n override stream(\n ..._args: Parameters<Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>['stream']>\n ): never {\n return this.unsupported('stream');\n }\n\n override streamLegacy(\n ..._args: Parameters<Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>['streamLegacy']>\n ): never {\n return this.unsupported('streamLegacy');\n }\n\n override resumeStream(..._args: unknown[]): never {\n return this.unsupported('resumeStream');\n }\n\n override async resume<TResume>(params: {\n resumeData?: TResume;\n step?:\n | Step<string, any, any, any, TResume, any, TemporalEngineType, any>\n | [\n ...Step<string, any, any, any, any, any, TemporalEngineType, any>[],\n Step<string, any, any, any, TResume, any, TemporalEngineType, any>,\n ]\n | string\n | string[];\n label?: string;\n requestContext?: RequestContext<TRequestContext>;\n retryCount?: number;\n tracingOptions?: any;\n outputWriter?: any;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n forEachIndex?: number;\n perStep?: boolean;\n actor?: any;\n }) {\n await this._validateRequestContext(params.requestContext as RequestContext<unknown> | undefined);\n const requestContext = (params.requestContext ?? new RequestContext()) as RequestContext;\n const handle = this.client.workflow.getHandle(this.runId);\n const payload = await this.resumePayload(params);\n const status = await this.queryStatus(handle);\n const stepId = isSuspendedWorkflowResult(status)\n ? (payload.step ??\n (payload.label ? status.resumeLabels?.[payload.label]?.stepId : undefined) ??\n (status.suspended?.length === 1 && status.suspended[0]?.length === 1 ? status.suspended[0][0] : undefined))\n : undefined;\n const previousStep = stepId && isSuspendedWorkflowResult(status) ? status.steps[stepId] : undefined;\n const previousSuspension =\n stepId && isSuspendedStepResult(previousStep) ? { stepId, suspendedAt: previousStep.suspendedAt } : undefined;\n await handle.signal('mastra.resume', payload);\n return this.awaitResultOrSuspended(handle, undefined, undefined, requestContext, previousSuspension, true);\n }\n\n override async resumeAsync<TResume>(params: {\n resumeData?: TResume;\n step?:\n | Step<string, any, any, any, TResume, any, TemporalEngineType, any>\n | [\n ...Step<string, any, any, any, any, any, TemporalEngineType, any>[],\n Step<string, any, any, any, TResume, any, TemporalEngineType, any>,\n ]\n | string\n | string[];\n label?: string;\n requestContext?: RequestContext<TRequestContext>;\n retryCount?: number;\n tracingOptions?: any;\n outputWriter?: any;\n outputOptions?: {\n includeState?: boolean;\n includeResumeLabels?: boolean;\n };\n forEachIndex?: number;\n perStep?: boolean;\n actor?: any;\n }) {\n const handle = this.client.workflow.getHandle(this.runId);\n await handle.signal('mastra.resume', await this.resumePayload(params));\n return { runId: this.runId };\n }\n\n override restart(\n ..._args: Parameters<Run<TemporalEngineType, TSteps, TState, TInput, TOutput, TRequestContext>['restart']>\n ): never {\n return this.unsupported('restart');\n }\n\n override timeTravel(..._args: unknown[]): never {\n return this.unsupported('timeTravel');\n }\n\n override timeTravelStream(..._args: unknown[]): never {\n return this.unsupported('timeTravelStream');\n }\n\n async startAsync(args: TemporalRunStartArgs<TState, TInput, TRequestContext> = {}) {\n const input = await this._validateInput(args.inputData);\n const initialState = await this._validateInitialState(args.initialState);\n await this._validateRequestContext(args.requestContext as RequestContext<unknown> | undefined);\n const requestContext = (args.requestContext ?? new RequestContext()) as RequestContext;\n await this.invokeStartCallback(input, initialState, requestContext);\n\n let handle: WorkflowHandle;\n try {\n handle = await this.dispatch(args, input, initialState, requestContext);\n } catch (error) {\n if (!(error instanceof WorkflowExecutionAlreadyStartedError)) {\n await this.invokeLifecycleCallbacks(this.failedResult(input, initialState, error), requestContext);\n }\n throw error;\n }\n\n const { onFinish, onError } = this.executionEngine.options;\n if (onFinish || onError) {\n // Like core startAsync(), terminal hooks fire in the background from this process.\n // They are best-effort: if this process exits before the run ends, they do not fire.\n void this.awaitResult(handle, input, initialState, requestContext);\n }\n\n return { runId: this.runId };\n }\n}\n\nfunction isSuspendedWorkflowResult(value: unknown): value is {\n status: 'suspended';\n steps: Record<string, unknown>;\n suspended?: string[][];\n resumeLabels?: Record<string, { stepId: string }>;\n} {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { status?: unknown }).status === 'suspended' &&\n typeof (value as { steps?: unknown }).steps === 'object' &&\n (value as { steps?: unknown }).steps !== null\n );\n}\n\nfunction isSuspendedStepResult(value: unknown): value is { status: 'suspended'; suspendedAt?: number } {\n return typeof value === 'object' && value !== null && (value as { status?: unknown }).status === 'suspended';\n}\n\n// The worker only records successful steps; a failed run rejects handle.result() instead.\nfunction normalizeStepResult(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return { status: 'success', output: value, startedAt: 0, endedAt: 0 };\n }\n\n const record = value as Record<string, unknown>;\n if (record.__temporalStepResult === true && record.status === 'suspended' && typeof record.suspendedAt === 'number') {\n return {\n status: 'suspended',\n payload: record.payload,\n suspendPayload: record.suspendPayload,\n suspendedAt: record.suspendedAt,\n };\n }\n\n if (\n record.__temporalStepResult === true &&\n record.status === 'success' &&\n typeof record.startedAt === 'number' &&\n typeof record.endedAt === 'number'\n ) {\n return {\n status: 'success',\n payload: record.payload,\n output: record.output,\n ...(record.suspendPayload !== undefined && { suspendPayload: record.suspendPayload }),\n ...(record.resumeData !== undefined && { resumeData: record.resumeData }),\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n };\n }\n\n return { status: 'success', output: value, startedAt: 0, endedAt: 0 };\n}\n\n// Workers built before step results used the core StepResult shape return raw step outputs.\nfunction normalizeStepResults<T>(steps: T): T {\n if (!steps || typeof steps !== 'object') {\n return {} as T;\n }\n return Object.fromEntries(Object.entries(steps).map(([id, value]) => [id, normalizeStepResult(value)])) as T;\n}\n","import { Workflow, createStep } from '@mastra/core/workflows';\nimport type { Step, WorkflowConfig } from '@mastra/core/workflows';\nimport type { Client } from '@temporalio/client';\nimport type { ActivityOptions } from '@temporalio/workflow';\nimport { TemporalRun } from './run';\nimport type { TemporalEngineType } from './types';\n\nexport type TemporalWorkflowParams = {\n client: Client;\n taskQueue: string;\n startToCloseTimeout?: string;\n retry?: ActivityOptions['retry'];\n};\n\nexport class TemporalWorkflow<\n TSteps extends Step<string, any, any, any, any, any, TemporalEngineType, any>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TemporalEngineType\n >[],\n TWorkflowId extends string = string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TPrevSchema = TInput,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> extends Workflow<TemporalEngineType, TSteps, TWorkflowId, TState, TInput, TOutput, TPrevSchema, TRequestContext> {\n private readonly temporalClient: Client;\n readonly taskQueue: string;\n readonly startToCloseTimeout: string;\n\n constructor(\n params: WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps, TRequestContext>,\n temporalParams: TemporalWorkflowParams,\n ) {\n super(params);\n\n this.engineType = 'temporal';\n this.temporalClient = temporalParams.client;\n this.taskQueue = temporalParams.taskQueue;\n this.startToCloseTimeout = temporalParams.startToCloseTimeout ?? '1 minute';\n }\n\n async createRun(options?: { runId?: string; resourceId?: string; disableScorers?: boolean }) {\n const runId = options?.runId ?? crypto.randomUUID();\n const run = new TemporalRun<TSteps, TState, TInput, TOutput, TRequestContext>(\n {\n workflowId: this.id,\n runId,\n resourceId: options?.resourceId,\n stateSchema: this.stateSchema,\n inputSchema: this.inputSchema,\n requestContextSchema: this.requestContextSchema,\n executionEngine: this.executionEngine,\n executionGraph: this.executionGraph,\n mastra: this.mastra,\n retryConfig: this.retryConfig,\n serializedStepGraph: this.serializedStepGraph,\n disableScorers: options?.disableScorers,\n tracingPolicy: this.options.tracingPolicy,\n workflowSteps: this.steps,\n validateInputs: this.options.validateInputs,\n workflowEngineType: this.engineType,\n cleanup: undefined,\n },\n {\n client: this.temporalClient,\n taskQueue: this.taskQueue,\n },\n );\n\n this.runs.set(runId, run);\n return run;\n }\n}\n\nexport function createWorkflow<\n TSteps extends Step<string, any, any, any, any, any, TemporalEngineType, any>[] = Step<\n string,\n unknown,\n unknown,\n unknown,\n unknown,\n unknown,\n TemporalEngineType\n >[],\n TWorkflowId extends string = string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TRequestContext extends Record<string, any> | unknown = unknown,\n>(\n config: WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps, TRequestContext>,\n temporal: TemporalWorkflowParams,\n) {\n return new TemporalWorkflow<TSteps, TWorkflowId, TState, TInput, TOutput, TInput, TRequestContext>(config, temporal);\n}\n\nexport function init(temporalParams: TemporalWorkflowParams) {\n return {\n createWorkflow: <\n TWorkflowId extends string,\n TState = unknown,\n TInput = unknown,\n TOutput = unknown,\n TSteps extends Step[] = Step[],\n TRequestContext extends Record<string, any> | unknown = unknown,\n >(\n config: WorkflowConfig<TWorkflowId, TState, TInput, TOutput, TSteps, TRequestContext>,\n ) => createWorkflow<TSteps, TWorkflowId, TState, TInput, TOutput, TRequestContext>(config, temporalParams),\n createStep,\n };\n}\n"],"mappings":"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"}