@mastra/react 1.5.1-alpha.3 → 1.6.0-alpha.4

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.d.ts CHANGED
@@ -6,7 +6,6 @@ export { useMastraClient } from './mastra-client-context.js';
6
6
  export * from './lib/mastra-db/index.js';
7
7
  export type { TaskItem } from '@mastra/core/signals';
8
8
  export type { MastraDBMessage, MastraMessageContentV2, MastraMessagePart, MastraToolApproval, MastraToolInvocation, MastraToolInvocationPart, MessageSource, MemoryInfo, } from '@mastra/core/agent/message-list';
9
- export * from './ui/index.js';
10
9
  export * from './workflows/index.js';
11
10
  export * from './voice/index.js';
12
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,cAAc,iBAAiB,CAAC;AAChC,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,UAAU,GACX,MAAM,iCAAiC,CAAC;AACzC,cAAc,MAAM,CAAC;AACrB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,cAAc,iBAAiB,CAAC;AAChC,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,UAAU,GACX,MAAM,iCAAiC,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import { $ as useEntity, A as TooltipContentClass, B as ToolApprovalContent, C as CodeBlock, D as IconButtonClass, E as IconButton, F as EntryTitleClass, G as ToolApprovalTitleClass, H as ToolApprovalHeader, I as ToolApproval, J as EntityContent, K as Entity, L as ToolApprovalActions, M as Entry, N as EntryClass, O as Tooltip, P as EntryTitle, Q as EntityTriggerVariantClasses, R as ToolApprovalActionsClass, S as AgentIcon, T as CodeCopyButton, U as ToolApprovalHeaderClass, V as ToolApprovalContentClass, W as ToolApprovalTitle, X as EntityTrigger, Y as EntityContentClass, Z as EntityTriggerClass, _ as MessageUsageValueClass, a as MessageClass, b as WorkflowIcon, c as MessageList, d as MessageStreamingClass, et as Icon, f as MessageUsage, g as MessageUsageValue, h as MessageUsageEntryClass, i as MessageActionsClass, j as TooltipTrigger, k as TooltipContent, l as MessageListClass, m as MessageUsageEntry, n as Message, o as MessageContent, p as MessageUsageClass, q as EntityCaret, r as MessageActions, s as MessageContentClass, t as MessageFactory, tt as IconSizes, u as MessageStreaming, v as MessageUsages, w as CodeBlockClass, x as ToolsIcon, y as MessageUsagesClass, z as ToolApprovalClass } from "./ui-BQyoxYsH.js";
2
1
  import { MastraClient } from "@mastra/client-js";
