@mastra/react 1.1.2-alpha.5 → 1.2.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/agent/extract-tasks.d.ts +10 -0
- package/dist/agent/extract-tasks.d.ts.map +1 -0
- package/dist/agent/hooks.d.ts +7 -1
- package/dist/agent/hooks.d.ts.map +1 -1
- package/dist/index.cjs +94 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -8
- package/dist/index.js.map +1 -1
- package/dist/ui/MessageFactory/MessageFactory.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * from './agent/types.js';
|
|
|
4
4
|
export type { MastraClientCredentials, MastraClientProviderProps } from './mastra-client-context.js';
|
|
5
5
|
export { useMastraClient } from './mastra-client-context.js';
|
|
6
6
|
export * from './lib/mastra-db/index.js';
|
|
7
|
+
export type { TaskItem } from '@mastra/core/signals';
|
|
7
8
|
export type { MastraDBMessage, MastraMessageContentV2, MastraMessagePart, MastraToolApproval, MastraToolInvocation, MastraToolInvocationPart, MessageSource, MemoryInfo, } from '@mastra/core/agent/message-list';
|
|
8
9
|
export * from './ui/index.js';
|
|
9
10
|
export * from './workflows/index.js';
|
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,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,MAAM,CAAC;AACrB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1701,12 +1701,90 @@ var newUserMessage = (parts) => ({
|
|
|
1701
1701
|
var fromCoreUserMessageToMastraDBMessage = (coreUserMessage) => newUserMessage(coreUserMessageToParts(coreUserMessage));
|
|
1702
1702
|
var fromCoreUserMessagesToMastraDBMessage = (coreUserMessages) => newUserMessage(coreUserMessages.flatMap(coreUserMessageToParts));
|
|
1703
1703
|
|
|
1704
|
+
// src/agent/extract-tasks.ts
|
|
1705
|
+
var TASK_TOOL_NAMES = /* @__PURE__ */ new Set(["task_write", "task_update", "task_complete", "task_check"]);
|
|
1706
|
+
var TASK_SIGNAL_ID = "tasks";
|
|
1707
|
+
var TASK_TAG_NAMES = /* @__PURE__ */ new Set(["current-task-list", "task-list-update"]);
|
|
1708
|
+
var TASK_STATUSES = /* @__PURE__ */ new Set(["pending", "in_progress", "completed"]);
|
|
1709
|
+
var isDataChunk2 = (chunk) => typeof chunk.type === "string" && chunk.type.startsWith("data-");
|
|
1710
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1711
|
+
var isTaskStatus = (value) => typeof value === "string" && TASK_STATUSES.has(value);
|
|
1712
|
+
var isTaskItemArray = (value) => Array.isArray(value) && value.every(
|
|
1713
|
+
(item) => isRecord(item) && typeof item.id === "string" && typeof item.content === "string" && isTaskStatus(item.status) && typeof item.activeForm === "string"
|
|
1714
|
+
);
|
|
1715
|
+
var isTaskSignal = (value) => {
|
|
1716
|
+
if (!isRecord(value)) return false;
|
|
1717
|
+
return value.id === TASK_SIGNAL_ID || typeof value.tagName === "string" && TASK_TAG_NAMES.has(value.tagName);
|
|
1718
|
+
};
|
|
1719
|
+
var extractTasksFromSignalData = (data) => {
|
|
1720
|
+
if (!isTaskSignal(data) || !isRecord(data)) return void 0;
|
|
1721
|
+
const metadata = data.metadata;
|
|
1722
|
+
if (!isRecord(metadata)) return void 0;
|
|
1723
|
+
const value = metadata.value;
|
|
1724
|
+
if (!isRecord(value)) return void 0;
|
|
1725
|
+
return isTaskItemArray(value.tasks) ? value.tasks : void 0;
|
|
1726
|
+
};
|
|
1727
|
+
var parseTasksFromResult = (raw) => {
|
|
1728
|
+
if (isRecord(raw) && isTaskItemArray(raw.tasks)) return raw.tasks;
|
|
1729
|
+
if (typeof raw !== "string") return void 0;
|
|
1730
|
+
try {
|
|
1731
|
+
const parsed = JSON.parse(raw);
|
|
1732
|
+
return isRecord(parsed) && isTaskItemArray(parsed.tasks) ? parsed.tasks : void 0;
|
|
1733
|
+
} catch {
|
|
1734
|
+
return void 0;
|
|
1735
|
+
}
|
|
1736
|
+
};
|
|
1737
|
+
var extractTasksFromSignalChunk = (chunk) => {
|
|
1738
|
+
if (!isDataChunk2(chunk)) return void 0;
|
|
1739
|
+
return extractTasksFromSignalData(chunk.data);
|
|
1740
|
+
};
|
|
1741
|
+
var extractTasksFromToolResultChunk = (chunk) => {
|
|
1742
|
+
if (chunk.type !== "tool-result") return void 0;
|
|
1743
|
+
const payload = chunk.payload;
|
|
1744
|
+
if (!isRecord(payload) || typeof payload.toolName !== "string" || !TASK_TOOL_NAMES.has(payload.toolName)) {
|
|
1745
|
+
return void 0;
|
|
1746
|
+
}
|
|
1747
|
+
return parseTasksFromResult(payload.result);
|
|
1748
|
+
};
|
|
1749
|
+
var extractTasksFromToolInvocationPart = (part) => {
|
|
1750
|
+
if (!isRecord(part) || part.type !== "tool-invocation" || !isRecord(part.toolInvocation)) return void 0;
|
|
1751
|
+
const toolInvocation = part.toolInvocation;
|
|
1752
|
+
if (typeof toolInvocation.toolName !== "string" || !TASK_TOOL_NAMES.has(toolInvocation.toolName)) return void 0;
|
|
1753
|
+
return parseTasksFromResult(toolInvocation.result);
|
|
1754
|
+
};
|
|
1755
|
+
var extractTasksFromDataPart = (part) => {
|
|
1756
|
+
if (!isRecord(part) || typeof part.type !== "string" || !part.type.startsWith("data-")) return void 0;
|
|
1757
|
+
return extractTasksFromSignalData(part.data);
|
|
1758
|
+
};
|
|
1759
|
+
var extractTasksFromSignalMessage = (message) => {
|
|
1760
|
+
if (message.role !== "signal") return void 0;
|
|
1761
|
+
const metadata = message.content?.metadata;
|
|
1762
|
+
if (!isRecord(metadata)) return void 0;
|
|
1763
|
+
return extractTasksFromSignalData(metadata.signal);
|
|
1764
|
+
};
|
|
1765
|
+
var extractLatestTasksFromMessages = (messages) => {
|
|
1766
|
+
let latest;
|
|
1767
|
+
for (const message of messages) {
|
|
1768
|
+
for (const part of message.content?.parts ?? []) {
|
|
1769
|
+
const toolTasks = extractTasksFromToolInvocationPart(part);
|
|
1770
|
+
if (toolTasks !== void 0) latest = toolTasks;
|
|
1771
|
+
}
|
|
1772
|
+
const signalTasks = extractTasksFromSignalMessage(message);
|
|
1773
|
+
if (signalTasks !== void 0) latest = signalTasks;
|
|
1774
|
+
for (const part of message.content?.parts ?? []) {
|
|
1775
|
+
const dataTasks = extractTasksFromDataPart(part);
|
|
1776
|
+
if (dataTasks !== void 0) latest = dataTasks;
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
return latest ?? [];
|
|
1780
|
+
};
|
|
1781
|
+
|
|
1704
1782
|
// src/agent/extractRunIdFromMessages.ts
|
|
1705
|
-
var
|
|
1783
|
+
var isRecord2 = (value) => value !== null && typeof value === "object";
|
|
1706
1784
|
var runIdMetadataKeys = ["pendingToolApprovals", "requireApprovalMetadata", "suspendedTools"];
|
|
1707
|
-
var isRunIdMetadataSource = (value) =>
|
|
1785
|
+
var isRunIdMetadataSource = (value) => isRecord2(value) && Object.values(value).every((entry) => isRecord2(entry));
|
|
1708
1786
|
var getRunIdMetadataSources = (metadata) => {
|
|
1709
|
-
if (!
|
|
1787
|
+
if (!isRecord2(metadata)) return [];
|
|
1710
1788
|
const sources = [];
|
|
1711
1789
|
for (const key of runIdMetadataKeys) {
|
|
1712
1790
|
const source = metadata[key];
|
|
@@ -1720,7 +1798,7 @@ var extractRunIdFromMessages = (messages) => {
|
|
|
1720
1798
|
for (const message of messages) {
|
|
1721
1799
|
for (const source of getRunIdMetadataSources(message.content?.metadata)) {
|
|
1722
1800
|
for (const entry of Object.values(source)) {
|
|
1723
|
-
if (
|
|
1801
|
+
if (isRecord2(entry) && typeof entry.runId === "string" && entry.runId.length > 0) {
|
|
1724
1802
|
return entry.runId;
|
|
1725
1803
|
}
|
|
1726
1804
|
}
|
|
@@ -1825,7 +1903,7 @@ var isThreadSignalUnsupportedError = (error) => {
|
|
|
1825
1903
|
}
|
|
1826
1904
|
return status === 400 && typeof error.message === "string" && error.message.includes("No active agent run found for signal target");
|
|
1827
1905
|
};
|
|
1828
|
-
var
|
|
1906
|
+
var isDataChunk3 = (chunk) => typeof chunk.type === "string" && chunk.type.startsWith("data-");
|
|
1829
1907
|
var dbFromServerUiMessages = (uiMessages, metadata) => uiMessages.map((uiMsg) => {
|
|
1830
1908
|
const dbMsg = AIV5Adapter.fromUIMessage(uiMsg);
|
|
1831
1909
|
return {
|
|
@@ -1866,6 +1944,7 @@ var useChat = ({
|
|
|
1866
1944
|
const _threadSubscriptionPromiseRef = useRef(null);
|
|
1867
1945
|
const _threadSignalsUnsupportedRef = useRef(false);
|
|
1868
1946
|
const [messages, setMessages] = useState([]);
|
|
1947
|
+
const [tasks, setTasks] = useState([]);
|
|
1869
1948
|
const [toolCallApprovals, setToolCallApprovals] = useState({});
|
|
1870
1949
|
const [networkToolCallApprovals, setNetworkToolCallApprovals] = useState({});
|
|
1871
1950
|
const pendingToolApprovalIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
@@ -1875,6 +1954,7 @@ var useChat = ({
|
|
|
1875
1954
|
useEffect(() => {
|
|
1876
1955
|
const formattedMessages = resolveInitialMessages(initialMessages ?? []);
|
|
1877
1956
|
setMessages(formattedMessages);
|
|
1957
|
+
setTasks(extractLatestTasksFromMessages(formattedMessages));
|
|
1878
1958
|
pendingToolApprovalIdsRef.current = extractPendingToolApprovalIdsFromMessages(formattedMessages);
|
|
1879
1959
|
setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);
|
|
1880
1960
|
_currentRunId.current = extractRunIdFromMessages(formattedMessages);
|
|
@@ -1946,7 +2026,11 @@ var useChat = ({
|
|
|
1946
2026
|
const processStreamChunk = useCallback(
|
|
1947
2027
|
async (chunk, onChunk) => {
|
|
1948
2028
|
setMessages((prev) => accumulateChunk({ chunk, conversation: prev, metadata: { mode: "stream" } }));
|
|
1949
|
-
|
|
2029
|
+
const signalTasks = extractTasksFromSignalChunk(chunk);
|
|
2030
|
+
if (signalTasks !== void 0) setTasks(signalTasks);
|
|
2031
|
+
const toolTasks = extractTasksFromToolResultChunk(chunk);
|
|
2032
|
+
if (toolTasks !== void 0) setTasks(toolTasks);
|
|
2033
|
+
if (chunk.type === "data-user-message" && isDataChunk3(chunk) && (chunk.data?.type === "user-message" || chunk.data?.type === "user") && typeof chunk.data?.id === "string") {
|
|
1950
2034
|
onSignalEcho?.(chunk.data.id);
|
|
1951
2035
|
}
|
|
1952
2036
|
if (chunk.type === "start") {
|
|
@@ -2356,7 +2440,7 @@ var useChat = ({
|
|
|
2356
2440
|
_onNetworkChunk.current = void 0;
|
|
2357
2441
|
_requestContext.current = void 0;
|
|
2358
2442
|
};
|
|
2359
|
-
const approveToolCall = async (toolCallId) => {
|
|
2443
|
+
const approveToolCall = async (toolCallId, resumeData) => {
|
|
2360
2444
|
const onChunk = _onChunk.current;
|
|
2361
2445
|
const currentRunId = _currentRunId.current;
|
|
2362
2446
|
if (!currentRunId)
|
|
@@ -2371,6 +2455,7 @@ var useChat = ({
|
|
|
2371
2455
|
threadId,
|
|
2372
2456
|
toolCallId,
|
|
2373
2457
|
approved: true,
|
|
2458
|
+
...resumeData !== void 0 ? { resumeData } : {},
|
|
2374
2459
|
requestContext: _requestContext.current
|
|
2375
2460
|
});
|
|
2376
2461
|
pendingToolApprovalIdsRef.current.delete(toolCallId);
|
|
@@ -2570,6 +2655,7 @@ var useChat = ({
|
|
|
2570
2655
|
isRunning,
|
|
2571
2656
|
isAwaitingToolApproval,
|
|
2572
2657
|
messages,
|
|
2658
|
+
tasks,
|
|
2573
2659
|
approveToolCall,
|
|
2574
2660
|
declineToolCall,
|
|
2575
2661
|
approveToolCallGenerate,
|
|
@@ -2930,7 +3016,7 @@ var renderPart = (part, renderers, fallback) => {
|
|
|
2930
3016
|
case "file":
|
|
2931
3017
|
return renderers.File?.(part) ?? fallback?.(part) ?? null;
|
|
2932
3018
|
case "step-start":
|
|
2933
|
-
return renderers.StepStart?.(part) ??
|
|
3019
|
+
return renderers.StepStart?.(part) ?? null;
|
|
2934
3020
|
case "tool-invocation":
|
|
2935
3021
|
return renderers.ToolInvocation?.(part) ?? fallback?.(part) ?? null;
|
|
2936
3022
|
case "source":
|