@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/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';
@@ -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 isRecord = (value) => value !== null && typeof value === "object";
1783
+ var isRecord2 = (value) => value !== null && typeof value === "object";
1706
1784
  var runIdMetadataKeys = ["pendingToolApprovals", "requireApprovalMetadata", "suspendedTools"];
1707
- var isRunIdMetadataSource = (value) => isRecord(value) && Object.values(value).every((entry) => isRecord(entry));
1785
+ var isRunIdMetadataSource = (value) => isRecord2(value) && Object.values(value).every((entry) => isRecord2(entry));
1708
1786
  var getRunIdMetadataSources = (metadata) => {
1709
- if (!isRecord(metadata)) return [];
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 (isRecord(entry) && typeof entry.runId === "string" && entry.runId.length > 0) {
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 isDataChunk2 = (chunk) => typeof chunk.type === "string" && chunk.type.startsWith("data-");
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
- if (chunk.type === "data-user-message" && isDataChunk2(chunk) && (chunk.data?.type === "user-message" || chunk.data?.type === "user") && typeof chunk.data?.id === "string") {
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) ?? fallback?.(part) ?? null;
3019
+ return renderers.StepStart?.(part) ?? null;
2934
3020
  case "tool-invocation":
2935
3021
  return renderers.ToolInvocation?.(part) ?? fallback?.(part) ?? null;
2936
3022
  case "source":