3
2
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
4
3
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
@@ -267,39 +266,47 @@ const mergeBgTaskMetadata = (existing, mode, args, otherMetadata) => {
267
266
  * `mapWorkflowStreamChunkToWatchResult` from the previous accumulator.
268
267
  */
269
268
  const mapWorkflowStreamChunkToWatchResult = (prev, chunk) => {
269
+ const previous = prev ?? {
270
+ status: "running",
271
+ input: void 0,
272
+ steps: {}
273
+ };
270
274
  if (chunk.type === "workflow-start") return {
271
- input: prev?.input,
275
+ input: previous.input,
272
276
  status: "running",
273
- steps: prev?.steps || {}
277
+ steps: previous.steps
274
278
  };
275
279
  if (chunk.type === "workflow-canceled") return {
276
- ...prev,
280
+ ...previous,
277
281
  status: "canceled"
278
282
  };
283
+ if (chunk.type === "workflow-paused") return {
284
+ ...previous,
285
+ status: "paused"
286
+ };
279
287
  if (chunk.type === "workflow-finish") {
280
288
  const finalStatus = chunk.payload.workflowStatus;
281
- const prevSteps = prev?.steps ?? {};
282
- const lastStep = Object.values(prevSteps).pop();
289
+ const lastStep = Object.values(previous.steps).pop();
283
290
  return {
284
- ...prev,
291
+ ...previous,
285
292
  status: chunk.payload.workflowStatus,
286
293
  ...finalStatus === "success" && lastStep?.status === "success" ? { result: lastStep?.output } : finalStatus === "failed" && lastStep?.status === "failed" ? { error: lastStep?.error } : finalStatus === "tripwire" && chunk.payload.tripwire ? { tripwire: chunk.payload.tripwire } : {}
287
294
  };
288
295
  }
289
296
  const { stepCallId: _stepCallId, stepName: _stepName, ...newPayload } = chunk.payload ?? {};
290
297
  const newSteps = {
291
- ...prev?.steps,
298
+ ...previous.steps,
292
299
  [chunk.payload.id]: {
293
- ...prev?.steps?.[chunk.payload.id],
300
+ ...previous.steps[chunk.payload.id],
294
301
  ...newPayload
295
302
  }
296
303
  };
297
304
  if (chunk.type === "workflow-step-start") return {
298
- ...prev,
305
+ ...previous,
299
306
  steps: newSteps
300
307
  };
301
308
  if (chunk.type === "workflow-step-suspended") {
302
- const suspendedStepIds = Object.entries(newSteps).flatMap(([stepId, stepResult]) => {
309
+ const suspended = Object.entries(newSteps).flatMap(([stepId, stepResult]) => {
303
310
  if (stepResult?.status === "suspended") {
304
311
  const nestedPath = stepResult?.suspendPayload?.__workflow_meta?.path;
305
312
  return nestedPath ? [[stepId, ...nestedPath]] : [[stepId]];
@@ -307,24 +314,24 @@ const mapWorkflowStreamChunkToWatchResult = (prev, chunk) => {
307
314
  return [];
308
315
  });
309
316
  return {
310
- ...prev,
317
+ ...previous,
311
318
  status: "suspended",
312
319
  steps: newSteps,
313
320
  suspendPayload: chunk.payload.suspendPayload,
314
- suspended: suspendedStepIds
321
+ suspended
315
322
  };
316
323
  }
317
324
  if (chunk.type === "workflow-step-waiting") return {
318
- ...prev,
325
+ ...previous,
319
326
  status: "waiting",
320
327
  steps: newSteps
321
328
  };
322
329
  if (chunk.type === "workflow-step-progress") return {
323
- ...prev,
330
+ ...previous,
324
331
  steps: {
325
- ...prev?.steps,
332
+ ...previous.steps,
326
333
  [chunk.payload.id]: {
327
- ...prev?.steps?.[chunk.payload.id],
334
+ ...previous.steps[chunk.payload.id],
328
335
  foreachProgress: {
329
336
  completedCount: chunk.payload.completedCount,
330
337
  totalCount: chunk.payload.totalCount,
@@ -336,10 +343,10 @@ const mapWorkflowStreamChunkToWatchResult = (prev, chunk) => {
336
343
  }
337
344
  };
338
345
  if (chunk.type === "workflow-step-result") return {
339
- ...prev,
346
+ ...previous,
340
347
  steps: newSteps
341
348
  };
342
- return prev;
349
+ return previous;
343
350
  };
344
351
  const signalContentsToUserMessages = (contents, metadata) => {
345
352
  const makeUserMessage = (parts) => ({
@@ -916,7 +923,7 @@ const accumulateChunk = ({ chunk, conversation, metadata }) => {
916
923
  const { toolName, toolCallId, args } = toolPart.toolInvocation;
917
924
  const payloadOutput = chunk.type === "background-task-output" ? chunk.payload.payload.payload.output : chunk.payload.output;
918
925
  if (payloadOutput?.type?.startsWith("workflow-")) {
919
- const existingWorkflowState = toolPart.toolInvocation.result || {};
926
+ const existingWorkflowState = toolPart.toolInvocation.result;
920
927
  const updated = mapWorkflowStreamChunkToWatchResult(existingWorkflowState, payloadOutput);
921
928
  parts[toolPartIndex] = {
922
929
  ...toolPart,
@@ -1146,8 +1153,7 @@ const accumulateChunk = ({ chunk, conversation, metadata }) => {
1146
1153
  case "network-validation-start":
1147
1154
  case "network-validation-end":
1148
1155
  case "network-object":
1149
- case "network-object-result":
1150
- case "tool-output-denied": return result;
1156
+ case "network-object-result": return result;
1151
1157
  default: return assertExhaustive(chunk, result);
1152
1158
  }
1153
1159
  };
@@ -2816,275 +2822,133 @@ function useMutation(mutationFn) {
2816
2822
  }
2817
2823
  //#endregion
2818
2824
  //#region src/workflows/use-stream-workflow.ts
2819
- /**
2820
- * Hook for streaming workflow execution with support for observing, resuming, and time-travel.
2821
- *
2822
- * @example
2823
- * ```tsx
2824
- * const {
2825
- * streamWorkflow,
2826
- * streamResult,
2827
- * isStreaming,
2828
- * observeWorkflowStream,
2829
- * closeStreamsAndReset,
2830
- * resumeWorkflowStream,
2831
- * timeTravelWorkflowStream,
2832
- * } = useStreamWorkflow({
2833
- * debugMode: true,
2834
- * tracingOptions: { enabled: true },
2835
- * onError: (error, defaultMessage) => console.error(defaultMessage, error),
2836
- * });
2837
- *
2838
- * // Start streaming a workflow
2839
- * await streamWorkflow.mutateAsync({
2840
- * workflowId: 'my-workflow',
2841
- * runId: 'run-123',
2842
- * inputData: { key: 'value' },
2843
- * requestContext: {},
2844
- * });
2845
- * ```
2846
- */
2847
2825
  function useStreamWorkflow({ debugMode, tracingOptions, onError }) {
2848
2826
  const client = useMastraClient();
2849
- const [streamResult, setStreamResult] = useState({});
2827
+ const [streamResult, setStreamResult] = useState();
2850
2828
  const [isStreaming, setIsStreaming] = useState(false);
2851
- const readerRef = useRef(null);
2852
- const observerRef = useRef(null);
2853
- const resumeStreamRef = useRef(null);
2854
- const timeTravelStreamRef = useRef(null);
2829
+ const activeStream = useRef(void 0);
2855
2830
  const isMountedRef = useRef(true);
2831
+ const closeActiveStream = useCallback(() => {
2832
+ const operation = activeStream.current;
2833
+ activeStream.current = void 0;
2834
+ if (!operation) return;
2835
+ operation.controller.abort();
2836
+ operation.reader?.cancel().catch(() => void 0);
2837
+ operation.reader?.releaseLock();
2838
+ operation.reader = void 0;
2839
+ }, []);
2856
2840
  useEffect(() => {
2857
2841
  isMountedRef.current = true;
2858
2842
  return () => {
2859
2843
  isMountedRef.current = false;
2860
- if (readerRef.current) {
2861
- try {
2862
- readerRef.current.releaseLock();
2863
- } catch {}
2864
- readerRef.current = null;
2865
- }
2866
- if (observerRef.current) {
2867
- try {
2868
- observerRef.current.releaseLock();
2869
- } catch {}
2870
- observerRef.current = null;
2871
- }
2872
- if (resumeStreamRef.current) {
2873
- try {
2874
- resumeStreamRef.current.releaseLock();
2875
- } catch {}
2876
- resumeStreamRef.current = null;
2877
- }
2878
- if (timeTravelStreamRef.current) {
2879
- try {
2880
- timeTravelStreamRef.current.releaseLock();
2881
- } catch {}
2882
- timeTravelStreamRef.current = null;
2883
- }
2844
+ closeActiveStream();
2884
2845
  };
2885
- }, []);
2886
- const handleStreamError = useCallback((err, defaultMessage, setStreamingState) => {
2887
- if (err instanceof TypeError) return;
2888
- const error = err instanceof Error ? err : new Error(defaultMessage);
2889
- onError?.(error, defaultMessage);
2890
- setStreamingState?.(false);
2891
- }, [onError]);
2892
- const handleWorkflowFinish = useCallback((value) => {
2893
- if (value.type === "workflow-finish") {
2894
- const streamStatus = value.payload?.workflowStatus;
2895
- const metadata = value.payload?.metadata;
2896
- setStreamResult((prev) => ({
2897
- ...prev,
2898
- status: streamStatus
2899
- }));
2900
- if (streamStatus === "failed") throw new Error(metadata?.errorMessage || "Workflow execution failed");
2901
- }
2902
- }, []);
2903
- const streamWorkflow = useMutation(async ({ workflowId, runId, inputData, initialState, requestContext: playgroundRequestContext, perStep }) => {
2904
- if (readerRef.current) readerRef.current.releaseLock();
2846
+ }, [closeActiveStream]);
2847
+ async function consumeStream(openStream, defaultMessage) {
2905
2848
  if (!isMountedRef.current) return;
2849
+ closeActiveStream();
2850
+ const operation = { controller: new AbortController() };
2851
+ activeStream.current = operation;
2852
+ const { signal } = operation.controller;
2906
2853
  setIsStreaming(true);
2907
- setStreamResult({ input: inputData });
2908
- const stream = await (await client.getWorkflow(workflowId).createRun({ runId })).stream({
2909
- inputData,
2910
- initialState,
2911
- requestContext: playgroundRequestContext,
2912
- closeOnSuspend: true,
2913
- tracingOptions,
2914
- perStep: perStep ?? debugMode
2915
- });
2916
- if (!stream) return handleStreamError(/* @__PURE__ */ new Error("No stream returned"), "No stream returned", setIsStreaming);
2917
- const reader = stream.getReader();
2918
- readerRef.current = reader;
2919
2854
  try {
2920
- while (true) {
2921
- if (!isMountedRef.current) break;
2855
+ const stream = await openStream(signal);
2856
+ if (signal.aborted) {
2857
+ await stream?.cancel();
2858
+ return;
2859
+ }
2860
+ if (!stream) {
2861
+ onError?.(/* @__PURE__ */ new Error("No stream returned"), "No stream returned");
2862
+ return;
2863
+ }
2864
+ const reader = stream.getReader();
2865
+ operation.reader = reader;
2866
+ while (!signal.aborted) {
2922
2867
  const { done, value } = await reader.read();
2923
- if (done) break;
2924
- if (isMountedRef.current) {
2925
- setStreamResult((prev) => {
2926
- return mapWorkflowStreamChunkToWatchResult(prev, value);
2927
- });
2928
- if (value.type === "workflow-step-start") setIsStreaming(true);
2929
- if (value.type === "workflow-step-suspended") setIsStreaming(false);
2930
- if (value.type === "workflow-finish") handleWorkflowFinish(value);
2931
- }
2868
+ if (done || signal.aborted) break;
2869
+ setStreamResult((previous) => mapWorkflowStreamChunkToWatchResult(previous, value));
2870
+ if (value.type === "workflow-step-start") setIsStreaming(true);
2871
+ if (value.type === "workflow-step-suspended") setIsStreaming(false);
2872
+ if (value.type === "workflow-finish" && value.payload.workflowStatus === "failed") throw new Error(value.payload.metadata?.errorMessage || "Workflow execution failed");
2873
+ }
2874
+ } catch (error) {
2875
+ if (!signal.aborted) {
2876
+ if (!operation.reader) throw error;
2877
+ onError?.(error instanceof Error ? error : new Error(defaultMessage), defaultMessage);
2932
2878
  }
2933
- } catch (err) {
2934
- handleStreamError(err, "Error streaming workflow");
2935
2879
  } finally {
2936
- if (isMountedRef.current) setIsStreaming(false);
2937
- if (readerRef.current) {
2938
- readerRef.current.releaseLock();
2939
- readerRef.current = null;
2880
+ operation.reader?.releaseLock();
2881
+ operation.reader = void 0;
2882
+ if (activeStream.current === operation) {
2883
+ activeStream.current = void 0;
2884
+ setIsStreaming(false);
2940
2885
  }
2941
2886
  }
2887
+ }
2888
+ const streamWorkflow = useMutation(({ workflowId, runId, inputData, initialState, requestContext, perStep }) => {
2889
+ setStreamResult({
2890
+ status: "pending",
2891
+ input: inputData,
2892
+ steps: {}
2893
+ });
2894
+ return consumeStream(async (signal) => {
2895
+ const run = await client.getWorkflow(workflowId).createRun({ runId });
2896
+ if (signal.aborted) return;
2897
+ return run.stream({
2898
+ inputData,
2899
+ initialState,
2900
+ requestContext,
2901
+ closeOnSuspend: true,
2902
+ tracingOptions,
2903
+ perStep: perStep ?? debugMode
2904
+ });
2905
+ }, "Error streaming workflow");
2942
2906
  });
2943
2907
  const observeWorkflowStream = useMutation(async ({ workflowId, runId, storeRunResult }) => {
2944
- if (observerRef.current) observerRef.current.releaseLock();
2945
2908
  if (!isMountedRef.current) return;
2946
- setIsStreaming(true);
2947
- setStreamResult(storeRunResult || {});
2909
+ setStreamResult(storeRunResult ?? void 0);
2948
2910
  if (storeRunResult?.status === "suspended") {
2911
+ closeActiveStream();
2949
2912
  setIsStreaming(false);
2950
2913
  return;
2951
2914
  }
2952
- const stream = await (await client.getWorkflow(workflowId).createRun({ runId })).observeStream();
2953
- if (!stream) return handleStreamError(/* @__PURE__ */ new Error("No stream returned"), "No stream returned", setIsStreaming);
2954
- const reader = stream.getReader();
2955
- observerRef.current = reader;
2956
- try {
2957
- while (true) {
2958
- if (!isMountedRef.current) break;
2959
- const { done, value } = await reader.read();
2960
- if (done) break;
2961
- if (isMountedRef.current) {
2962
- setStreamResult((prev) => {
2963
- return mapWorkflowStreamChunkToWatchResult(prev, value);
2964
- });
2965
- if (value.type === "workflow-step-start") setIsStreaming(true);
2966
- if (value.type === "workflow-step-suspended") setIsStreaming(false);
2967
- if (value.type === "workflow-finish") handleWorkflowFinish(value);
2968
- }
2969
- }
2970
- } catch (err) {
2971
- handleStreamError(err, "Error observing workflow");
2972
- } finally {
2973
- if (isMountedRef.current) setIsStreaming(false);
2974
- if (observerRef.current) {
2975
- observerRef.current.releaseLock();
2976
- observerRef.current = null;
2977
- }
2978
- }
2915
+ await consumeStream(async (signal) => {
2916
+ const run = await client.getWorkflow(workflowId).createRun({ runId });
2917
+ if (signal.aborted) return;
2918
+ return run.observeStream();
2919
+ }, "Error observing workflow");
2979
2920
  });
2980
- const resumeWorkflowStream = useMutation(async ({ workflowId, runId, step, resumeData, requestContext: playgroundRequestContext, perStep }) => {
2981
- if (resumeStreamRef.current) resumeStreamRef.current.releaseLock();
2982
- if (!isMountedRef.current) return;
2983
- setIsStreaming(true);
2984
- const stream = await (await client.getWorkflow(workflowId).createRun({ runId })).resumeStream({
2921
+ const resumeWorkflowStream = useMutation(({ workflowId, runId, step, resumeData, requestContext, perStep }) => consumeStream(async (signal) => {
2922
+ const run = await client.getWorkflow(workflowId).createRun({ runId });
2923
+ if (signal.aborted) return;
2924
+ return run.resumeStream({
2985
2925
  step,
2986
2926
  resumeData,
2987
- requestContext: playgroundRequestContext,
2927
+ requestContext,
2988
2928
  tracingOptions,
2989
2929
  perStep: perStep ?? debugMode
2990
2930
  });
2991
- if (!stream) return handleStreamError(/* @__PURE__ */ new Error("No stream returned"), "No stream returned", setIsStreaming);
2992
- const reader = stream.getReader();
2993
- resumeStreamRef.current = reader;
2994
- try {
2995
- while (true) {
2996
- if (!isMountedRef.current) break;
2997
- const { done, value } = await reader.read();
2998
- if (done) break;
2999
- if (isMountedRef.current) {
3000
- setStreamResult((prev) => {
3001
- return mapWorkflowStreamChunkToWatchResult(prev, value);
3002
- });
3003
- if (value.type === "workflow-step-start") setIsStreaming(true);
3004
- if (value.type === "workflow-step-suspended") setIsStreaming(false);
3005
- if (value.type === "workflow-finish") handleWorkflowFinish(value);
3006
- }
3007
- }
3008
- } catch (err) {
3009
- handleStreamError(err, "Error resuming workflow stream");
3010
- } finally {
3011
- if (isMountedRef.current) setIsStreaming(false);
3012
- if (resumeStreamRef.current) {
3013
- resumeStreamRef.current.releaseLock();
3014
- resumeStreamRef.current = null;
3015
- }
3016
- }
3017
- });
3018
- const timeTravelWorkflowStream = useMutation(async ({ workflowId, requestContext: playgroundRequestContext, runId, perStep, ...params }) => {
3019
- if (timeTravelStreamRef.current) timeTravelStreamRef.current.releaseLock();
3020
- if (!isMountedRef.current) return;
3021
- setIsStreaming(true);
3022
- const stream = await (await client.getWorkflow(workflowId).createRun({ runId })).timeTravelStream({
2931
+ }, "Error resuming workflow stream"));
2932
+ const timeTravelWorkflowStream = useMutation(({ workflowId, requestContext, runId, perStep, ...params }) => consumeStream(async (signal) => {
2933
+ const run = await client.getWorkflow(workflowId).createRun({ runId });
2934
+ if (signal.aborted) return;
2935
+ return run.timeTravelStream({
3023
2936
  ...params,
3024
2937
  perStep: perStep ?? debugMode,
3025
- requestContext: playgroundRequestContext,
2938
+ requestContext,
3026
2939
  tracingOptions
3027
2940
  });
3028
- if (!stream) return handleStreamError(/* @__PURE__ */ new Error("No stream returned"), "No stream returned", setIsStreaming);
3029
- const reader = stream.getReader();
3030
- timeTravelStreamRef.current = reader;
3031
- try {
3032
- while (true) {
3033
- if (!isMountedRef.current) break;
3034
- const { done, value } = await reader.read();
3035
- if (done) break;
3036
- if (isMountedRef.current) {
3037
- setStreamResult((prev) => {
3038
- return mapWorkflowStreamChunkToWatchResult(prev, value);
3039
- });
3040
- if (value.type === "workflow-step-start") setIsStreaming(true);
3041
- if (value.type === "workflow-step-suspended") setIsStreaming(false);
3042
- if (value.type === "workflow-finish") handleWorkflowFinish(value);
3043
- }
3044
- }
3045
- } catch (err) {
3046
- handleStreamError(err, "Error time traveling workflow stream");
3047
- } finally {
3048
- if (isMountedRef.current) setIsStreaming(false);
3049
- if (timeTravelStreamRef.current) {
3050
- timeTravelStreamRef.current.releaseLock();
3051
- timeTravelStreamRef.current = null;
3052
- }
3053
- }
3054
- });
2941
+ }, "Error time traveling workflow stream"));
3055
2942
  return {
3056
2943
  streamWorkflow,
3057
2944
  streamResult,
3058
2945
  isStreaming,
3059
2946
  observeWorkflowStream,
3060
2947
  closeStreamsAndReset: useCallback(() => {
2948
+ closeActiveStream();
3061
2949
  setIsStreaming(false);
3062
- setStreamResult({});
3063
- if (readerRef.current) {
3064
- try {
3065
- readerRef.current.releaseLock();
3066
- } catch {}
3067
- readerRef.current = null;
3068
- }
3069
- if (observerRef.current) {
3070
- try {
3071
- observerRef.current.releaseLock();
3072
- } catch {}
3073
- observerRef.current = null;
3074
- }
3075
- if (resumeStreamRef.current) {
3076
- try {
3077
- resumeStreamRef.current.releaseLock();
3078
- } catch {}
3079
- resumeStreamRef.current = null;
3080
- }
3081
- if (timeTravelStreamRef.current) {
3082
- try {
3083
- timeTravelStreamRef.current.releaseLock();
3084
- } catch {}
3085
- timeTravelStreamRef.current = null;
3086
- }
3087
- }, []),
2950
+ setStreamResult(void 0);
2951
+ }, [closeActiveStream]),
3088
2952
  resumeWorkflowStream,
3089
2953
  timeTravelWorkflowStream
3090
2954
  };
@@ -3421,6 +3285,6 @@ const useMastraSpeechToText = ({ agent, language }) => {
3421
3285
  };
3422
3286
  };
3423
3287
  //#endregion
3424
- export { AgentIcon, CLIENT_MESSAGE_ID_KEY, CodeBlock, CodeBlockClass, CodeCopyButton, Entity, EntityCaret, EntityContent, EntityContentClass, EntityTrigger, EntityTriggerClass, EntityTriggerVariantClasses, Entry, EntryClass, EntryTitle, EntryTitleClass, Icon, IconButton, IconButtonClass, IconSizes, MastraReactProvider, Message, MessageActions, MessageActionsClass, MessageClass, MessageContent, MessageContentClass, MessageFactory, MessageList, MessageListClass, MessageStreaming, MessageStreamingClass, MessageUsage, MessageUsageClass, MessageUsageEntry, MessageUsageEntryClass, MessageUsageValue, MessageUsageValueClass, MessageUsages, MessageUsagesClass, ToolApproval, ToolApprovalActions, ToolApprovalActionsClass, ToolApprovalClass, ToolApprovalContent, ToolApprovalContentClass, ToolApprovalHeader, ToolApprovalHeaderClass, ToolApprovalTitle, ToolApprovalTitleClass, ToolsIcon, Tooltip, TooltipContent, TooltipContentClass, TooltipTrigger, WorkflowIcon, WorkflowStepFactory, accumulateChunk, accumulateNetworkChunk, finishStreamingAssistantMessage, fromCoreUserMessageToMastraDBMessage, fromCoreUserMessagesToMastraDBMessage, mapWorkflowStreamChunkToWatchResult, playStreamWithWebAudio, recordMicrophoneToFile, useCancelWorkflowRun, useChat, useCreateWorkflowRun, useEntity, useMastraClient, useSpeechRecognition, useStreamWorkflow };
3288
+ export { CLIENT_MESSAGE_ID_KEY, MastraReactProvider, WorkflowStepFactory, accumulateChunk, accumulateNetworkChunk, finishStreamingAssistantMessage, fromCoreUserMessageToMastraDBMessage, fromCoreUserMessagesToMastraDBMessage, mapWorkflowStreamChunkToWatchResult, playStreamWithWebAudio, recordMicrophoneToFile, useCancelWorkflowRun, useChat, useCreateWorkflowRun, useMastraClient, useSpeechRecognition, useStreamWorkflow };
3425
3289
 
3426
3290
  //# sourceMappingURL=index.js.map