@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.cjs +114 -305
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -251
- package/dist/index.js.map +1 -1
- package/dist/lib/mastra-db/accumulator.d.ts +1 -1
- package/dist/lib/mastra-db/accumulator.d.ts.map +1 -1
- package/dist/ui/index.cjs +575 -56
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.js +497 -1
- package/dist/ui/index.js.map +1 -0
- package/dist/workflows/use-stream-workflow.d.ts +1 -29
- package/dist/workflows/use-stream-workflow.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/ui-BQyoxYsH.js +0 -498
- package/dist/ui-BQyoxYsH.js.map +0 -1
- package/dist/ui-C979LXC_.cjs +0 -850
- package/dist/ui-C979LXC_.cjs.map +0 -1
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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:
|
|
275
|
+
input: previous.input,
|
|
272
276
|
status: "running",
|
|
273
|
-
steps:
|
|
277
|
+
steps: previous.steps
|
|
274
278
|
};
|
|
275
279
|
if (chunk.type === "workflow-canceled") return {
|
|
276
|
-
...
|
|
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
|
|
282
|
-
const lastStep = Object.values(prevSteps).pop();
|
|
289
|
+
const lastStep = Object.values(previous.steps).pop();
|
|
283
290
|
return {
|
|
284
|
-
...
|
|
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
|
-
...
|
|
298
|
+
...previous.steps,
|
|
292
299
|
[chunk.payload.id]: {
|
|
293
|
-
...
|
|
300
|
+
...previous.steps[chunk.payload.id],
|
|
294
301
|
...newPayload
|
|
295
302
|
}
|
|
296
303
|
};
|
|
297
304
|
if (chunk.type === "workflow-step-start") return {
|
|
298
|
-
...
|
|
305
|
+
...previous,
|
|
299
306
|
steps: newSteps
|
|
300
307
|
};
|
|
301
308
|
if (chunk.type === "workflow-step-suspended") {
|
|
302
|
-
const
|
|
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
|
-
...
|
|
317
|
+
...previous,
|
|
311
318
|
status: "suspended",
|
|
312
319
|
steps: newSteps,
|
|
313
320
|
suspendPayload: chunk.payload.suspendPayload,
|
|
314
|
-
suspended
|
|
321
|
+
suspended
|
|
315
322
|
};
|
|
316
323
|
}
|
|
317
324
|
if (chunk.type === "workflow-step-waiting") return {
|
|
318
|
-
...
|
|
325
|
+
...previous,
|
|
319
326
|
status: "waiting",
|
|
320
327
|
steps: newSteps
|
|
321
328
|
};
|
|
322
329
|
if (chunk.type === "workflow-step-progress") return {
|
|
323
|
-
...
|
|
330
|
+
...previous,
|
|
324
331
|
steps: {
|
|
325
|
-
...
|
|
332
|
+
...previous.steps,
|
|
326
333
|
[chunk.payload.id]: {
|
|
327
|
-
...
|
|
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
|
-
...
|
|
346
|
+
...previous,
|
|
340
347
|
steps: newSteps
|
|
341
348
|
};
|
|
342
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2921
|
-
|
|
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
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
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
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
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(
|
|
2981
|
-
|
|
2982
|
-
if (
|
|
2983
|
-
|
|
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
|
|
2927
|
+
requestContext,
|
|
2988
2928
|
tracingOptions,
|
|
2989
2929
|
perStep: perStep ?? debugMode
|
|
2990
2930
|
});
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
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
|
|
2938
|
+
requestContext,
|
|
3026
2939
|
tracingOptions
|
|
3027
2940
|
});
|
|
3028
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|